オートメーションエラーを解決するには?

解決


レベル1  2003-11-07 22:44:36  No: 109790

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にて処理しています。

よろしくお願い致します。


レベル1  2003-11-11 03:36:53  No: 109791

自己レスです。
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

に変えたら出なくなりました。

私自身、よく理解出来ていないので、インターネットでいろいろ調べて
使えそうなソースをちょっと手直しして貼り付けているような状態ですので、
どこがいけなくてエラーが出ていたのかが分かりません。

どなたか原因を教えていただけませんでしょうか?


レベル1  2003-11-11 03:38:54  No: 109792

すいません。改行がちゃんとなされていませんでした。

Set xlsApp = CreateObject("Excel.Application") 
Set xlsBook = xlsApp.Workbooks.Open("D:\test.xls")
xlsApp.Application.Visible = True

正しくはこうです。


nanashi  2003-11-12 01:52:06  No: 109793

推測ですが、ShellだとExcelの起動を待たずに次の処理に行くんじゃないですか?


東京花子  2003-11-12 14:32:53  No: 109794

>>Set exl = CreateObject("Excel.Application")
>>Shell exl.Path & "\excel.exe " & para, 1
これだと、オブジェクト生成と、
Shellでの起動は、それぞれ別々に動いてることになりますね。

>>xlsApp.Application.Visible = True
xlsApp.Visible = True
かも?

それと一番最初の GetObjectのは、既に起動しているExcelから
取得するもの。
次からのは新たに起動させるもので
やってることが違いますが、どちらをやりたいのでしょう?


レベル1  2003-11-12 18:49:10  No: 109795

皆様レスありがとうございます。

>nanashiさん
そうかも知れませんね!気が付きませんでした。
以前にShellを使った時にもそんな事があった事を思い出しました。
これから試してみようと思います。

>東京花子さん
いろいろご指摘ありがとうございます。

>それと一番最初の GetObjectのは、既に起動しているExcelから
>取得するもの。
>次からのは新たに起動させるもので
>やってることが違いますが、どちらをやりたいのでしょう?
あまりよく理解出来ていないもので、変な記述になってしまっているかも知れません。

始めの考え方は、Shellで既存のExcelファイルを起動させておいてGetObject
で取得しようと思ったのですが、上記のようにうまく処理出来なかったので、
CreateObjectでExcelを起動させた上で、ファイルをオープンさせ、それを
取得しようと思ったのです。

こういう処理はあまり良くないのでしょうか?
処理としてはとりあえず希望するように動くようにはなったのですが、
試行錯誤しながら作業していますので、間違いも多数あると思いますので、
ご指摘頂けると助かります。


東京花子  2003-11-12 19:51:42  No: 109796

>>CreateObjectでExcelを起動させた上で、ファイルをオープンさせ、それを
>>取得しようと思ったのです。

こっちが普通だと思いますよ。


レベル1  2003-11-12 20:31:49  No: 109797

ご指摘、ご指導どうもありがとうございました。
大変参考になりました。


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

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






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