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