【VBA】保守・改修しやすいプロジェクト構造|1モジュール1責務の設計術

VBAプロジェクトは小規模に見えて、
気づけば複雑化して後戻りできなくなる ことがよくあります。

そこで本記事では、現場レベルで本当に使われている
保守・改修しやすいプロジェクト構造 をわかりやすく解説します。


スポンサーリンク

1. “一つの役割を一つのモジュールに” が鉄則

保守性を高めるための基本は、
1ファイル(1モジュール) = 1責務(役割) にすることです。

▼ 責務の例

  • データ取得(シートから読む)
  • 業務ロジック
  • 共通処理
  • UI制御
  • 定数の保持

▼ よくある改善例

❌ Before
Module1 に全処理が詰め込まれている
→ 何百行にもなり、全体が把握不能

⭕ After
役割ごとに分割

  • mdlData:データ取得
  • mdlService:ロジック処理
  • mdlCommon:共通処理
  • mdlUI:UIイベント

これだけで大幅に可読性・保守性が向上します。


スポンサーリンク

2. プロシージャを「短く、小さく、明確に」保つ

長いプロシージャは保守性の敵 です。

▼ 理想の長さ

  • 基本は 20〜40行以内
  • 50行を超えると分割を検討
  • 100行を超えたら必ず分割

▼ 分割のコツ

  1. 「入力 → 処理 → 出力」で分離
  2. ループ内部の処理を別プロシージャに出す
  3. 条件分岐ごとにプロシージャを切る

▼ 例:長い処理を分割

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)

✔ 定数はまとめて一括管理

✔ 一時対応をコードに残さない

✔ テストしやすい構造にする

これらを満たすプロジェクトは、
誰が触っても理解できる=強いプロジェクト になります。

コメント

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