【EXCEL VBA 基礎】Errオブジェクトについて

スポンサーリンク

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つがあります。

メソッド説明
ClearErrオブジェクトの全てのプロパティの設定を解除
Raise実行時エラーを生成する

Clear

Err.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

Err.Raisenumber, source, description, helpfile, helpcontext

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オブジェクトについて説明しました。

コメント

タイトルとURLをコピーしました