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

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

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

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


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

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

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

マクロ作成の流れ

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

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

バッチファイル

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

@echo off

rem pingの実行
ping %1

バッチファイルには、pingコマンドを実行するコードが記述されており、そのpingコマンドの引数にはバッチファイルの引数「%1」が指定されています。

この引数「%1」には、マクロから渡されて受け取った値が格納されています。

今回はマクロ側からpingコマンドに渡したい値(IPアドレス)がバッチファイルに渡されてこの引数「%1」で受け取ります。

引数「%1」に値(IPアドレス)が格納されたら、その値が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 argument        As String       'バッチファイル側に渡す引数用変数
    
    'バッチファイル側に渡す引数を取得する
    argument = "192.168.11.99"
    
    ' 呼び出すバッチファイルの格納先を取得する
    batchFilePath = ThisWorkbook.Path & "\0320.bat"
    
    ' WshShellオブジェクトからインスタンスを生成する
    Set wsh = CreateObject("WScript.Shell")
    
    'バッチファイルを実行する
    Set exec = wsh.exec("cmd /c " & batchFilePath & " " & argument)
        
    'バッチファイルで実行されたコマンドの実行結果すべてをテキストボックスに出力する
    TextBox1.Text = exec.StdOut.ReadAll

End Sub

注目すべきコード①

最初に見て頂きたいのは11行目です。

    'バッチファイル側に渡す引数を取得する
    argument = "192.168.11.99"

コードの説明

以上のコードは、バッチファイルに渡したい値(引数)を取得するコードです。

変数argumentに、バッチファイルに渡したい値(引数)を格納しています。

何かバッチファイルに値を渡したい場合はここでその値を指定します。

今回はバッチファイル側に値「192.168.11.99」を渡します。

注目すべきコード②

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

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

コードの説明

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

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

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

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

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

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

注目すべきコード③

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

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

コードの説明

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

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

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

動作確認

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

最後に

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

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

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

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

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

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