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

メソッド 説明
Clear Errオブジェクトの全てのプロパティの設定を解除
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

Raiseメッソっドを使うと、ユーザー定義エラーとして、独自の実行時エラーを作ることが出来ます。

プログラミングをしていると、プログラム上はエラーでは無くても、システムの仕様上エラーにしたい場面などが出てきます。そんな場合に、自作でエラーが作れるようになっているんですね

Err.Raise number, source, description, helpfile, helpcontext

プロパティのところで紹介した、各プロパティを引数に指定して実行します。

引数指定時の注意点をまとめておきます。

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