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のファイルは存在しているのに
このようなエラーが発生するのは
どこに原因があるのでしょうか?
回答よろしくお願いします。
追伸
使用しているVBのバージョンは6.0
Excelは2003を使用しております。
>どこに原因があるのでしょうか?
Workbooks の使い方が間違っているから。
まずはエクセルのヘルプで[Workbooks コレクション]の説明を読みましょう。
以下抜粋。
>現在、開いているすべての Workbook オブジェクトのコレクションです。
>ファイルを開くには、Open メソッドを使用します。
>Workbooks の使い方が間違っているから。
>まずはエクセルのヘルプで[Workbooks コレクション]の説明を読みましょう。
>以下抜粋。
>>現在、開いているすべての Workbook オブジェクトのコレクションです。
>>ファイルを開くには、Open メソッドを使用します。
ということは一度ファイルを開くようにプログラムで指示してから書き込みを
行うということでしょうか?
順番としては(ファイルを開く)⇒(書き込みを行う)⇒(ファイルを閉じる)
という順番でよろしいでしょうか?
後上のプログラムでは一応Excelファイルは認識しているようです。
(試しに5行目の保存先を適当な場所に変更したら「指定した場所にファイルは
存在しません」というエラーメッセージが表示されました)
すみません・・・
書き込みした後で自分で調べたところ以下の方法で上手くプログラムが起動しました。
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
>特攻隊長まるるう 様
回答を頂き誠にありがとうございました。
> 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すればよいのでは?
解決したようですが、ちょっと気になる点を…
> 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
オブジェクトがごちゃごちゃになってるね。
# 再帰的に呼び出せてしまう 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
ツイート | ![]() |