電子書籍の厳選無料作品が豊富!

VBAから複数のバッチファイルを実行する際に、1つの処理が終了するまで次の処理を待機させる方法について

こんにちは。VBA初心者です。

Shell関数を使って複数のバッチを連続して実行するプログラムを書きたいのですが、前のバッチ処理が終了する前に次のバッチが実行されてしまいエラーになってしまいます。

1つのバッチ処理が終了するまで、次の処理を待機させるようなことは可能でしょうか。

具体的には、B列に「test_01.txt」「test_02.txt」... といったファイル名が入力されていて、隣のA列に何らかの文字/記号があった場合は、指定されたバッチ(ファイル名.bat)が実行されるということをやりたいと考えています。

以下のようなプログラムを書いてみましたが、実行するバッチが複数になるとうまくいきせん。
どうしたら問題を回避できるか、ご教示いただけないでしょうか。
よろしくお願いします。

Sub バッチを実行()
i = 7 'リストの開始行
Const myPath As String = "D:\sample_batch\"
  Const endPath As String = ".bat"

 For i = 7 To 200 '7行目から200行目まで実行

If Cells(i, 1).Value <> "" Then
Shell (myPath & Cells(i, 2).Value & endPath)

End If
Next
End Sub

A 回答 (4件)

確かに。

。。andy_kunさんのおっしゃるように「"」の付け方が怪しかったですね。

バッチファイルまでのパスにスペースが無いならandy_kunさんの回答通りで。
ある(かもしれない)なら
 objWShell.Run """" & myPath & Cells(i, 2).Value & endPath & """", 1, True
で。

ただ、私の場合
 実行時エラー'91' オブジェクト変数または With ブロック変数が設定されていません。
じゃなくてオートメーションエラーになりましたが。。。

この回答への補足

ありがとうございます!

教えていただいた方法でとりあえずエラーは回避できました。

しかし、処理がループにならずに 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

補足日時:2010/10/07 18:14
    • good
    • 0
この回答へのお礼

マッチポンプですみません。

objWShell.Run myPath & Cells(i, 2).Value & endPath, 1, True

の次に

Workbooks("ブック名").Worksheets("シート名").Activate

を挿入して、アクティブなブック(シート)をVBAを実行している方に戻したらOKでした。

お礼日時:2010/10/07 19:11

こうかな?


objWShell.Run myPath & Cells(i, 2).Value & endPath, 1, True

"は不要だと思うけど
    • good
    • 0

objWShell.Run "myPath & Cells(i, 2).Value & endPath", 1, True


かな?

この回答への補足

早速のご回答ありがとうございます。

先程の補足で「.Run」抜けていることに気付き、ご指摘のようにしたのですが、

「実行時エラー'91' オブジェクト変数または With ブロック変数が設定されていません。」

となってしまいました。

どこがいけないのか、本当に途方に暮れています。。。
何かわかることがあれば、是非々々ご教示ください。

補足日時:2010/10/07 14:00
    • good
    • 0

Shell関数は非同期ですので、


代わりに WScript.Shellオブジェクトの Runメソッドを使いましょう。

この回答への補足

ご回答ありがとうございます。

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

補足日時:2010/10/07 12:30
    • good
    • 0
この回答へのお礼

スミマセン。補足では「.Run」が抜けていました。

objWShell.Run "myPath & Cells(i, 2).Value & endPath", 1, True

としたところ、「実行時エラー'91' オブジェクト変数または With ブロック変数が設定されていません。」となってしまいました。

謎です。。。

お礼日時:2010/10/07 12:48

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報