【VBA】Debug.Assert の使い方 | 条件を満たさない時にマクロを中断させるデバッグ術

目次

はじめに

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

実行前の準備と動作

  1. シートの A1:A10 に数値を入力し、A5セルだけ "Error" のような文字列を入力しておきます。
  2. VBE(VBAエディタ)を開いた状態で、上記マクロを実行します。
  3. マクロは A1 から A4 までは順調に処理を進めます。
  4. A5 セルの処理に移ったとき、IsNumeric("Error")False を返すため、Debug.Assert の条件が満たされなくなり、Debug.Assert の行でプログラムが黄色くハイライトされ、一時停止します
  5. この状態で、変数の値を確認したり、ステップ実行(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 などの条件付きコンパイルを使って、最終版のファイルには含まれないようにする工夫をすると良いでしょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次