本ページには広告が含まれています。

【Excel VBA】Errオブジェクトについて

Excel VBA Errオブジェクトについて
画像はCanvaの「Text to Image」で生成しました

エラー処理を行う上では、Errオブジェクトについて理解しておく必要があります。

スポンサーリンク

はじめに

発生した実行時エラーに関する情報が Errオブジェクトのプロパティに入ります。
Errオブジェクトのプロパティを参照すれば、様々なエラーの情報を得ることができます。

Errオブジェクトのメソッドを使うことで、実行時エラーを生成したりプロパティを設定したりすることができます。

【この記事でわかることは】
・Errオブジェクトのプロパティとメソッドについて

スポンサーリンク

Errオブジェクトのメソッド

プロパティ説明
ClearErrオブジェクトのプロパティ設定をすべて解除します。
Raise実行時エラーを生成します。

Clear メソッド

【構文】 object.Clear (object は、常に Errオブジェクトです)
     Err.Clear

Errオブジェクトのプロパティは、次の場合Clearメソッドが自動的に呼び出されリセットされます。
Resume ステートメント、On Error ステートメント、Exit Sub、Exit Function、Exit Property が実行される場合です。

Raise メソッド

【構文】Err.Raise number[, source, description, helpfile, helpcontext]
    ※ [ ]内の引数は省略可能です。

Err.Raise メソッドを使って実行時エラーを生成し、プロパティを設定することができます。

引数説明
number
必須
エラーの性質を識別する長整数型 (Long) 0~65535 の範囲です。
範囲 0 から 512 はシステム エラー用に予約されています。
範囲 513 から 65535 は、ユーザー定義エラーに使用できます。
クラス モジュールの独自のエラーコードを設定する場合は、
エラーコード番号を vbObjectError定数+エラー番号で生成します。
[source]エラー生成したオブジェクト又はアプリケーション名を示す文字列式です。
Sourceプロパティを設定する場合、project.class の形式を使用します。
指定しない場合、現在のVBプロジェクトのプログラム ID が使用されます。
[description]エラーを説明する文字列式です。指定しない場合、Error関数が
返す文字列が使用されます。対応するVBエラーがない場合、
“アプリケーション定義またはオブジェクト定義のエラーです。”
が使用されます。
[helpfile]このエラーに関するヘルプを確認できるヘルプファイルへのフルパスです。
指定しない場合VBヘルプファイルのフルパスのファイル名が使用されます。
[helpcontext]エラーのhelpfile内のトピックを識別するコンテキストIDです。
省略した場合、VBヘルプファイルのコンテキストIDが使用されます。

Err.RaiseをClearメソッドでエラー情報一覧を抽出

Errオブジェクトのメソッドを使って、Excel VBA のエラー情報一覧を書き出してみましょう。

Sub vbaErrNumberList()
  Dim i As Long, r As Long: r = 2
  Dim a As String, x As String
  On Error Resume Next
  '次のDescriptionと空白は除外して書き込む設定
  x = "アプリケーション定義またはオブジェクト定義のエラーです。"
  Cells(1, 1) = "Number"
  Cells(1, 2) = "Description"
  Cells(2, 1) = "下記以外"
  Cells(2, 2) = x
  For i = 1 To 65535
    Err.Raise i   'Err.Raise + 番号でエラーを発生させる
    a = Err.Description
    If a <> x And a <> "" Then
      r = r + 1       '書き込む行番号
      Cells(r, 1) = i 'Err.Number
      Cells(r, 2) = a 'Err.Description
    End If
    Err.Clear     'エラー情報をリセット
  Next
End Sub

・12行目「Err.Raise i 」で、Err.Raiseメソッド + 番号(i)でエラーを発生させます。

・13行目「a = Err.Description」でエラーの説明を取得しています。

・19行目「Err.Clear」で発生させたエラー情報をリセットしています。

Excel VBA実行時のエラー番号とメッセージ一覧

次の表が Err.Raiseメソッドで発生させて取得できたエラー番号とメッセージの一覧です。
※説明の文字列にhttps://learn.microsoft.com/該当ページへのリンクを付けました。

NumberDescription(説明)
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置換後の文字列が長すぎます。
上記以外アプリケーション定義またはオブジェクト定義のエラーです。

Errオブジェクトのプロパティ

エラーメッセージのダイアログボックスは、Err オブジェクトのプロパティ (下表参照) を使用して作成します。よく使われるプロパティは NumberDescription です。

プロパティ説明
Numberエラーを示す数値を取得または設定します。
Errオブジェクトの既定プロパティです。
Descriptionエラーに関連付けられている説明の文字列を取得または
設定します。
HelpContextヘルプファイルのトピックに対応するコンテキストID
を含む文字列式を返すか設定します。
HelpFileヘルプファイルへの完全修飾パスを含む文字列式を
設定または返します。
Source最初にエラーを生成したオブジェクトまたはアプリケーション
の名前を指定する文字列式を取得または設定します。

Source プロパティには、プロシージャ名や関数名を設定するなどに利用されます。

メソッドとプロパティの使用方法サンプル

Errオブジェクトのメソッドとプロパティを使ったサンプルです。
Applicatuon.Inputboxを使って入力した番号のエラーを生成してメッセージさせます。

Sub vbaErrSample()
  Dim n As Long 'Type:=1の戻り値用
  Dim msg As String
  On Error Resume Next
  'promptを設定キャンセルされた場合戻り値は n = 0
  msg = "発生させるエラー番号を入力してください。" & _
        vbCrLf & "「0」入力又は「キャンセル」で終了!"
'リターン場所
IBOX:
  n = Application.InputBox(msg, "エラー番号入力", , 1)
  '入力データを検査
  If n < 0 And n >= 65535 Then
    MsgBox "入力範囲は 1~65535(数字)です!"
      GoTo IBOX
  ElseIf n = 0 Then
    Exit Sub
  Else  '次の処理へ
  End If
  With Err  'Errオブジェクト
    .Raise Number:=n, Source:="vbaErrSample"  'エラーを発生させる
    MsgBox .Source & "内でエラーが発生しました!" & _
      vbCrLf & "エラー番号" & .Number & ":" & .Description _
      , vbCritical, "エラー通知"
    .Clear     'エラー情報をリセット
  End With
  GoTo IBOX
End Sub

・20行目の Err.Raise Number:=n, Source:=”vbaErrSample” では、ソースプロパティにプロシージャ名を設定している例です。

・21行目の MsgBox で表示する Err.Source に “vbaErrSample” が反映されます。

・25行目に GoTo を入れて、数値入力に戻すようにしています。

まとめ(おわりに)

今回の記事はいかがでしたか? 少しでもお役に立てたなら幸いです(^^;

発生した実行時エラーの情報が Errオブジェクトのプロパティに入っていることお分かりいただけたと思います。

Err.Rise と Err.Clear メソッドの使い方もお分かりいただけたと思います。
Riseメソッドのプロパティに情報を設定することができることも確認できました。

エラーが発生した場所(行番号)も取得できるのですが今回は省略しています。また次の機会にその方法を紹介できればと思います。

最後に箇条書きでまとめると今回の内容はこんな感じでした。

・Errオブジェクトのプロパティとメソッドの使い方がわかりました。

・Err.Numberの一覧が確認できました。

・Err.RiseメソッドでRourceプロパティやHelpなどを設定できることがわかりました。

★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★

スポンサーリンク
スポンサーリンク

過去記事のサンプルファイルをダウンロードできます

この記事で使用したサンプルの登録はありません。
過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください