- ベストアンサー
VBAから複数のバッチファイルを実行する際の処理順について
- VBAから複数のバッチファイルを実行する際に、1つの処理が終了するまで次の処理を待機させる方法について教えてください。
- Shell関数を使って複数のバッチを連続して実行するプログラムを書きたいのですが、前のバッチ処理が終了する前に次のバッチが実行されてしまいエラーになってしまいます。
- 具体的には、B列に「test_01.txt」「test_02.txt」... といったファイル名が入力されていて、隣のA列に何らかの文字/記号があった場合は、指定されたバッチ(ファイル名.bat)が実行されるということをやりたいと考えています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
確かに。。。andy_kunさんのおっしゃるように「"」の付け方が怪しかったですね。 バッチファイルまでのパスにスペースが無いならandy_kunさんの回答通りで。 ある(かもしれない)なら objWShell.Run """" & myPath & Cells(i, 2).Value & endPath & """", 1, True で。 ただ、私の場合 実行時エラー'91' オブジェクト変数または With ブロック変数が設定されていません。 じゃなくてオートメーションエラーになりましたが。。。
その他の回答 (3)
- andy_kun
- ベストアンサー率23% (64/274)
こうかな? objWShell.Run myPath & Cells(i, 2).Value & endPath, 1, True "は不要だと思うけど
- crossgate
- ベストアンサー率65% (78/119)
objWShell.Run "myPath & Cells(i, 2).Value & endPath", 1, True かな?
補足
早速のご回答ありがとうございます。 先程の補足で「.Run」抜けていることに気付き、ご指摘のようにしたのですが、 「実行時エラー'91' オブジェクト変数または With ブロック変数が設定されていません。」 となってしまいました。 どこがいけないのか、本当に途方に暮れています。。。 何かわかることがあれば、是非々々ご教示ください。
- yorozu_ya
- ベストアンサー率54% (76/140)
Shell関数は非同期ですので、 代わりに WScript.Shellオブジェクトの Runメソッドを使いましょう。
お礼
スミマセン。補足では「.Run」が抜けていました。 objWShell.Run "myPath & Cells(i, 2).Value & endPath", 1, True としたところ、「実行時エラー'91' オブジェクト変数または With ブロック変数が設定されていません。」となってしまいました。 謎です。。。
補足
ご回答ありがとうございます。 WScript.Shellというものがあるんですね。VBEのヘルプを見ても載っていませんでしたが、WEBで調べたら使い方が書いてありました。 そこで、プログラムを以下のように変更してみたのですが、実行すると「コンパイルエラー:Sub, Function, またはproperty が必要です。」となってしまいます。 どこがいけないのかご指摘いただけないでしょうか。 (正直に申し上げて、エラーの意味が分かりません) Sub バッチを実行() Dim objWShell Set objWShell = CreateObject("WScript.Shell") Dim i As Integer i = 7 'リストの開始行 Const myPath As String = "D:\test_path\" Const endPath As String = ".bat" For i = 7 To 200 '7行目から200行目まで実行 If Cells(i, 1).Value <> "" Then MsgBox (Cells(i, 2).Value & " をコンバートします。") objWShell "myPath & Cells(i, 2).Value & endPath", 1, True End If Next End Sub
お礼
マッチポンプですみません。 objWShell.Run myPath & Cells(i, 2).Value & endPath, 1, True の次に Workbooks("ブック名").Worksheets("シート名").Activate を挿入して、アクティブなブック(シート)をVBAを実行している方に戻したらOKでした。
補足
ありがとうございます! 教えていただいた方法でとりあえずエラーは回避できました。 しかし、処理がループにならずに 1 回で終了してしまいます。 そこで、WScript.Shellを1回ごとに初期化する必要があるのかと思い、以下の例のように「objWShell = null」や「Set objWShell = Nothing」などを挿入してみたのですが、動作に変化がありません。 実行したプログラムの終了コードを参照するのに別途何かコードがいるのでしょうか。 (それとも、バッチの内容が他のエクセルシートとサーバの通信に関するもので、処理に時間がかかるのが原因か??? ※なぜ、一旦バッチを経由してエクセルシートの処理をするのか…というのは聞かないでください。ちょっと、事情があるのです) Sub バッチを実行() Dim objWShell Set objWShell = CreateObject("WScript.Shell") Dim i As Integer i = 7 'リストの開始行 Const myPath As String = "D:\20101006_test\" Const endPath As String = ".bat" For i = 7 To 200 '7行目から200行目まで実行 If Cells(i, 1).Value <> "" Then MsgBox (Cells(i, 2).Value & " をコンバートします。") objWShell.Run myPath & Cells(i, 2).Value & endPath, 1, True End If Set objWShell = Nothing Next End Sub