サイトについて      連絡先   検索

VBA エラー情報を取得する

はじめに

Excel VBA マクロのエラー情報を取得する方法を紹介します。

Err オブジェクトからエラーメッセージの内容と番号を取得できます。

これを元に原因を特定するためのデバッグをします。

  • 目次
    • エラー情報を取得する

エラー情報を取得する

エラー情報を取得するには、エラーをキャッチまたは無視する必要があります。

キャッチしたエラー処理の中で Err オブジェクトからエラー情報を取得できます。


Sub 実行()
On Error GoTo Catch

    Dim i As Integer
    i = "a" ' エラー

    Exit Sub
Catch:

    ' ここでエラー情報を取得できる
    Debug.Print(Err.Description) ' 型が一致しません。
    Debug.Print(Err.Number)      ' 13
    
End Sub

Err から次の情報を取得できます。

プロパティ名 説明
Descriptionエラーに関する説明文型が一致しません。
HelpContextヘルプファイルのトピックに対応するコンテキスト番号1000013
HelpFileヘルプファイルへの絶対パスC:\PROGRA ... VbLR6.chm
LastDllError最後にDLLを呼び出したときのエラーコード0
Numberエラー番号13
Sourceエラー発生元のオブジェクト名VBAProject

この中でよく使用するのは Description と Number です。これ以外に関数名などが欲しいときは、独自にその情報を取得する仕組みが必要になります。

Description の内容を手掛かりにしてエラーに対処します。

エラー処理専用の関数を作成すると便利です。


Public Sub LogErrorMessage(ByVal funcName As String)
    
    Dim s As String
    s = "エラーが発生しました。"
    s = s & vbCrLf & "番号:" & Err.Number
    s = s & vbCrLf & "詳細:" & Err.Description
    s = s & vbCrLf & "関数:" & funcName

    ' ログやメッセージを出力する
    Debug.Print(s)
    Dim r As VbMsgBoxResult
    r = MsgBox(s, vbOKOnly Or vbCritical)
    
End Sub

次のように使用できます。


Sub 実行()
On Error GoTo Catch

    Dim i As Integer
    i = "a" ' エラー

    Exit Sub
Catch:

    Call LogErrorMessage("実行") ' エラー情報を出力する
    ' エラーが発生しました。
    ' 番号:13
    ' 詳細:型が一致しません。
    ' 関数:実行

End Sub

有効期限

Err オブジェクトでエラーを取得できるのは、次の処理をするまでです。それを過ぎるとエラー情報が空になります。


Sub 実行()
On Error GoTo Catch

    Dim i As Integer
    i = "a" ' エラー

    Exit Sub
Catch:

    ' End Sub を抜けると Err は空になる

End Sub

Sub 実行()
On Error GoTo Catch 

    Dim i As Integer
    i = "a" ' エラー

Finally:
On Error Resume Next
    
    Exit Sub  
Catch:
    
    Resume Finally ' Resume すると Err は空になる
End Sub

Err.Clear メソッドを使用しても Err を空にできます。

  • 目次
    • エラー情報を取得する