VBからEXCELを操作しています。
VB上のリストから選択されたものを、既存のEXCELブックのセルに入力していく
のですが、オートメーションエラーとなってしまいます。
Dim xlsApp As Object
Dim xlsBook As Object
Dim xlsSheet As Object
Set xlsApp = GetObject(, "Excel.Application")' 既に起動しているExcelへの参照
Set xlsBook = xlsApp.ActiveWorkbook ' アクティブなブックを参照
Set xlsSheet = xlsBook.WorkSheets(1) ' Sheet1を参照
・・・
というような感じで処理しているのですが、
Set xlsBook = xlsApp.ActiveWorkbook
のところで、このようなエラーが出てしまいます。
既存のエクセルブックについては、この前段階の処理で起動させています。
しかし、適当な所(例えば1番初めとか)にブレークポイントを打って、
1行1行確認しながら処理させると、このエラーは出ません。
一体何が原因なのでしょうか?
VB6 Win2000 EXCEL2000にて処理しています。
よろしくお願い致します。
自己レスです。
Excelの起動の仕方を変えたら、オートメーションエラーが出なくなりました。
今までは、
Public Function ExecExcel(para As String) As Boolean
'=======================================================================
' Excel 起動
'=======================================================================
'【引数】
' para = シート名
'【戻り値】
' boolean = 処理結果
' TRUE = 正常
' FALSE = エラー
'【処理】
' ・Excel を起動する。
'=======================================================================
Dim exl As Variant
'** Excel 起動
On Local Error Resume Next
Set exl = CreateObject("Excel.Application")
Shell exl.Path & "\excel.exe " & para, 1
If Err <> 0 Then
ExecExcel = False
Else
ExecExcel = True
End If
On Local Error GoTo 0
End Function
として、
ExecExcel "D:\test.xls"
という風にして起動させていたのですが、
Set xlsApp = CreateObject("Excel.Application")
Set xlsBook = xlsApp.Workbooks.Open("D:\test.xls") xlsApp.Application.Visible = True
に変えたら出なくなりました。
私自身、よく理解出来ていないので、インターネットでいろいろ調べて
使えそうなソースをちょっと手直しして貼り付けているような状態ですので、
どこがいけなくてエラーが出ていたのかが分かりません。
どなたか原因を教えていただけませんでしょうか?
すいません。改行がちゃんとなされていませんでした。
Set xlsApp = CreateObject("Excel.Application")
Set xlsBook = xlsApp.Workbooks.Open("D:\test.xls")
xlsApp.Application.Visible = True
正しくはこうです。
推測ですが、ShellだとExcelの起動を待たずに次の処理に行くんじゃないですか?
>>Set exl = CreateObject("Excel.Application")
>>Shell exl.Path & "\excel.exe " & para, 1
これだと、オブジェクト生成と、
Shellでの起動は、それぞれ別々に動いてることになりますね。
>>xlsApp.Application.Visible = True
xlsApp.Visible = True
かも?
それと一番最初の GetObjectのは、既に起動しているExcelから
取得するもの。
次からのは新たに起動させるもので
やってることが違いますが、どちらをやりたいのでしょう?
皆様レスありがとうございます。
>nanashiさん
そうかも知れませんね!気が付きませんでした。
以前にShellを使った時にもそんな事があった事を思い出しました。
これから試してみようと思います。
>東京花子さん
いろいろご指摘ありがとうございます。
>それと一番最初の GetObjectのは、既に起動しているExcelから
>取得するもの。
>次からのは新たに起動させるもので
>やってることが違いますが、どちらをやりたいのでしょう?
あまりよく理解出来ていないもので、変な記述になってしまっているかも知れません。
始めの考え方は、Shellで既存のExcelファイルを起動させておいてGetObject
で取得しようと思ったのですが、上記のようにうまく処理出来なかったので、
CreateObjectでExcelを起動させた上で、ファイルをオープンさせ、それを
取得しようと思ったのです。
こういう処理はあまり良くないのでしょうか?
処理としてはとりあえず希望するように動くようにはなったのですが、
試行錯誤しながら作業していますので、間違いも多数あると思いますので、
ご指摘頂けると助かります。
>>CreateObjectでExcelを起動させた上で、ファイルをオープンさせ、それを
>>取得しようと思ったのです。
こっちが普通だと思いますよ。
ご指摘、ご指導どうもありがとうございました。
大変参考になりました。
ツイート | ![]() |