バッチファイルを実行するにはShell関数かWshShellクラスを使う
VBAからバッチファイル(*.bat)を実行するには、Shell関数かWshShellクラスを利用します。いずれも外部アプリケーションを実行するための仕組みです。
- Shell関数:非同期実行(bat完了を待たずに次へ進む)
- WshShellクラス:同期/非同期両対応(完了を待ってからVBAを再開できる)
以下ではバッチファイルを実行するサンプルを、非同期の場合と同期の場合それぞれ紹介します。
また、VBAからバッチファイルを実行する際の引数の渡し方も説明します。
VBAでバッチファイルを実行する方法の選び方
VBAからbatファイルを実行する場合、処理を「待つか/待たないか」で選択肢が変わります。
実行方法 | 関数/クラス | 特徴 |
---|---|---|
非同期実行 | Shell関数 | bat完了を待たずに次の処理を続行 |
同期実行 | WshShellクラス | bat完了までVBAが待機 |
引数付き実行 | 両方対応 | batファイル名+引数を半角スペースで指定 |
Shell関数
- 非同期実行専用(バッチ実行後を待たずに次の処理へ進む)
- 詳細は、「VBAで他のアプリケーションで起動する(Shell)」をご参照ください。
WshShellクラス
- 同期/非同期どちらにも対応
- 実行完了を待ってからVBAの処理を再開することも可能
- 詳細は、「VBAで他のアプリケーションを同期起動する(WshShell)」をご参照ください。
なお、バッチファイルではなくコマンドプロンプトを起動してコマンドを実行したい場合は「VBAでコマンドプロンプトの起動とコマンドの実行を行う」をご参照ください。
サンプルコードで使うバッチファイル
サンプルで使うバッチファイルは以下を利用します。ファイル名をtest.batとしています。
指定フォルダに移動して、新規フォルダを作成するコマンドです。
1 2 |
cd C:\web\test\ mkdir 2 |
【非同期】VBAからバッチファイルをShell関数で実行する方法
バッチファイル実行後の完了を待たずに次の処理へ進む場合(非同期の場合)は、Shell関数を使います。
1 2 3 4 5 6 7 8 9 |
Sub RunBatShell() Dim dProcessId As Double Dim sPath sPath = "C:\web\test\test.bat" '// バッチファイルを非同期で実行 dProcessId = Shell(sPath) End Sub |
Shell関数の戻り値はプロセスIDです。一応取得していますが、用途がなければ変数に代入しなくても構いません。
8行目のShell関数ではバッチファイルの実行だけを行い、結果を待たずに次の処理に移行します。
Shell関数の使い方や引数などの詳細は「VBAで他のアプリケーションで起動する(Shell)」をご参照ください。
【同期】VBAからバッチファイルをWshShellクラスで実行する方法
バッチファイルの処理が完了するまでVBAを待機させたい場合は、WshShellクラスを使います。
こちらは同期のサンプルです。WshShellクラスを利用します。WshShellクラスを利用するには参照設定が必要です。
WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
1 2 3 4 5 6 7 8 9 10 |
Sub RunBatWshShell() Dim obj As WshShell Dim sPath sPath = "C:\web\test\test.bat" Set obj = New WshShell Call obj.Run(sPath, WaitOnReturn:=True) End Sub |
その他、WshShellクラスの使い方や引数などの詳細は「VBAで他のアプリケーションを同期起動する(WshShell)」をご参照ください。
9行目の2番目の引数がTrueになると同期、Falseになると非同期になります。
【引数付き】VBAからバッチファイルに引数を渡す場合
以下のようなバッチファイルがあり、引数を2つ必要な場合があります。
バッチファイルのファイル名をここではtest2.batとします。
1 2 |
echo %1 echo %2 |
このような引数が必要なバッチファイルをVBAで起動する場合は、コマンドプロンプトから起動する場合と同様に、半角スペースを空けて引数を渡します。
ここではShell関数を使っていますが、WshShellクラスの場合も半角スペースで引数を区切る考え方は同じです。
半角スペースでバッチファイル名と引数の間に区切りがないと、引数もファイル名に含まれているとみなされ、ファイルが存在しない旨のエラーになります。
VBA側の例(Shell関数を利用)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub RunBatShell2() Dim dProcessId As Double Dim sPath Dim sParam1 Dim sParam2 sParam1 = "abc" sParam2 = "12345" sPath = "C:\web\test\test2.bat" & " " & sParam1 & " " & sParam2 dProcessId = Shell(sPath) End Sub |
まとめ
- 非同期実行:Shell関数(完了待たずに次へ進む)
- 同期実行:WshShellクラス(完了まで待機可)
- 引数付き実行:ファイルパス+引数を半角スペース区切りで指定
VBAからbatファイルを実行することで、外部処理やファイル操作を自動化できます。