はじめに
VBAでマクロを開発している最中は、Debug.Print
で変数の値を確認したり、テスト用のメッセージボックスを表示したりと、デバッグのためのコードを多用します。しかし、マクロが完成して他の人に配布する際には、これらのデバッグ用コードは不要なので、一つずつ手作業で削除したり、コメントアウトしたりするのは非常に面倒です。
VBAの「条件付きコンパイル」という機能を使えば、開発中(テストモード)か、本番環境かを切り替えることで、特定のコードブロックを実行に含めたり、完全に除外したりすることができます。
この記事では、#Const
と #If...#End If
を使って、デバッグ用のコードと本番用のコードをスマートに切り替える方法を解説します。
条件付きコンパイルのサンプルコード
このマクロは、モジュールの先頭で DEBUG_MODE
という条件付きコンパイル定数を定義し、#If
ブロックを使って、その定数が True
の場合のみデバッグ用の Debug.Print
を実行します。
完成コード
'--- 1. 条件付きコンパイル用の定数を宣言 ---
' Trueに設定すると、#If DEBUG_MODE Then ... #End If の中が有効になる
#Const DEBUG_MODE = True
' 本番用にするときは、この行をコメントアウトするか、Falseに書き換える
' #Const DEBUG_MODE = False
Sub ConditionalCompilationExample()
Dim i As Long
For i = 1 To 5
'--- 2. #Ifブロックで、デバッグ用の処理を囲む ---
#If DEBUG_MODE Then
' このDebug.Printは、DEBUG_MODE = True のときだけ実行される
Debug.Print "ループ " & i & "回目..."
#End If
'--- 本番環境でも常に実行される処理 ---
Cells(i, "B").Value = "Data " & i
Next i
#If DEBUG_MODE Then
MsgBox "デバッグモードで処理が完了しました。", vbInformation
#Else
MsgBox "処理が完了しました。", vbInformation
#End If
End Sub
コードの解説
1. #Const DEBUG_MODE = True
これが「条件付きコンパイル定数」を宣言する部分です。
#Const
:Const
の前にハッシュマーク#
が付きます。これは、通常の定数とは異なり、プログラムのコンパイル時(実行前のコード解釈の段階)に評価されることを意味します。- この定数の値を切り替えることで、どのコードブロックをコンパイルに含めるかを制御します。
= True
:#If DEBUG_MODE Then
以下のコードが有効になります。= False
またはこの行自体をコメントアウト:#If DEBUG_MODE Then
以下のコードはコンパイルの対象から完全に除外されます。つまり、完成したプログラムにはそのコードが存在しないのと同じ状態になります。
2. #If DEBUG_MODE Then ... #End If
通常の If
ステートメントとよく似ていますが、全てにハッシュマーク #
が付きます。
#If
,#Else
,#End If
: これらのディレクティブ(指示子)で囲まれたコードブロックは、#Const
で定義された定数の値に基づいて、コンパイルに含めるかどうかが決定されます。DEBUG_MODE
がTrue
であれば、#If
と#Else
の間のコードがプログラムの一部となり、False
であれば#Else
と#End If
の間のコードがプログラムの一部となります(#Else
は省略可能)。
まとめ
今回は、条件付きコンパイルを使って、開発用のコードと本番用のコードを切り替える方法を解説しました。
#Const 定数名 = True/False
で、コンパイルのスイッチを定義する。#If ... #Else ... #End If
ディレクティブで、スイッチの状態に応じて有効化したいコードを囲む。
このテクニックを使えば、デバッグ用のコードをわざわざ削除したりコメントアウトしたりする手間が省け、モジュール先頭の #Const
の一行を書き換えるだけで、簡単に「デバッグモード」と「本番モード」を切り替えることができます。これにより、開発効率とコードの安全性が大きく向上します。