バッチファイルを実行するにはShell関数かWshShellクラスを使う
バッチファイル(*.bat)を実行するにはShell関数かWshShellクラスを使います。どちらを使うかはバッチファイルとVBAが同期か非同期かによります。
同期とはバッチファイルの実行結果をVBAで待つ場合のことで、非同期とはバッチファイルの実行結果を待たずにVBAでの処理が続行することを言います。
Shell関数は非同期で、WshShellクラスは同期、非同期のどちらでも利用できます。いずれも外部アプリケーションを実行するための仕組みです。
以下ではバッチファイルを実行するサンプルを、非同期の場合と同期の場合それぞれ紹介します。
また、VBAからバッチファイルを実行する際に引数の渡し方も説明します。
Shell関数とWshShellクラスの詳細
Shell関数とWshShellクラスの詳細は別ページで紹介しています。
Shell関数「VBAで他のアプリケーションで起動する(Shell)」
WshShellクラス「VBAで他のアプリケーションを同期起動する(WshShell)」
なお、バッチファイルではなくコマンドプロンプトを起動してコマンドを実行したい場合は「VBAでコマンドプロンプトの起動とコマンドの実行を行う」をご参照ください。
サンプルコードで使うバッチファイル
サンプルで使うバッチファイルは以下を利用します。ファイル名をtest.batとしています。
指定フォルダに移動して、新規フォルダを作成するコマンドです。
1 2 |
cd C:\web\test\ mkdir 2 |
非同期の場合(バッチファイルの結果をVBAで待たない場合)
Shell関数でバッチファイルのパスを指定して実行するだけのサンプルです。
Shell関数の使い方や引数などの詳細は「VBAで他のアプリケーションで起動する(Shell)」をご参照ください。
Shell関数の戻り値はプロセスIDです。一応取得していますが、用途がなければ削除して構いません。
7行目のShell関数ではバッチファイルの実行だけを行い、結果を待たずに次の処理に移行します。
1 2 3 4 5 6 7 8 |
Sub RunBatShell() Dim dProcessId As Double Dim sPath sPath = "C:\web\test\test.bat" dProcessId = Shell(sPath) End Sub |
同期の場合(バッチファイルの結果をVBAで待つ場合)
こちらは同期のサンプルです。WshShellクラスを利用します。WshShellクラスを利用するには参照設定が必要です。
WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
その他、WshShellクラスの使い方や引数などの詳細は「VBAで他のアプリケーションを同期起動する(WshShell)」をご参照ください。
9行目の2番目の引数がTrueになると同期、Falseになると非同期になります。
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 |
バッチファイルに引数を渡す場合
以下のようなバッチファイルがあり、引数を2つ必要な場合があります。
バッチファイルのファイル名をここではtest2.batとします。
1 2 |
echo %1 echo %2 |
このような引数が必要なバッチファイルをVBAで起動する場合は、コマンドプロンプトから起動する場合と同様に、半角スペースを空けて引数を渡します。
ここではShell関数を使っていますが、WshShellクラスの場合も半角スペースで引数を区切る考え方は同じです。
半角スペースでバッチファイル名と引数の間に区切りがないと、引数もファイル名に含まれているとみなされ、ファイルが存在しない旨のエラーになります。
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 |