#370 VBEのエラートラップオプションの違いについて VBA

VBEのオプションの[全般]タブにおいては、「エラートラップ」の方法として次の3種類の中から1つを選択することができます。
  • エラー発生時に中断
  • クラスモジュールで中断
  • エラー処理対象外のエラーで中断
VBEオプションの全般タブ

ここでは、標準モジュール内に記述された次のサンプルコードを使って、それぞれどのようにエラー時の動作が異なるかを説明します。次の例では、バイト型の変数にその上限を超える値を代入し、わざとエラーを発生させています。

Sub ErrorTest()

  Dim bytData As Byte

  On Error GoTo Err_Handler

  bytData = 300

Exit_Here:
  Exit Sub

Err_Handler:
  Beep
  MsgBox Err.Description, vbOKOnly + vbCritical
  Resume Exit_Here:

End Sub


  1. エラー発生時に中断
    これにチェックを付けて実行すると、エラーハンドリングしているにもかかわらず、それがないときと同様にエラー発生行でプログラムはストップします。つまり「On Error GoTo」は無視されます。
    エラー発生時のメッセージ

    エラー発生時のコードウィンドウ

  2. クラスモジュールで中断
    これにチェックを付けて実行すると、エラーハンドリングが行われ、Err_Handlerサブルーチンが実行されます。
    エラー発生時のメッセージ

  3. エラー処理対象外のエラーで中断
    これにチェックを付けて実行すると、エラーハンドリングが行われ、Err_Handlerサブルーチンが実行されます。
    エラー発生時のメッセージ

このように、標準モジュールにおいては、上記のようなコードの範疇では、「クラスモジュールで中断」と「エラー処理対象外のエラーで中断」とはまったく同じ動作をします。少なくてもエラーハンドリングしようとしているわけですから、「エラー発生時に中断」の設定にはしないようにすべきでしょう。


一方、次のようなクラスモジュールを例にとってみます。

■クラスモジュール「Class1」への記述
Public Property Get ErrTest() As Variant

  Dim bytData As Byte

  bytData = 300

End Property


■標準モジュールからの上記クラスの呼び出し
Sub ErrorTest2()

  Dim ctest As New Class1
  Dim varTmp As Variant

  varTmp = ctest.ErrTest()

End Sub


ErrorTest2プロシージャを「クラスモジュールで中断」の設定で実行すると、呼び出されたクラスモジュール上でプログラムが停止します。
エラー発生時のコードウィンドウ

一方、「エラー処理対象外のエラーで中断」の設定で実行すると、呼び出し側の標準モジュール上でプログラムが停止します。
エラー発生時のコードウィンドウ

このように、「クラスモジュールで中断」と「エラー処理対象外のエラーで中断」はクラスモジュールを使う際に違いが出てきます。よって、クラスモジュールを開発するような場合には、この点に留意してオプション設定するようにします。
| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします
 

Copyright © T'sWare All rights reserved