はじめに
VBAのデバッグ作業中、「このループ処理で、変数の値が予期せず100を超えた瞬間だけ、マクロを止めて原因を調査したい」といった特定の状況でプログラムを一時停止させたい場面があります。
ブレークポイント(F9
キー)を使えば任意の位置でマクロを止められますが、ループの中で使うと毎回止まってしまい、目的の瞬間まで何度も F5
キーで再開させる必要があり、非常に面倒です。
このような「特定の条件を満たしている間は処理を続け、条件から外れた瞬間にだけマクロを中断したい」という高度なデバッグ要求に応えるのが Debug.Assert
というステートメントです。
この記事では、Debug.Assert
を使って、コードの健全性をチェックし、異常が発生したまさにその瞬間にデバッグを開始する方法を解説します。
Debug.Assert
を使ったサンプルコード
このマクロは、セル A1
から A10
までをループ処理し、各セルの値が数値(IsNumeric
)であることをチェックします。もし数値以外のデータが見つかった場合、Debug.Assert
が作動し、その行でマクロが中断(一時停止)します。
完成コード
' Debug.Assertでデータの妥当性をチェックする
Sub CheckDataWithAssert()
Dim targetCell As Range
' A1セルからA10セルまでをループ
For Each targetCell In ActiveSheet.Range("A1:A10")
'--- デバッグ時のチェックポイント ---
' targetCell.Valueが数値である(IsNumeric=True)ことを期待する。
' もし数値でなかった場合(IsNumeric=False)、この行で中断する。
Debug.Assert IsNumeric(targetCell.Value)
'--- 本来の処理 ---
' (この例では、何もしない)
Debug.Print targetCell.Address & " は正常です。"
Next targetCell
MsgBox "全てのデータは正常でした。"
End Sub
実行前の準備と動作
- シートの
A1:A10
に数値を入力し、A5
セルだけ"Error"
のような文字列を入力しておきます。 - VBE(VBAエディタ)を開いた状態で、上記マクロを実行します。
- マクロは
A1
からA4
までは順調に処理を進めます。 A5
セルの処理に移ったとき、IsNumeric("Error")
はFalse
を返すため、Debug.Assert
の条件が満たされなくなり、Debug.Assert
の行でプログラムが黄色くハイライトされ、一時停止します。- この状態で、変数の値を確認したり、ステップ実行(
F8
)で続きの動作を調べたりといった、詳細なデバッグ作業が可能になります。
コードの解説
Debug.Assert IsNumeric(targetCell.Value)
これが Debug.Assert
の核心部分です。
Debug.Assert [条件式]
[条件式]
: この部分には、**True
であることを期待する(True
であれば正常と見なす)**条件式を記述します。- 動作:
- 条件式の結果が
True
の場合: 何もせず、次の行の処理に進みます。 - 条件式の結果が
False
の場合: VBAはその行で実行を中断し、デバッグモードに入ります。
- 条件式の結果が
つまり、Debug.Assert
は、「この条件は常に True
のはずだ。もし False
になったら、それは何か問題が起きている証拠だから、その場で止まってくれ」という、プログラマーの「表明(Assertion)」をコードにしたものと言えます。
まとめ
今回は、Debug.Assert
を使って、特定の条件が満たされなくなった瞬間にマクロを自動で一時停止させる、高度なデバッグテクニックを解説しました。
Debug.Assert [常にTrueであるべき条件]
という構文で記述する。- 条件が
False
になった瞬間に、その行で実行が中断される「条件付きブレークポイント」として機能する。
Debug.Assert
は、コードから直接削除しない限りファイルに残り続けますが、これはあくまで開発・デバッグ時の補助機能です。完成したツールでは、On Error GoTo
などの正式なエラーハンドリングに置き換えるか、#If VBA7 Then ... #End If
などの条件付きコンパイルを使って、最終版のファイルには含まれないようにする工夫をすると良いでしょう。