ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.25

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。

今回は、前回の「Windowsコマンドの出力結果を取得②」の機能追加バージョンの紹介です。
具体的には、Windowsコマンドの実行結果を表に出力する機能を追加します。

【目次】

  1. コマンドの実行結果とは
  2. リターンコードを取得する方法
  3. マクロの構造
  4. マクロサンプル

それでは、始めましょう!

コマンドの実行結果とは

コマンドの実行結果とは、「実行したコマンドが正常終了したかそうでないか」のことです。
pingコマンドでいうと、相手ホストから反応が戻れば正常終了、戻らなければエラー、という結果になります。
コマンドラインインターフェース(WindowsならコマンドプロンプトやPowerShellなど)は、コマンドを実行すると実行結果が記録されるようになっています。
この実行結果はリターンコードと呼称します。

リターンコードを取得する方法

リターンコードは、コマンドプロンプトならerrorlevelという変数に記録されます。
これは直前に実行されたコマンドの結果によって値が変化します。

コマンドの結果リターンコード
正常終了0
正常終了以外0を除く値

リターンコードを確認するには、echoコマンドを使用します。
echo %errorlevel%

今回のマクロでは、リターンコードを取得し、その結果をExcelシートの表に出力します。

マクロの構造

今回のマクロは、前回(№24)の発展版なので、コードを流用します。
新たに追加する部分は赤字で表示しています。

①batファイルを作成する
②batファイルを実行し、出力結果とリターンコードをそれぞれファイル保存する
③リターンコードに応じた値をExcelシートに反映する
④Excelシートの表にあるホストすべてに対して①②を繰り返す

②が一部変わり、③が新しく追加した箇所です。

②では、リターンコードをファイルに出力する機能を追加します。
pingコマンドの標準出力と、リターンコードは、別々のファイルに出力します。
この方がコマンドからの出力とリターンコードを区別しやすくなるからです。
(前回はtracertコマンドも実行しましたが今回は省きます)

③でファイルに記録されたリターンコードを読み込み、その値によってExcelシートに反映する値を分岐させます。

マクロサンプル

前回同様、Excelシートに以下のようにホスト一覧の表を作成しておきます。
A列はホスト名、B列はIPアドレス、C列はコマンドの結果を記載する欄です。
OK/NGをわかりやすくするため、疎通できないと思われるホストを6~7行目に追加しています。

マクロのコードは以下になります。

Sub ExcelVBA_025_001()
    
    Dim FileNum
    Dim RowCnt As Long
    Dim LastRow As Long
    Dim StrBatFilePath As String
    Dim StrHost As String
    Dim StrIP As String
    Dim StrOutFile As String
    Dim StrRt
    Dim objWSH As Object
    
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row '表の最終行を取得する
    For RowCnt = 2 To LastRow
        StrHost = Cells(RowCnt, 1).Value 'ホスト名を変数に記録
        StrIP = Cells(RowCnt, 2).Value 'IPアドレスを変数に記録
        StrBatFilePath = ThisWorkbook.Path + "\Sample.bat" 'batファイルの保存先パスを指定
        StrOutFile = "C:\Users\Public\Documents\疎通確認_" + StrHost + ".txt" 'コマンド出力結果ファイルの保存先パスを指定
        StrRtFile = "C:\Users\Public\Documents\リターンコード.txt" 'リターンコードの出力先パスを指定
        '<<batファイルを作成する>>
        FileNum = FreeFile 'ファイル番号を取得
        Open StrBatFilePath For Output As #FileNum   '書込モードでファイルを開く
        Print #FileNum, "echo 日時: %date% %time%> " + StrOutFile 'echoコマンドをファイルへ書き込み
        Print #FileNum, "ping " + StrIP + ">> " + StrOutFile  'pingコマンドをファイルへ書き込み
        Print #FileNum, "echo %errorlevel% > " + StrRtFile 'リターンコードをファイルへ書き込み
        Close #FileNum 'ファイルを閉じる
        '<<batファイルを実行する>>
        Set objWSH = CreateObject("WScript.Shell")
        objWSH.Run StrBatFilePath, 1, True
        '<<リターンコードを取得>>
        FileNum = FreeFile 'ファイル番号を取得
        Open StrRtFile For Input As #FileNum '読込モードでファイルを開く
        Line Input #FileNum, StrRt 'ファイルに書き込まれたリターンコードを取得
        Close #FileNum 'ファイルを閉じる
        '疎通確認結果を表へ反映
        Cells(RowCnt, 3).ClearContents '疎通確認結果を空欄にする
        If Trim(StrRt) = "0" Then 'リターンコードで分岐
            Cells(RowCnt, 3).Value = "OK" '疎通確認結果を"OK"にする
            Cells(RowCnt, 3).Font.ColorIndex = 0 '文字を黒にする
        Else
            Cells(RowCnt, 3).Value = "NG" '疎通確認結果を"NG"にする
            Cells(RowCnt, 3).Font.ColorIndex = 3 '文字を赤にする
        End If
    Next
    
    MsgBox "Finish.", vbInformation '処理終了メッセージ表示
    objWSH.Run "C:\Windows\explorer.exe ""C:\Users\Public\Documents""", 1, True '指定したフォルダを開く
End Sub

前回からの追加箇所は以下のとおりです。
・リターンコードを記録するファイルを指定(19行目)

echo %errorlevel%でリターンコードをファイルへ出力するよう設定(25行目)

・ファイルを読み込み、リターンコードを変数(StrRt)に記憶(31~34行目)

・変数(StrRt)が0ならコマンドが正常終了とみなし、表のC列に黒字でOKを出力
 0ではない場合にはエラーとみなし、C列に赤字でNGを出力
 (36~43行目)

マクロを実行すると、コマンドの出力結果ファイルが前回同様にフォルダに作成されます。
Excelシートに切り替えると、C列にOKまたはNGが表示されていることが確認できます。

以上が、コマンドプロンプトのリターンコードを取得するマクロになります。

それでは、また次回お会いしましょう!