「Public Constの乱用」は今すぐやめよう。VBAをプロ級にする「設定用クラスモジュール」設計術
こんにちは。VBA開発の現場で、あちこちのモジュールに散らばった`Public Const`や`Public`変数に頭を抱えたことはありませんか?
「どこで定義したか忘れた」「変更したら予期せぬ場所でバグが出た」――これはVBA開発における「負の連鎖」の典型です。今日は、あなたのコードを「趣味レベル」から「堅牢なエンタープライズ品質」へと引き上げる、クラスモジュールを使った設定管理の奥義を伝授します。
—
1. なぜ `Public Const` を使いすぎてはいけないのか?
初学者が最初に陥る罠が、標準モジュールに「Public」を羅列することです。
‘ 【アンチパターン:標準モジュールに定数を羅列】
Public Const TAX_RATE As Double = 0.1
Public Const FOLDER_PATH As String = “C:\Data\”
これの何が問題か?
- 名前の衝突: 他のライブラリやモジュールと名前が被るリスクが高い。
- 依存関係の隠蔽: どこからでも参照できるため、どの機能がその設定に依存しているか把握不能になる。
- テストの困難さ: 値を動的に変えてテストすることができず、ハードコーディングの呪縛から逃れられない。
「どこでも触れる」ということは「誰かが壊しても分からない」と同義なのです。
—
2. 解決策:設定を「オブジェクト」としてカプセル化する
プロは変数をバラ撒く代わりに、「設定(Configuration)」という概念をクラスに閉じ込めます。 これにより、設定値は「どこからでも見えるゴミ」ではなく、「必要なときに呼び出すプロパティ」に昇華されます。
手順1:クラスモジュールの作成
VBEで「挿入」→「クラスモジュール」を選択し、名前を `Config` に変更してください。
手順2:クラス内部の設計
‘ クラス名: Config
Option Explicit
‘ プロパティはPrivateで保持(外部から直接書き換えさせない)
Private pTaxRate As Double
Private pDataFolder As String
‘ コンストラクタ代わりの初期化処理
Private Sub Class_Initialize()
pTaxRate = 0.1
pDataFolder = “C:\Reports\”
End Sub
‘ 読み取り専用プロパティとして公開(Getter)
Public Property Get TaxRate() As Double
TaxRate = pTaxRate
End Property
Public Property Get DataFolder() As String
DataFolder = pDataFolder
End Property
—
3. 実践:どう呼び出すか?
設定を使う側(メインの処理)では、以下のように記述します。
‘ 標準モジュールでの利用例
Sub RunProcess()
‘ クラスのインスタンス化
Dim cfg As New Config
‘ プロパティを通じて安全に値を取得
Debug.Print “税率: ” & cfg.TaxRate
Debug.Print “フォルダパス: ” & cfg.DataFolder
‘ ここでメイン処理を行う…
End Sub
この設計がもたらす3つのメリット
1. インテリセンス(入力補完)の恩恵: `cfg.` と打てばプロパティがリストアップされます。`Public Const` を探してファイルを行き来する必要はもうありません。
2. 変更の一元管理: 将来的に「税率をシートから読み込みたい」となった場合、`Config` クラスの中身を書き換えるだけで、呼び出し元のコードは1行も直す必要がありません。
3. 読み取り専用の強制: `Property Let`(書き込み)を作らなければ、コード内で誤って設定値を上書きする事故を物理的に防げます。
—
4. ステップアップ:さらに現場で役立つ知見
「毎回 `New` するのが面倒」という方は、シングルトン(Singleton)パターンを意識してみましょう。
設定値を保持するインスタンスを一つだけ作成し、それをプロジェクト全体で共有する手法です。もし大規模な開発であれば、`Worksheet` から設定を読み込む機能をクラスの `Class_Initialize` 内に実装すれば、Excelの画面から設定を変更できる「管理画面付きVBAアプリ」が完成します。
陥りやすいエラーへのアドバイス
- 循環参照: クラス内で他のクラスを呼び出し、それがまた自分を呼ぶ…といった循環は避けてください。
- 初期化忘れ: `Set` を忘れると `Object variable not set` エラーになります。`New` キーワードの役割をしっかり理解しましょう。
—
まとめ:VBAを操るエンジニアへの道
`Public Const` の羅列から脱却し、クラスを使って「設定」を管理する。これだけで、あなたのコードは劇的に整理され、保守性が跳ね上がります。
VBAは古く見えるかもしれませんが、オブジェクト指向の考え方を適用すれば、驚くほどモダンで堅牢なツールが作れます。「マクロの記録」の向こう側には、こうした美しい設計の世界が広がっています。
まずは、今のプロジェクトにある `Public` 変数を、1つだけクラスに移行してみてください。その瞬間から、あなたのVBA開発は一段上のステージへと駆け上がりますよ。
応援しています。困ったことがあれば、またいつでも聞きに来てくださいね。
