こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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")

投稿日時 - 2007-08-22 23:04:41

QNo.3278040

困ってます

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

ANo1です。

> TisWookBook.WorkSheets(1).CellsではVBAマクロ内で「424:オブジェクトが必要です」

すいません。「TisWookBook」は「ThisWorkBook」の書き間違いです。

> Appkucation.Cellsでは変化ありませんでした
うーん。でしたら、

Debug.Print TypeName(Application)
Debug.Print TypeName(Application.Cells)

とすると、どうなります?

#ちなみにExcel2000でも試してみましたが・・・エラー発生しませんでした・・・

投稿日時 - 2007-08-23 08:35:55

お礼

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

Set objWbk = objExcelApp.Workbooks.Open("ExcelBook.xls",True)
WScript.Sleep(10000)
objExcelApp.Run("ExcelBook.xls!macro1")

お騒がせしました。

投稿日時 - 2007-08-23 21:34:52

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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つ以上定義したときなど。
これから連想したのですが。

投稿日時 - 2007-08-23 10:32:16

お礼

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

投稿日時 - 2007-08-23 21:37:02

ANo.2

ごめんなさい。現象を誤解していました。
#「マクロ内でエラー」なんですね・・・

先ほどの投稿は忘れてください。

#ちなみに、Excel2002では再現しませんでした。

エラーメッセージ的には、「変数未定義」の時と同じなんですよね・・・

「Application.Cells」と明記してみるとか・・・
「TisWookBook.WorkSheets(1).Cells」としてみるとか・・・

投稿日時 - 2007-08-23 07:13:55

補足

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

投稿日時 - 2007-08-23 08:17:20

ANo.1

オブジェクトを指定しないで「Cells」を使った場合、
ExcelVBA(Excelマクロ)上では「Application」で修飾され、
「Application.Cells」の省略として扱われますが、VBS上では特別扱いされず、
単なる「未定義の配列変数」とみなされます。

同等なコードは、
> If objExcelApp.Cells(1, 2).Value = "8月" Then
と、なるでしょうね。

#他のExcelのキーワードも(もし使っているなら)同様の処置が必要です。
#また、Excelの定数を使っている場合、VBS内で明示的に(Constで)定義する必要があります。

投稿日時 - 2007-08-23 06:36:24

あなたにオススメの質問