【ExcelVBA】マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得するには

この記事では、マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する方法についてご説明します。

【動画】マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する実際の動き

本題に入る前に、まずは次のツイートをご覧ください。

マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得し、セルに出力しています。

マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する方法

マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得するには、次の流れの通りにコードを書いていきます。

Excelのマクロの作成の流れ

STEP.1
コマンドプロンプトを呼び出すのに必要なインスタンスの生成
コマンドプロンプトを呼び出すのに必要なインスタンスを生成します。
STEP.2
コマンドプロンプトを呼び出して指定したコマンドを実行
コマンドプロンプトを呼び出し、指定したコマンドを実行します。
STEP.3
コマンド実行時に取得した結果からエラーメッセージを取得
コマンド実行時に取得した結果からエラーメッセージを取得します。

コードの例

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」にエラーメッセージを設定しています。

マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得した結果

マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得した結果は次の通りです。

実行結果の例
(例1)存在しないパスでdirコマンドで実行した場合

 

(参考)同じコマンドをコマンドプロンプト上で実行した場合

 


(例2)存在しないコマンドを実行した場合

 

(参考)同じコマンドをコマンドプロンプト上で実行した場合

【注意】参照設定が必要です

一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。

参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。

  1. Windows Script Host Object Model(wshom.ocx)

なぜ必要かというと、先ほどのコードの10行目の「WshShell」というオブジェクトが「wshom.ocx」というファイルを参照するからです。

    'WshShellオブジェクトからインスタンスを生成する
    Set wshObj = New WshShell

この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。

ここでは「wshom.ocx」が何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロでWshShellオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。

最後に

本記事では、マクロから呼び出されたコマンドプロンプトで実行されたコマンドがエラーを発生した場合にそのエラー内容を取得する方法についてご説明しました。

WshShellオブジェクトを利用する必要がありますが、特に難しい処理はしていないので悩むことはないと思います。

マクロから呼び出されたコマンドプロンプトでコマンドを実行した時に、エラーメッセージを取得したい場合は本記事の内容を参考にしてみてくださいね。

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

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

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

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