バッチファイルを実行するにはShell関数かWshShellクラスを使う

VBAからバッチファイル(*.bat)を実行するには、Shell関数WshShellクラスを利用します。いずれも外部アプリケーションを実行するための仕組みです。

  • Shell関数:非同期実行(bat完了を待たずに次へ進む)
  • WshShellクラス:同期/非同期両対応(完了を待ってからVBAを再開できる)

以下ではバッチファイルを実行するサンプルを、非同期の場合と同期の場合それぞれ紹介します。

また、VBAからバッチファイルを実行する際の引数の渡し方も説明します。

VBAでバッチファイルを実行する方法の選び方

VBAからbatファイルを実行する場合、処理を「待つか/待たないか」で選択肢が変わります。

実行方法 関数/クラス 特徴
非同期実行 Shell関数 bat完了を待たずに次の処理を続行
同期実行 WshShellクラス bat完了までVBAが待機
引数付き実行 両方対応 batファイル名+引数を半角スペースで指定

Shell関数

WshShellクラス

    なお、バッチファイルではなくコマンドプロンプトを起動してコマンドを実行したい場合は「VBAでコマンドプロンプトの起動とコマンドの実行を行う」をご参照ください。

    サンプルコードで使うバッチファイル

    サンプルで使うバッチファイルは以下を利用します。ファイル名をtest.batとしています。

    指定フォルダに移動して、新規フォルダを作成するコマンドです。

     

    【非同期】VBAからバッチファイルをShell関数で実行する方法

    バッチファイル実行後の完了を待たずに次の処理へ進む場合(非同期の場合)は、Shell関数を使います。

    Shell関数の戻り値はプロセスIDです。一応取得していますが、用途がなければ変数に代入しなくても構いません。

    8行目のShell関数ではバッチファイルの実行だけを行い、結果を待たずに次の処理に移行します。

    Shell関数の使い方や引数などの詳細は「VBAで他のアプリケーションで起動する(Shell)」をご参照ください。

    【同期】VBAからバッチファイルをWshShellクラスで実行する方法

    バッチファイルの処理が完了するまでVBAを待機させたい場合は、WshShellクラスを使います。

    こちらは同期のサンプルです。WshShellクラスを利用します。WshShellクラスを利用するには参照設定が必要です。

    WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。

    その他、WshShellクラスの使い方や引数などの詳細は「VBAで他のアプリケーションを同期起動する(WshShell)」をご参照ください。

    9行目の2番目の引数がTrueになると同期、Falseになると非同期になります。

    【引数付き】VBAからバッチファイルに引数を渡す場合

    以下のようなバッチファイルがあり、引数を2つ必要な場合があります。

    バッチファイルのファイル名をここではtest2.batとします。

    このような引数が必要なバッチファイルをVBAで起動する場合は、コマンドプロンプトから起動する場合と同様に、半角スペースを空けて引数を渡します

    ここではShell関数を使っていますが、WshShellクラスの場合も半角スペースで引数を区切る考え方は同じです。

    半角スペースでバッチファイル名と引数の間に区切りがないと、引数もファイル名に含まれているとみなされ、ファイルが存在しない旨のエラーになります。

    VBA側の例(Shell関数を利用)

    まとめ

    • 非同期実行:Shell関数(完了待たずに次へ進む)
    • 同期実行:WshShellクラス(完了まで待機可)
    • 引数付き実行:ファイルパス+引数を半角スペース区切りで指定

    VBAからbatファイルを実行することで、外部処理やファイル操作を自動化できます。