VBAプロジェクトは小規模に見えて、
気づけば複雑化して後戻りできなくなる ことがよくあります。
そこで本記事では、現場レベルで本当に使われている
保守・改修しやすいプロジェクト構造 をわかりやすく解説します。
目次
1. “一つの役割を一つのモジュールに” が鉄則
保守性を高めるための基本は、
1ファイル(1モジュール) = 1責務(役割) にすることです。
▼ 責務の例
- データ取得(シートから読む)
- 業務ロジック
- 共通処理
- UI制御
- 定数の保持
▼ よくある改善例
❌ BeforeModule1 に全処理が詰め込まれている
→ 何百行にもなり、全体が把握不能
⭕ After
役割ごとに分割
mdlData:データ取得mdlService:ロジック処理mdlCommon:共通処理mdlUI:UIイベント
これだけで大幅に可読性・保守性が向上します。
2. プロシージャを「短く、小さく、明確に」保つ
長いプロシージャは保守性の敵 です。
▼ 理想の長さ
- 基本は 20〜40行以内
- 50行を超えると分割を検討
- 100行を超えたら必ず分割
▼ 分割のコツ
- 「入力 → 処理 → 出力」で分離
- ループ内部の処理を別プロシージャに出す
- 条件分岐ごとにプロシージャを切る
▼ 例:長い処理を分割
Public Sub MainProcess()
LoadData
CalcOrder
OutputResult
End Sub
“何をしているか” が一目でわかる構造にするのが重要。
3. UI・ロジック・データアクセスを分離
長く使われるシステムほど、
画面(UI)とロジック、データ操作が混ざることによる破綻 が発生します。
▼ 理想の構造(簡易MVC)
- UI:ボタン押下など、処理の入口だけ
- ロジック(Service):業務の本体
- データ取得(Repository):シートとのやり取り
UI → ロジック → データ取得
この構造を守るだけで
「特定のプロシージャでしか動かない謎の依存」が激減します。
4. 同じコードを書かない(DRY原則)
DRY(Don’t Repeat Yourself)は保守の基本です。
▼ よくある悪例
シートAの読み取りコードを
シートBでもコピペして使ってしまうこと。
→ 修正時に両方変更しなければならず、バグの原因になる。
▼ 正しい構造
データ読み取りロジックは
共通モジュール(mdlData) に集約し、どこからでも呼び出す。
Dim data As Variant
data = GetSalesData() '共通処理化
5. 定数・設定値は “1か所に集める”
シート名・ファイルパス・列番号・固定メッセージなどは
Config モジュールで一括管理 します。
▼ 例
Public Const SHEET_SALES As String = "売上データ"
Public Const COL_DATE As Long = 1
Public Const COL_AMOUNT As Long = 3
▼ メリット
- シート名変更時はここだけ直せばよい
- コードから「謎の数字(Magic Number)」を排除できる
6. “一時的な変更”をコードに埋め込まない
保守が難しくなる原因の定番がこれ。
よくある例
If flag = True Then '一時対応
「一時対応」は半年後の“恒久対応”になってしまうのが現実。
▼ 対策
- 設定値はConfigモジュールに移す
- コメントで理由と期限を書く
- 後で必ず直す想定の処理は印象的なタグをつける
- 例:
'TODO:'FIXME:'TEMP:など
- 例:
7. テストしやすい設計にする
保守性が高い構造は、
部分的に実行しやすい構造 と同義です。
▼ テストしやすい構造の例
Mainを入口にしない- 小さなプロシージャ単位で実行確認できる
- 戻り値で結果が返る構造にする
- Input/Output は外だし(シートとロジックを分離)
▼ 例:戻り値ありにするとテストが容易
Public Function CalcTotal(arr) As Long
Dim i As Long
For i = LBound(arr) To UBound(arr)
CalcTotal = CalcTotal + arr(i)
Next
End Function
呼び出し側で検証が簡単になる。
8. まとめ
保守・改修しやすいVBAプロジェクトは、
次の特徴を持っています。
✔ モジュールは1役割に限定する
✔ プロシージャは短く、明確に
✔ UI・ロジック・データアクセスを分離
✔ 同じコードを繰り返さない(DRY)
✔ 定数はまとめて一括管理
✔ 一時対応をコードに残さない
✔ テストしやすい構造にする
これらを満たすプロジェクトは、
誰が触っても理解できる=強いプロジェクト になります。
コメント