VBA エラー情報を取得する

はじめに

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

Err.Number から、エラー番号を取得できます。

Err.Description から、エラーメッセージを取得できます。

エラーの一覧も紹介します。

デバッグについては「デバッグの仕方」をご覧ください。
  • 目次
    • エラー情報を取得する
    • エラーの一覧

エラー情報を取得する

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

エラー処理について詳しくは「エラー処理をする」をご覧ください。

キャッチしたエラー処理の中で 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

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

開発中はエラー発生時に中断してデバッグできます。

中断してデバッグするには「エラー発生時に中断する」をご覧ください。

エラー処理専用の関数を作成すると、エラー情報を簡単に表示できます。

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

  • キャッチした関数を抜ける
  • Resume する (Resume Next では空になりません)
Sub 実行()
On Error GoTo Catch

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

    Exit Sub
Catch:

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

End Sub
Sub 実行()
On Error Resume Next

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

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

End Sub
Sub 実行()
On Error GoTo Catch 

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

Finally:
On Error Resume Next

    ' ここでは Err は空

    Exit Sub  
Catch:

    Resume Finally ' Resume すると Err は空になる
End Sub

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

エラーの一覧

VBA と同等な Visual Basic 6 のエラーメッセージの一覧があります。ただし英語です。

英語のエラー一覧は「Trappable Errors」をご覧ください。

日本語のドキュメントには番号の順番どおりではなく、メッセージの内容も少し違います。エラー番号で検索すると見つけられると思います。

日本語のエラー一覧は「エラー メッセージ」をご覧ください。

次の一覧は Err.Raise メソッドからエラーを発生させて取得できるエラー番号とメッセージの一覧です。

Number Description
3Return に対応する GoSub がありません。
5プロシージャの呼び出し、または引数が不正です。
6オーバーフローしました。
7メモリが不足しています。
9インデックスが有効範囲にありません。
10この配列は固定されているか、または一時的にロックされています。
110 で除算しました。
13型が一致しません。
14文字列領域が不足しています。
16式が複雑すぎます。
17要求された操作は実行できません。
18ユーザーによる割り込みが発生しました。
20エラーが発生していないときに Resume を実行することはできません。
28スタック領域が不足しています。
35Sub または Function が定義されていません。
47DLL のクライアント アプリケーションの数が多すぎます。
48DLL 読み込み時のエラーです。
49DLL が正しく呼び出せません。
51内部エラーです。
52ファイル名または番号が不正です。
53ファイルが見つかりません。
54ファイル モードが不正です。
55ファイルは既に開かれています。
57デバイス I/O エラーです。
58既に同名のファイルが存在しています。
59レコード長が一致しません。
61ディスクの空き容量が不足しています。
62ファイルにこれ以上データがありません。
63レコード番号が不正です。
67ファイルが多すぎます。
68デバイスが準備されていません。
70書き込みできません。
71ディスクが準備されていません。
74ディスク名は変更できません。
75パス名が無効です。
76パスが見つかりません。
91オブジェクト変数または With ブロック変数が設定されていません。
92For ループが初期化されていません。
93パターン文字列が不正です。
94Null の使い方が不正です。
96サポートされているイベント受信最大数のイベントが既に発生しているので、オブジェクトのイベント シンクを実行できません。
97オブジェクトが定義クラスのインスタンスではない場合、このオブジェクトに関するフレンド関数は呼び出せません。
98プロパティまたはメソッドの呼び出しの場合には、引数または戻り値としてプライベート オブジェクトへの参照を含めることはできません。
321不正なファイル形式です。
322必要な一時ファイルを作成できません。
325リソース ファイルの形式が不正です。
380プロパティの値が不正です。
381不正なプロパティ配列インデックスです。
382実行時には値を設定できません。
383値を設定できません。値の取得のみ可能なプロパティです。
385プロパティ配列インデックスが必要です。
387値を設定できません。
393実行時には値を取得できません。
394値を取得できません。値の設定のみ可能なプロパティです。
422プロパティが見つかりません。
423プロパティまたはメソッドが見つかりません。
424オブジェクトが必要です。
429ActiveX コンポーネントはオブジェクトを作成できません。
430クラスはオートメーションまたは予測したインターフェースをサポートしていません。
432オートメーションの操作中にファイル名またはクラス名を見つけられませんでした。
438オブジェクトは、このプロパティまたはメソッドをサポートしていません。
440オートメーション エラーです。
442リモート プロセス用のタイプ ライブラリまたはオブジェクト ライブラリへの参照は失われました。参照設定を解除して [OK] を押してください。
443オートメーション オブジェクトには既定値がありません。
445オブジェクトはこの動作をサポートしていません。
446オブジェクトは名前付き引数をサポートしていません。
447オブジェクトは現在の国別情報の設定をサポートしていません。
448名前付き引数が見つかりません。
449引数は省略できません。
450引数の数が一致していません。または不正なプロパティを指定しています。
451Property Let プロシージャが定義されておらず、Property Get プロシージャからオブジェクトが返されませんでした。
452序数が不正です。
453関数は指定された DLL には定義されていません。
454コード リソースが見つかりません。
455コード リソースのロック エラーです。
457このキーは既にこのコレクションの要素に割り当てられています。
458Visual Basic でサポートされていないオートメーションが変数で使用されています。
459オブジェクトまたはクラスがこのイベント セットをサポートしていません。
460クリップボードのデータ形式が不正です。
461メソッドまたはデータ メンバーが見つかりません。
462リモート サーバーがないか、使用できる状態ではありません。
463ローカル マシンにクラスが登録されていません。
481ピクチャが不正です。
482プリンター エラーです。
735一時ファイルに保存できません。
744検索文字列が見つかりませんでした。
746置換後の文字列が長すぎます。
上記以外アプリケーション定義またはオブジェクト定義のエラーです。

上記以外のエラーとして次のエラーを Tipsfound では紹介しています。

Description
変数が定義されていません。
定数、固定長文字列、配列、ユーザー定義型および Declare ステートメントは、オブジェクト モジュールのパブリック メンバーとしては使用できません。
オブジェクト モジュール内では、パブリック ユーザー定義型は定義できません。
プライベート オブジェクト モジュールを、パブリック オブジェクト モジュール内で、パブリック プロシージャの引数または戻り値、パブリック データ メンバー、またはパブリックのユーザー定義型のフィールドとして、使用することはできません。