Errオブジェクトについて
EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”Errオブジェクト”について紹介します!
Errオブジェクトとは
前回、”On Errorステートメント”によるエラー処理について記事を書きました。
このときは、触れなかったのですが、エラーが発生したとき、エラーメッセージが流れると思いますが、この情報はErrオブジェクトというオブジェクトに格納されていて、プログラム上で利用することが出来ます。
サンプルコード
Sub test()
'変数宣言
Dim ans As Integer
'0で割る計算
ans = 5 / 0
'終了メッセージ
MsgBox "処理完了"
End Sub
このコードを実行すると、7行目の計算が「0」で割ってしまってるので次のようなエラーが出ます。
このようなエラーの情報を、プログラム上で利用できるのが、Errorオブジェクトです。
通常は、On Errorステートメントを利用して、エラーをキャッチした後にエラーの情報を集めたり、一旦メッセージボックスなどで表示したりして使います。
エラーの種類によって、その後の処理を分岐したりする場合にも無くてはならない情報です。
Errオブジェクトのプロパティ
プロパティ | 説明 |
---|---|
Description | エラーに関連づけられている説明 |
HelpContext | ヘルプファイルのトピックに対するコンテキストIDを含む文字列式 |
HelpFile | ヘルプファイルへの完全修飾パスを含む文字列式 |
Number | エラー番号 |
Source | 最初にエラーを生成したオブジェクトまたはアプリケーションの名前を指定する文字列式 |
大事なのは、「Description」「Number」です。
使い方は、普通ですね。
呼び出す時 ・・・ Err.プロパティ名
設定する時 ・・・ Err.プロパティ名 = 設定する値
先程のサンプルで試してみましょう。ちょっと改造します。
サンプル改
Sub test()
'変数宣言
Dim ans As Integer
'0で割る計算
On Error GoTo label1 'エラーを検知したら、「label1」へ
ans = 5 / 0
label1:
'イミディエイトウィンドウに表示
Debug.Print "Number:" & Err.Number
Debug.Print "Description:" & Err.Description
End Sub
8行目、「ans = 5 / 0」の上に「On Error GoTo label1」でエラーを検知したときの処理を入れています。飛び先の「label1:」以下で、Errオブジェクトのプロっぱティをイミディエイトウィンドウで表示させるプログラムに改造しています。
実行すると、イミディエイトウィンドウには以下のように表示されます。
エラーメッセージで流れた説明と同じものが確認出来ますね。
ちなみに、「Number」は既定値は「0」なので、エラーが出ていないときは「0」になっています。
エラーのリセット
Errオブジェクトは1つしか保持出来ないので複数のErrオブジェクトが混在することはありません。
エラーは次のときに解除されて元に戻ります。
- On Errorステートメントが実行されているプロシージャが終了する時(Exit SubとかEnd Subとかで抜けた時です)
- 「On Error GoTo 0」が実行された時(エラーのリセット)
- 「On Error Resume Next」が実行された時
- 「On Error GoTo ラベル」が実行された時(新しいエラー処理のルーチンが発生した時)
- 「Err.Clear」が実行された時(次にやる、Errオブジェクトの解除メソッドです)
Errオブジェクトのメソッド
それでは次に、Errオブジェクトが持っているメソッドについてです。以下の2つがあります。
メソッド | 説明 |
---|---|
Clear | Errオブジェクトの全てのプロパティの設定を解除 |
Raise | 実行時エラーを生成する |
Clear
プロパティのところで紹介した通り、このメソッドを使うと、エラーがリセットされます。
次のコードを実行してみます。
Sub test()
'変数宣言
Dim ans As Integer
'0で割る計算
On Error GoTo label1 'エラーを検知したら、「label1」へ
ans = 5 / 0
label1:
'イミディエイトウィンドウに表示
Debug.Print "Number:" & Err.Number
Debug.Print "Description:" & Err.Description
' エラーのクリア
Err.Clear
Debug.Print "クリア後Number:" & Err.Number
Debug.Print "クリア後Description:" & Err.Description
End Sub
エラー内容をイミディエイトウィンドウに表示した後、エラーをクリアして、再びイミディエイトウィンドウに表示します。
次のような結果となります。
クリア後は、Numberが「0」、Descriptionは空白になっているので、エラーがリセットされているのが分かります。
Raise
Raiseメッソっドを使うと、ユーザー定義エラーとして、独自の実行時エラーを作ることが出来ます。
プログラミングをしていると、プログラム上はエラーでは無くても、システムの仕様上エラーにしたい場面などが出てきます。そんな場合に、自作でエラーが作れるようになっているんですね
プロパティのところで紹介した、各プロパティを引数に指定して実行します。
引数指定時の注意点をまとめておきます。
引数 | 説明 |
---|---|
number | 指定必須 エラーの性質を識別する長整数型、0~65535の値を使用します。 範囲外の数値を指定した場合はRaiseメソッドがエラーになる。 0~512 の値はシステム エラー用に予約されているので使えません。 513~65535 の値がユーザー定義エラー用に使用できます。 |
description | 省略OK エラーを説明する文字列、指定しない場合はNumberから自動的に表示。対応するものがない場合は、「アプリケーション定義のエラーです。」になる。 |
helpContext | 省略OK このエラーに関するヘルプを確認できるヘルプ ファイルへの完全修飾パス 指定しない場合、VBAのヘルプ ファイルのドライブ、パス、およびファイル名が使われる。 |
helpFile | 省略OK エラーに関するヘルプを提供するhelpfile内のトピックを識別するコンテキスト ID 。 省略した場合、Numberプロパティに対応するエラーに応じた、VBAヘルプ ファイルのコンテキスト ID が使われる。 |
source | 省略OK エラーを生成したオブジェクトまたはアプリケーションの名前を示す文字列 |
サンプルで試してみましょう。
次のコードを実行します。
Sub test()
'変数宣言
Dim ans As Integer
'0で割る計算
On Error GoTo label1
ans = 100 / 50 '計算式:答えは2
If ans <= 5 Then
Err.Raise Number:=513, Description:="ユーザー定義エラー"
End If
label1:
'イミディエイトウィンドウに表示
Debug.Print "Number:" & Err.Number
Debug.Print "Description:" & Err.Description
End Sub
計算式を「100/50」に変更して、答えは2になります。
11行目のところで、変数:ansの値が5以下だったら、ユーザー定義エラーを生成するようにしています。引数には「Number:=513, Description:=”ユーザー定義エラー”」を指定していますので、19行目・20行目でイミディエイトウィンドウに作ったエラーの内容が表示されるはずです。
実行するイミディエイトウィンドウに次のように表示されます。
ユーザー定義エラーが設定出来ていることが確認出来ました!
まとめ
Errオブジェクトについて説明しました。
コメント