プロが教える店舗&オフィスのセキュリティ対策術

以下のようにVBAコードを書いたらエラーは出ませんが、コマンドプロンプトが1瞬で消えて最後のメッセージが出力されてしまいます。コマンドプロンプトは処理が終了するまで全部表示させたいです。

それからできれば4つのバッチファイルが全て終了してから最後のメッセージを出したいです。
そのためにはどうすればいいか教えてほしいです。

どなたか詳しい方よろしくお願いします。



Sub バッチファイル複数実行()


'csvtest.bat, csvtest1, csvtest2, csvtest3 複数のバッチファイル
Dim batFileName, batFileName1, batFileName2, batFileName3 As String

'シェルオブジェクトの作成
Dim ShellObject As Object

batFileName = "C:\Users\Desktop\work\データ\csvtest.bat"
Set ShellObject = CreateObject("WScript.Shell")

'シェルの並列実行
ShellObject.Run batFileName, 1, True '1にするとコマンドプロンプトを通常表示 True だと同期(バッチファイルの処理が終了するまで止まる)




'ファイルの有無をチェック data1.csvからチェック
If Dir("C:\Users\Desktop\work\データ\data1.csv") <> "" Then


batFileName1 = "C:\Users\Desktop\work\データ\csvtest1.bat"
ShellObject.Run batFileName1, 1, True

Else

MsgBox "実行ファイルは1つです。"

End If


If Dir("C:\Users\Desktop\work\データ\data2.csv") <> "" Then

batFileName2 = "C:\Users\Desktop\work\データ\csvtest2.bat"
ShellObject.Run batFileName2, 1, True

Else

MsgBox "実行ファイルは2つです。"

End If


If Dir("C:\Users\Desktop\work\データ\data3.csv") <> "" Then

batFileName3 = "C:\Users\Desktop\work\データ\csvtest3.bat"
ShellObject.Run batFileName3, 1, True

Else

MsgBox "実行ファイルは3つです。"

End If





MsgBox "全て終了しました。", vbInformation




End Sub

A 回答 (2件)

<バッチが終了した後もプロンプトのウインドウを閉じずにおいておく方法>



>ShellObject.Run batFileName2 & pause, 1, True

このようにVBAのコードにpause を追加するのではなく、
バッチファイル(.bat)の中のコードの末尾に pause を挿入します。

保存してバッチファイルを実行すると、pause より上の処理が終わってから
「続行するには何かキーを押してください...」とプロンプトのウインドウに表示されます。

試しに、下の2行をメモ帳に貼り付けてtest.batなどと名前をつけて保存して実行してみてください。3秒間してから「続行するには...」が表示されます。
timeout /nobreak 3
pause

<複数のバッチファイルを同時に実行する方法>

いわゆる非同期処理です。

ShellObject.Run batFileName2, 1, False

複数のバッチファイルを同時に実行する場合は、最後のパラメーターはFalseにするか省略してください。Trueだと、VBAのプログラムは1つバッチを実行し、実行が終わったら次のバッチを実行し、というふうにバッチを順番にひとつずつ実行してしまいます。

<全てのバッチファイルの実行が終わったら知らせる>
非同期処理の場合、バッチファイルの実行が終わるより先にVBAのプログラムの方が終了してしまいます。また、バッチファイルに書かれてる処理を全て終わらせても、最後にpause で中断している限り、OSはそのプロセスは終了せずにずっと実行中だと判断するので、Win32APIを使ってプロセスやハンドルをポーリング(ループの一種。一定の時間間隔である状態を繰り返し確認すること)するという手も使えません。
    • good
    • 0
この回答へのお礼

ありがとうございます。pauseで止めることで、問題あるのは別のファイルだということが判明しました。

お礼日時:2020/11/24 12:18

平行処理じゃなくて、それ、シーケンス処理だよね。



・・・
バッチファイルの最後に
 pause
コマンドを追加して一時停止させてみてはいかがですか。
(開いているファイルはすべて閉じる処理をしておきましょう)
で、タイミングを見て最後にすべてのコマンドプロンプトウインドウを強制的に閉じる。
    • good
    • 0
この回答へのお礼

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

シーケンス処理というのが何かわかりませんが、4つ同時に実行したいです。
1つのバッチ処理に1時間くらいかかるので終わるのを待っていられない感じです。

それから以下のように4か所変更してみましたが、やはり1瞬で閉じてメッセージが出ました。
ShellObject.Run batFileName2 & pause, 1, True

お礼日時:2020/11/20 12:18

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

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


このQ&Aを見た人がよく見るQ&A