「インデックスが有効範囲にありません」のエラーについて

解決


魚武  2006-06-26 22:12:48  No: 132045

1 Private Sub Command1_Click()
2     Dim strConnect      As String   'Excelファイルのある場所
3     Dim wbXL            As Object   'Excelオブジェクト
4     Set wbXL = CreateObject("Excel.Application")
5     strConnect = "C:\VB\テスト\Book.xls"
6     wbXL.Workbooks(strConnect).Worksheets("Sheet1").Range("A1").Value = 10
7 End Sub

以上のプログラムを実行させると
「インデックスが有効範囲にありません。(Error 9)」
というエラーが6行目から発生します。

試しに6行目のプログラムを
wbXL.Workbooks(strConnect).Value = 10
に変換しても同じエラーが発生しました。
以上のことからWorkbooksのプログラムが正常に起動していないことに
なるのですが、4行目に設定したExcelのファイルは存在しているのに
このようなエラーが発生するのは
どこに原因があるのでしょうか?

回答よろしくお願いします。


魚武  2006-06-26 22:13:42  No: 132046

追伸

使用しているVBのバージョンは6.0
Excelは2003を使用しております。


特攻隊長まるるう  2006-06-26 22:19:47  No: 132047

>どこに原因があるのでしょうか?
Workbooks の使い方が間違っているから。
まずはエクセルのヘルプで[Workbooks コレクション]の説明を読みましょう。
以下抜粋。

>現在、開いているすべての Workbook オブジェクトのコレクションです。

>ファイルを開くには、Open メソッドを使用します。


魚武  2006-06-26 23:50:17  No: 132048

>Workbooks の使い方が間違っているから。
>まずはエクセルのヘルプで[Workbooks コレクション]の説明を読みましょう。
>以下抜粋。

>>現在、開いているすべての Workbook オブジェクトのコレクションです。

>>ファイルを開くには、Open メソッドを使用します。

ということは一度ファイルを開くようにプログラムで指示してから書き込みを
行うということでしょうか?
順番としては(ファイルを開く)⇒(書き込みを行う)⇒(ファイルを閉じる)
という順番でよろしいでしょうか?

後上のプログラムでは一応Excelファイルは認識しているようです。
(試しに5行目の保存先を適当な場所に変更したら「指定した場所にファイルは
存在しません」というエラーメッセージが表示されました)


魚武  2006-06-27 21:22:03  No: 132049

すみません・・・
書き込みした後で自分で調べたところ以下の方法で上手くプログラムが起動しました。

01 Private Sub Command1_Click()
02     Dim ExcelApp   As New Excel.Application  'エクセルを宣言する
03     Dim strConnect   As String   'Excelファイルのある場所
04     Dim wbXL           As Object   'Excelオブジェクト
05     strConnect = "C:\Book.xls" 
06     Set wbXL = CreateObject("Excel.Application")
07    wbXL.Application.Visible = False
08    wbXL.Application.Workbooks.Open FileName:=strConnect  '指定したファイルを開く
09    wbXL.Worksheets(1). Range("A1").Value = 10
10    wbXL.Workbooks(1).Close SaveChanges:=True
11    ExcelApp.Quit
12    Set ExcelApp = Nothing
13 End Sub

>特攻隊長まるるう 様
回答を頂き誠にありがとうございました。


Blue  2006-06-27 22:10:09  No: 132050

>  wbXL.Application.Workbooks.Open FileName:=strConnect  '指定したファイルを開く
の戻り値はワークブックオブジェクトです。
ですので、変数を用意して(Widthでもいいけど)

Dim wb As Object

Set wb = wbXL.Application.Workbooks.Open(FileName:=strConnect)
wb.Worksheets(1). Range("A1").Value = 10
wb.Close SaveChanges:=True

とかけます。

> wbXL.Worksheets(1). Range("A1").Value = 10
はきちんとWorkbookを指定したほうが良いでしょう。

> Dim ExcelApp   As New Excel.Application 'エクセルを宣言する
> ExcelApp.Quit
> Set ExcelApp = Nothing
この記述必要でしょうか?wbXL に対して Quitすればよいのでは?


LESIA  2006-06-27 22:29:49  No: 132051

解決したようですが、ちょっと気になる点を…

> 02     Dim ExcelApp   As New Excel.Application 'エクセルを宣言する
CreateObjectを使うなら、As Objectです。
逆に、As New Excel.Applicationを使うなら、CreateObjectは要りません。

> 06     Set wbXL = CreateObject("Excel.Application")
> 07    wbXL.Application.Visible = False
wbXLは、Exce;.ApplicationオブジェクトなのでApplicationは要りません。

> 08    wbXL.Application.Workbooks.Open FileName:=strConnect  '指定したファイルを開く
開いたBookは、Openメソッドの戻り値なので、それを取得するのが確実です。
ブック名はフルパスではなくファイル名のみになるので、Workbooks("Book.xls")でもできるんですけどね。

> 09    wbXL.Worksheets(1). Range("A1").Value = 10
WorksheetsはApplicationではなく、Bookから参照するようにしましょう。

01 Private Sub Command1_Click()
02     Dim ExcelApp   As Object 'エクセルを宣言する
03     Dim strConnect   As String   'Excelファイルのある場所
04     Dim wbXL           As Object   'Excelオブジェクト
04     Dim wbXL           As Object   'Excelオブジェクト
05     strConnect = "C:\Book.xls" 
06     Set ExcelApp = CreateObject("Excel.Application")
07    ExcelApp.Visible = False
08    Set wbXL = ExcelApp.Workbooks.Open(FileName:=strConnect)  '指定したファイルを開く
09    wbXL.Worksheets(1). Range("A1").Value = 10
10    wbXL.Close SaveChanges:=True
11    ExcelApp.Quit
12    Set ExcelApp = Nothing
13 End Sub


特攻隊長まるるう  2006-06-27 22:55:11  No: 132052

オブジェクトがごちゃごちゃになってるね。
# 再帰的に呼び出せてしまう Excel の作りも問題かもしれませんが。
>> 02     Dim ExcelApp   As New Excel.Application 'エクセルを宣言する
>CreateObjectを使うなら、As Objectです。
>逆に、As New Excel.Applicationを使うなら、CreateObjectは要りません。
つまりは、魚武さんのコードだと Excel.Application が2つ生成されてしまって
ます。

参照設定してあるみたいなので、お二方の指摘を考慮に入れつつ、Object 型の
変数を使わない方法だとこんな感じ。
[VB6.0]
Private Sub Command1_Click()
    Dim ExcelApp    As Excel.Application 'エクセルを宣言する
    Dim strConnect  As String           'Excelファイルのある場所
    Dim wb          As Excel.Workbook   'Excelブック
    strConnect = "C:\Book.xls"
    Set ExcelApp = New Excel.Application
    With ExcelApp
        .Visible = False
        Set wb = .Workbooks.Open(FileName:=strConnect) '指定したファイルを開く
    End With
    With wb
        .Worksheets(1).Range("A1").Value = 10
        .Close SaveChanges:=True
    End With
    ExcelApp.Quit
    Set ExcelApp = Nothing
End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加