【入門編】モジュール間での定数共有:Public Constの乱用を防ぐ「設定用クラスモジュール」の設計 – Excel VBA解析バイブル

スポンサーリンク

「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開発は一段上のステージへと駆け上がりますよ。

応援しています。困ったことがあれば、またいつでも聞きに来てくださいね。

タイトルとURLをコピーしました