VBAでクラスモジュールを使ってマクロを作り、
それを実行したときにエラーが発生すると、デバッグ選択時に
発生したプロシージャを呼び出したところまで戻ります。
例えば、
Sub クラスモジュール内で発生したエラーのデバッグ場所の検証() Dim x As New Classサンプル Call x.エラーテスト End Sub
' クラスモジュール「Classサンプル」内のコード Sub エラーテスト() Cells(0, 0) = 1 End Sub
これを実行すると、
と、エラーの内容はそのまま教えてくれますが、
デバッグ時の「次のステートメント」の位置は、
クラスモジュールのメソッドの呼出し位置に戻されます。
これを「実際に発生したクラスモジュール内のコードで止まってもらう」には、
「ツール → オプション → 全般タブ → エラートラップ」
の設定を、「クラスモジュールで中断」にすればOKです。
実際に先ほどのコードを実行してみますと、
と、ちゃんとエラー発生コードで止まるようになりましたね。
ちなみにもう一つの設定「エラー発生時に中断」とすると、
なんとOn Error Resume Next下でもエラーで止まるようになります。
On Error Resume Nextを利用した(エラーが起きる前提の)コードがすべて動かなくなるため、なかなか利用することはないと思いますが、一応心の片隅にでも。
しかしこれ、最初っからこっちの設定にしておいてほしいですよね笑
クラスモジュールの中で止まらず、
「呼び出したところまで戻ってから止まった方が便利」
という場面はどんな時かというと、
Cells(0, 0) = 1
↑まさにこれがいい例な気がします。
このエラーが起きた時に、
Property Get Cells ○%×$☆♭#▲!※
↑こんな感じでMicrosoftさんが書いたCellsプロパティの中で止まっちゃうと私たちは困りますからね。
Cellsの呼出し元まで戻ってくれるのは親切な設計です。
※ 例え話です。本当のVBAの内部はVBAではありません。
ということで、何かエラーが起きたときに、
- クラスモジュールは正常で、渡した値が悪い
- クラスモジュール内のコードが悪い
この2がほぼ起きないという状況になったら、
呼出元まで戻るのが便利になるんだと思います。
いやー無理でしょ笑
クラスを試行錯誤しながら作っている段階では、
エラー時はクラス内で止まってくれないと困ります。
一般人はその試行錯誤が終わることはないのでは…?笑
ということで、「クラスモジュールで中断設定にしないで使ってください」という仕様のライブラリをダウンロードして使うようなことがなければ、ずっとこの設定でいいと思います。
最初からこっちになってれば、わざわざこの記事を読みに来なくてよかったのですが、
そもそも「変数の宣言を強制しない」が初期設定ですからね(´∀`;)
カスタマイズできるだけありがたいと感謝して、VBEを使っていきましょう。