この記事では、マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する方法についてご説明します。
【動画】マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する実際の動き
本題に入る前に、まずは次のツイートをご覧ください。
マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合に、そのエラー内容を取得するマクロを作成してみました😊https://t.co/IE0Q9QNkCK#ExcelVBA#コマンドプロンプト
— まさ@Excel、VBA、マクロ(経験年数16年) (@masamasa9785) October 24, 2021
マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得し、セルに出力しています。
マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する方法
マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得するには、次の流れの通りにコードを書いていきます。
Excelのマクロの作成の流れ
コードの例
Excelのマクロのコード(例)
Sub test() '変数宣言部 Dim wshObj As WshShell 'WshShellオブジェクト Dim wshExec As Object 'コマンドプロンプト実行結果用オブジェクト Dim cmdTxt As String 'コマンド用変数 Dim cmdResult As String 'コマンド実行結果メッセージ用変数 'WshShellオブジェクトからインスタンスを生成する Set wshObj = New WshShell 'コマンドプロンプトで実行するコマンド文を取得する cmdTxt = Range("B2").Value 'コマンドプロンプトでコマンドを実行し、実行した後wshExecに結果を格納する Set wshExec = wshObj.Exec("%ComSpec% /c " & cmdTxt) 'コマンドプロンプトでコマンドを実行した結果、エラーメッセージを取得する(正常終了ならブランク) cmdResult = wshExec.StdErr.ReadAll If cmdResult = "" Then 'エラーメッセージがない場合(正常終了の場合) Range("B5").Value = "正常終了" Else 'エラーメッセージががある場合(異常終了の場合) Range("B5").Value = cmdResult End If ' オブジェクト変数の参照の解放 Set wshExec = Nothing Set wshObj = Nothing End Sub
コードの解説
注目すべきコード①
最初に見て頂きたいのは16行目から19行目です。
'コマンドプロンプトでコマンドを実行し、実行した後wshExecに結果を格納する Set wshExec = wshObj.Exec("%ComSpec% /c " & cmdTxt) 'コマンドプロンプトでコマンドを実行した結果、エラーメッセージを取得する(正常終了ならブランク) cmdResult = wshExec.StdErr.ReadAll
16行目でコマンドプロンプトを呼び出してコマンド(コマンドは変数「cmdTxt」に格納されています)を実行し、19行目で実行したコマンドのエラーメッセージを取得します。
注目すべきコード②
次に見て頂きたいのは21行目から33行目です。
If cmdResult = "" Then 'エラーメッセージがない場合(正常終了の場合) Range("B5").Value = "正常終了" Else 'エラーメッセージががある場合(異常終了の場合) Range("B5").Value = cmdResult End If
実行したコマンドが正常終了している場合は、エラーメッセージが無い(ブランク)ので、21行目のif文の条件に当てはまり、文字列「正常終了」をセル「B5」に設定しています。
実行したコマンドが異常終了している場合は、31行目でセル「B5」にエラーメッセージを設定しています。
マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得した結果
マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得した結果は次の通りです。
【注意】参照設定が必要です
一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。
参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。
- Windows Script Host Object Model(wshom.ocx)
なぜ必要かというと、先ほどのコードの10行目の「WshShell」というオブジェクトが「wshom.ocx」というファイルを参照するからです。
'WshShellオブジェクトからインスタンスを生成する Set wshObj = New WshShell
この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。
ここでは「wshom.ocx」が何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロでWshShellオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。
最後に
本記事では、マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する方法についてご説明しました。
WshShellオブジェクトを利用する必要がありますが、特に難しい処理はしていないので悩むことはないと思います。
マクロから呼び出されたコマンドプロンプトでコマンドを実行した時に、エラーメッセージを取得したい場合は本記事の内容を参考にしてみてくださいね。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。