みなさん、こんにちは。
ITソリューション事業部の林です。
本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回は、前回の「Windowsコマンドの出力結果を取得②」の機能追加バージョンの紹介です。
具体的には、Windowsコマンドの実行結果を表に出力する機能を追加します。
【目次】
それでは、始めましょう!
コマンドの実行結果とは
コマンドの実行結果とは、「実行したコマンドが正常終了したかそうでないか」のことです。
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が表示されていることが確認できます。
以上が、コマンドプロンプトのリターンコードを取得するマクロになります。
それでは、また次回お会いしましょう!