dポイントプレゼントキャンペーン実施中!

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

A 回答 (4件)

ANo1です。



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

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

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

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

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

#ちなみにExcel2000でも試してみましたが・・・エラー発生しませんでした・・・
    • good
    • 0
この回答へのお礼

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

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

お騒がせしました。

お礼日時:2007/08/23 21:34

まず


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つ以上定義したときなど。
これから連想したのですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/23 21:37

ごめんなさい。

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

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

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

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

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

この回答への補足

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

補足日時:2007/08/23 08:17
    • good
    • 0

オブジェクトを指定しないで「Cells」を使った場合、


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

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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!