こんにちは。
いつものようにExcelでVBAを組んでいると、On Error包囲網の中でエラーが発生しているにも関わらずプログラムが中断されてしまう…という症状に💦
いろいろ調べると「エラートラップ」なる設定項目が影響しているそうで…。
■ 動作環境
OS: Windows 8.1
Excel: 2013
■ 「エラートラップ」オプション
VBE(Visual Basic Editor)メニューの「ツール」-「オプション」から「全般」タブを選択すると「エラートラップ」に関する設定があります。
それぞれを選択した際の動きを次のとおりです。
① エラー発生時に中断
エラーが発生すると、On Error系処理がアクティブかどうかに関わらず、中断されます。
また、発生箇所がクラスモジュール内でも同様に中断されます。
② クラス モジュールで中断
クラスモジュール上でエラーが発生すると、On Error系処理がアクティブでない場合のみ、クラスモジュールの発生箇所で中断されます。
③ エラー処理対象外のエラーで中断
エラーが発生すると、On Error系処理がアクティブでない場合のみ、中断されます。
ただし、クラスモジュールで処理されないエラーが発生した場合は、問題を起こしたクラスメソッドの呼び出し元で中断されます。
■ 実際の動作
次のプログラムで動かしてみました…。
3ケースをうまく表現するために、若干不自然なソースなのですが…(笑)
□ メイン関数
「0で除算する」トラップを内包
エラー発生時は、clsTempクラスのerrorメソッドをコール
□ clsTempクラスのerrorソメッド
「有効範囲外の配列インデックスを指定する」トラップを内包
① 「エラー発生時に中断」の場合
On Error系処理は機能せず、エラーが発生した箇所で即座に中断されます。
② 「クラス モジュールで中断」の場合
On Error系処理は機能するが、 クラスモジュール上でエラーが発生するとそこで中断されます。
③ 「エラー処理対象外のエラーで中断」の場合
前述同様、クラスモジュール内のトラップがキャッチされていますが、 呼び出し元で中断されます。
■ まとめ
いかがでしたでしょうか?
エラー発生時の動きって、デバッグの考え方や進め方によって、「エラートラップ」オプションを使い分けていくことで、より効果的に作業を進められるかもしれませんね。^^
次回以降も、苦労した点を備忘録しようと思います。
Comments