和風スパゲティのレシピ

日本語でコーディングするExcelVBA

クラスモジュールのエラーをクラス内で止める設定

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ではありません。


ということで、何かエラーが起きたときに、

  1. クラスモジュールは正常で、渡した値が悪い
  2. クラスモジュール内のコードが悪い

この2がほぼ起きないという状況になったら、
呼出元まで戻るのが便利になる
んだと思います。



いやー無理でしょ笑



クラスを試行錯誤しながら作っている段階では、
エラー時はクラス内で止まってくれないと困ります。


一般人はその試行錯誤が終わることはないのでは…?笑



ということで、「クラスモジュールで中断設定にしないで使ってください」という仕様のライブラリをダウンロードして使うようなことがなければ、ずっとこの設定でいいと思います。


最初からこっちになってれば、わざわざこの記事を読みに来なくてよかったのですが、
そもそも「変数の宣言を強制しない」が初期設定ですからね(´∀`;)


カスタマイズできるだけありがたいと感謝して、VBEを使っていきましょう。