• ベストアンサー

ExcelのマクロをWSHから実行させると「型が一致しません」のエラーがでます。

WSHからExcel2000のマクロを実行させています。このマクロはセルの計算式の結果(セル(1,2))をif関数で比較するコードが入っています。 If Cells(1, 2).Value = "8月" Then hensu = 1 End If これをWSHから実行させると「型が一致しません」とエラーが出ます。 Debug.Print TypeName(Cells(1,2).Value)で型を表示させてみるとマクロを直接実行させたときはStringですが、WSHから実行させるとErrorとなっています。 なぜWSHから実行すると型がErrorとなるのかということと、解決策を教えていただければ幸いです。 ちなみにWSHでマクロを実行させている部分は以下のとおりです。 Set objExcelApp = CreateObject("Excel.Application") Set objWbk = objExcelApp.Workbooks.Open("ExcelBook.xls",True) objExcelApp.Run("ExcelBook.xls!macro1")

質問者が選んだベストアンサー

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.3

ANo1です。 > TisWookBook.WorkSheets(1).CellsではVBAマクロ内で「424:オブジェクトが必要です」 すいません。「TisWookBook」は「ThisWorkBook」の書き間違いです。 > Appkucation.Cellsでは変化ありませんでした うーん。でしたら、 Debug.Print TypeName(Application) Debug.Print TypeName(Application.Cells) とすると、どうなります? #ちなみにExcel2000でも試してみましたが・・・エラー発生しませんでした・・・

phy0
質問者

お礼

ありがとうございます。原因がわかりました。実は質問を簡略化するために書いていなかったのですが、計算式は外部サーバのデータベースにアクセスして計算結果を出すものだったのでデータのやり取りに数秒時間を要していました。WSHスクリプトのほうはEXCELを立ちあげたあとすぐマクロを実行させていたのでセルの値をErrorと判断したようです。以下のように待機時間を入れたらうまくいきました。 Set objWbk = objExcelApp.Workbooks.Open("ExcelBook.xls",True) WScript.Sleep(10000) objExcelApp.Run("ExcelBook.xls!macro1") お騒がせしました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

まず Set objExcelApp = CreateObject("Excel.Application") objExcelApp.visible=true Set objWbk = objExcelApp.Workbooks.Open("Book1.xls",True) If objExcelApp.activeworkbook.activesheet.Cells(1, 2).Value = "8月" Then hensu = 1 msgbox "aaa" End If 私の場合はブックはBook1でSheet1のB1に「8月」と入れました。 実行OKのようでmsgbox "aaa" が表示されました。 ーーー 次に Book1のModule1にTest03という名で下記を作りました Sub test03() If ActiveWorkbook.ActiveSheet.Cells(1, 2).Value = "8月" Then hensu = 1 MsgBox "aaa" End If VBSは下記に変えました。 Set objExcelApp = CreateObject("Excel.Application") objExcelApp.visible=true Set objWbk = objExcelApp.Workbooks.Open("Book1.xls",True) objExcelApp.Run("Book1.xls!Module1.test03") VBSを実行するとMsgBox "aaa"が表示されました。 ーー 少し自信ないですが ActiveWorkbook.ActiveSheetの辺のオブジェクトの特定が、記述上必要なのではないでしょうか。 エクセルの中からでは働く、規定値的なものが、外の世界では働かないとか。 Cellsは良く「Global・・」で、良くはじかれますので、エクセルVBAの 中の話ですが、極力Sh1.Cells()のように限定をつけています。 Set Sh1=WorrkSheets("Sheet1") Set Sh2=WorrkSheets("Sheet2")と 2つ以上定義したときなど。 これから連想したのですが。

phy0
質問者

お礼

ありがとうございます。No3のかたのお礼に書いたとおりです。お騒がせしました。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

ごめんなさい。現象を誤解していました。 #「マクロ内でエラー」なんですね・・・ 先ほどの投稿は忘れてください。 #ちなみに、Excel2002では再現しませんでした。 エラーメッセージ的には、「変数未定義」の時と同じなんですよね・・・ 「Application.Cells」と明記してみるとか・・・ 「TisWookBook.WorkSheets(1).Cells」としてみるとか・・・

phy0
質問者

補足

ありがとうございます。Appkucation.Cellsでは変化ありませんでした。TisWookBook.WorkSheets(1).CellsではVBAマクロ内で「424:オブジェクトが必要です」という新たなエラーが出てきました。これはどういうことでしょうか。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

オブジェクトを指定しないで「Cells」を使った場合、 ExcelVBA(Excelマクロ)上では「Application」で修飾され、 「Application.Cells」の省略として扱われますが、VBS上では特別扱いされず、 単なる「未定義の配列変数」とみなされます。 同等なコードは、 > If objExcelApp.Cells(1, 2).Value = "8月" Then と、なるでしょうね。 #他のExcelのキーワードも(もし使っているなら)同様の処置が必要です。 #また、Excelの定数を使っている場合、VBS内で明示的に(Constで)定義する必要があります。

関連するQ&A