Debug.Print、Debug.Assertはいずれもデバッグ用の機能なので、リリース版のコードには不要である。
かといって消してしまうと、次にコードを修正するときに面倒なので残しておきたい。
そこで代用クラスを作ってみたので紹介。
まずクラスモジュールを挿入し、オブジェクト名をTesterにする。
コードは次のとおり。
#Const VALID = True Const STOP_ON_ASSERTION_FAILURE = False Sub Out(v As Variant) #If VALID Then Debug.Print v #End If End Sub Sub Assert(exp As Boolean, Optional message As String = "Undefined") #If VALID Then If Not exp Then Out "Assert Failure:" & message If STOP_ON_ASSERTION_FAILURE Then Stop End If End If #End If End Sub Sub Never(exp As Boolean, Optional message As String = "Undefined") #If VALID Then If exp Then Out "Unexpected Occured:" & message If STOP_ON_ASSERTION_FAILURE Then Stop End If End If #End If End Sub
これをエスポートする。
そしてテキストエディタでAttribute VB_PredeclaredId = FalseとなっているところをTrueに変更する。
元あったTesterクラスは開放し、編集後のTester.clsをインポートする。
これで、変数宣言やインスタンスセットを省略できる。
使用方法
Assert命令はBoolean型の式を第一引数にとり、Falseであればイミディエイトウインドウにアサート失敗を告げるメッセージを出力する。また、オプションで第二引数の文字列をアサート失敗メッセージとすることもできる。
Never命令はAssertの逆で、Trueであればイミディエイトウインドウにメッセージを出力する。
Out命令は単にDebug.Printと同等である。
以下は使用例。
Sub hoge() Tester.Assert 1 = 2, "one is not two" Tester.Out "test message" Tester.Never 1 = 1, "one is one" Debug.Print "hoge" End Sub
Debug.Assertと同様に失敗時にコードを停止させるには、TesterクラスのSTOP_ON_ASSERTION_FAILUREをTrueに設定する。
ただし、クラスモジュール内部で処理が停止してしまう。
このとき、Ctrl+Lで呼び出し履歴ウインドウを表示できるので、カーソルキーの↓で一つ下を選び、Enterで決定すると、
どこでコケたのかが分かる。
リリース時は、TesterクラスのVALIDをFALSEにするのを忘れずに。