【ExcelVBA】マクロから複数渡された値を元に実行されたバッチファイルが返す複数の値をマクロ側がまとめて受け取るには

この記事では、マクロから複数渡された値を元に実行されたバッチファイルが返す複数の値をマクロ側がまとめて受け取る方法についてご説明します。

【動画】マクロから値が渡されたバッチファイルの実行結果を受け取る実際の動き

本題に入る前に、まずは次の動画をご覧ください。


まずはマクロからバッチファイルが呼び出されてバッチファイルが実行されます。

バッチファイルを呼び出す際、バッチファイル側に値を渡します。

バッチファイルが実行されると、マクロ側から渡された値を使って実行された結果をマクロ側が受け取りテキストボックスに出力しています。

マクロ作成の流れ

STEP.1
WshShellオブジェクトからインスタンスを生成する
WshShellオブジェクトからインスタンスを生成します。
STEP.2
バッチファイルに値を渡し、バッチファイルを実行する
バッチファイルに値を渡し、バッチファイルを実行します。
STEP.3
バッチファイルで実行されたコマンドの実行結果を取得する
バッチファイルで実行されたコマンドの実行結果を取得します。
取得した実行結果は、今回テキストボックスに出力しています。

バッチファイルとExcelファイルの例

バッチファイル

今回は下のバッチファイルを用意しました。

@echo off

rem pingの実行1
ping %1

rem pingの実行2
ping %2

rem pingの実行3
ping %3

バッチファイルには、pingコマンドを実行するコードが3つ記述されています。

このpingコマンドには、バッチファイルの引数が3つ使われており、pingコマンドそれぞれに「%1」「%2」「%3」の3つの引数が指定されています。

マクロ側から渡された値がそれぞれ「%1」「%2」「%3」に格納されます。

マクロ側から渡された値が渡された後に「%1」「%2」「%3」に格納されて、pingコマンドが実行されます。

Excelファイル

今回は下のExcelファイルを用意しました。

実行ボタンをクリックするとバッチファイルが実行されて、設置されたテキストボックスにpingコマンドの実行結果が出力されます。

コードの例

Option Explicit

Private Sub btn_exec_Click()

    Dim wsh             As Object       'WshShellインスタンス用変数
    Dim exec            As Object       'バッチファイル実行用変数
    Dim batchFilePath   As String       '呼び出すバッチファイルの格納先
    Dim arg1            As String       'バッチファイル側に渡す引数用変数1
    Dim arg2            As String       'バッチファイル側に渡す引数用変数2
    Dim arg3            As String       'バッチファイル側に渡す引数用変数3
    
    'バッチファイル側に渡す引数を取得する(今回は3つ用意)
    arg1 = "192.168.11.97"
    arg2 = "192.168.11.98"
    arg3 = "192.168.11.99"
    
    '呼び出すバッチファイルの格納先を取得する
    batchFilePath = ThisWorkbook.Path & "\0321.bat"
    
    'WshShellオブジェクトからインスタンスを生成する
    Set wsh = CreateObject("WScript.Shell")
    
    'バッチファイルを実行する
    Set exec = wsh.exec("cmd /c " & batchFilePath & " " & arg1 & " " & arg2 & " " & arg3)

    'バッチファイルで実行されたコマンドの実行結果すべてをテキストボックスに出力する
    TextBox1.Text = exec.StdOut.ReadAll

End Sub

注目すべきコード①

最初に見て頂きたいのは13行目から15行目です。

    'バッチファイル側に渡す引数を取得する(今回は3つ用意)
    arg1 = "192.168.11.97"
    arg2 = "192.168.11.98"
    arg3 = "192.168.11.99"

コードの説明

以上のコードは、バッチ側に渡したい値を取得しているコードです。

今回はバッチファイル側に渡す3つの値を用意しました。

この3つの値がバッチファイル側に渡されます。

注目すべきコード②

次に見て頂きたいのは21行目から24行目です。

    'WshShellオブジェクトからインスタンスを生成する
    Set wsh = CreateObject("WScript.Shell")
    
    'バッチファイルを実行する
    Set exec = wsh.exec("cmd /c " & batchFilePath & " " & arg1 & " " & arg2 & " " & arg3)

コードの説明

以上のコードは、WshShellオブジェクト用インスタンスを生成し、値をバッチファイルに渡して実行する処理のコードです。

WshShellオブジェクトからインスタンスを生成したら、execメソッドでコマンドプロンプトを開き、コマンドプロンプト上で実行するバッチファイル(batchFilePath)に値を渡して実行します。

実行し終わったら、コマンドプロンプトを閉じます。

「cmd」はコマンドプロンプトの実行ファイル「cmd.exe」を開くコマンドで、「/c」はコマンドを実行した後にコマンドプロンプトを閉じるようにするオプションです。

バッチファイルに値を渡したい場合は、バッチファイルの後ろに半角スペースを挟んで値を指定します。

バッチファイルの後ろに半角スペースを挟んで値を指定することで、バッチファイルを実行する際に値を渡して実行することができます。

今回は3つの値をバッチファイルに渡したいので、半角スペースと値の指定を3回繰り返しています。

注目すべきコード③

次に見て頂きたいのは27行目です。

    'バッチファイルで実行されたコマンドの実行結果すべてをテキストボックスに出力する
    TextBox1.Text = exec.StdOut.ReadAll

コードの説明

以上のコードは、バッチファイルで実行されたコマンドの実行結果すべてをテキストボックスに出力する処理のコードです。

StdOutプロパティからReadAllメソッドを呼び出し、バッチファイルの実行結果をすべて取得します。

今回は取得したバッチファイルの実行結果をテキストボックスに出力しています。

動作確認

バッチファイルとExcelファイルの例」をご覧ください。

最後に

この記事では、マクロから複数渡された値を元に実行されたバッチファイルが返す複数の値をマクロ側がまとめて受け取る方法についてご説明しました。

マクロから複数渡された値を元に実行されたバッチファイルが返す複数の値をマクロ側がまとめて受け取りたい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら