- ベストアンサー
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")
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ANo1です。 > TisWookBook.WorkSheets(1).CellsではVBAマクロ内で「424:オブジェクトが必要です」 すいません。「TisWookBook」は「ThisWorkBook」の書き間違いです。 > Appkucation.Cellsでは変化ありませんでした うーん。でしたら、 Debug.Print TypeName(Application) Debug.Print TypeName(Application.Cells) とすると、どうなります? #ちなみにExcel2000でも試してみましたが・・・エラー発生しませんでした・・・
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
まず 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つ以上定義したときなど。 これから連想したのですが。
お礼
ありがとうございます。No3のかたのお礼に書いたとおりです。お騒がせしました。
- dsuekichi
- ベストアンサー率64% (171/265)
ごめんなさい。現象を誤解していました。 #「マクロ内でエラー」なんですね・・・ 先ほどの投稿は忘れてください。 #ちなみに、Excel2002では再現しませんでした。 エラーメッセージ的には、「変数未定義」の時と同じなんですよね・・・ 「Application.Cells」と明記してみるとか・・・ 「TisWookBook.WorkSheets(1).Cells」としてみるとか・・・
補足
ありがとうございます。Appkucation.Cellsでは変化ありませんでした。TisWookBook.WorkSheets(1).CellsではVBAマクロ内で「424:オブジェクトが必要です」という新たなエラーが出てきました。これはどういうことでしょうか。
- dsuekichi
- ベストアンサー率64% (171/265)
オブジェクトを指定しないで「Cells」を使った場合、 ExcelVBA(Excelマクロ)上では「Application」で修飾され、 「Application.Cells」の省略として扱われますが、VBS上では特別扱いされず、 単なる「未定義の配列変数」とみなされます。 同等なコードは、 > If objExcelApp.Cells(1, 2).Value = "8月" Then と、なるでしょうね。 #他のExcelのキーワードも(もし使っているなら)同様の処置が必要です。 #また、Excelの定数を使っている場合、VBS内で明示的に(Constで)定義する必要があります。
お礼
ありがとうございます。原因がわかりました。実は質問を簡略化するために書いていなかったのですが、計算式は外部サーバのデータベースにアクセスして計算結果を出すものだったのでデータのやり取りに数秒時間を要していました。WSHスクリプトのほうはEXCELを立ちあげたあとすぐマクロを実行させていたのでセルの値をErrorと判断したようです。以下のように待機時間を入れたらうまくいきました。 Set objWbk = objExcelApp.Workbooks.Open("ExcelBook.xls",True) WScript.Sleep(10000) objExcelApp.Run("ExcelBook.xls!macro1") お騒がせしました。