モジュールの分割と再利用 ― 共通処理を別モジュールへ
VBAプロジェクトの規模が大きくなってくると、「どのモジュールがどの処理に依存しているのか」が分からなくなり、修正や再利用が難しくなるケースが増えてきます。
これを防ぐために重要なのが、
「分離(モジュール分割)」と「依存関係の整理」
です。
この記事では、コードの構造をシンプルに保ち、保守性を高めるための実務的な分離・依存管理の考え方を解説します。
1. 分離(Separation)の基本 ― 役割ごとに分ける
モジュール分割の基本方針は “役割ごとに別モジュールにする” という考え方です。
● 分離のメリット
- どの処理がどこにあるか一目でわかる
- 修正すべき箇所を迷わない
- 他モジュールへの影響が少なくなる
- 再利用しやすくなる
- テストがしやすくなる
● 推奨される分類例
実務では、次のような分類が使いやすいです。
| 種別 | 内容 | 例 |
|---|---|---|
| 共通ユーティリティ | 汎用的な処理 | modCommon, modUtil |
| データ加工系 | データ変換・整形 | modData |
| 画面制御(UI) | MsgBox や入力制御 | modUI |
| Excel操作 | 範囲・シート操作 | modExcel |
| 定数・設定値 | 定数定義 | modConst |
| 業務ロジック | 業務特化処理 | modSales, modImport |
目的別に分離しておくことで、保守のしやすさが劇的に向上します。
2. 依存関係(Dependency)とは?
依存関係とは、
「あるモジュールが他のモジュールの関数や変数に依存している状態」
のことです。
● 依存の例
modSales → modExcel の CopyRange 関数を使う
modSales → modCommon の SafeTrim を使う
このような関係は自然なものですが、依存が複雑になると次のような問題が起きます。
3. 依存関係が複雑だと起こる問題
● 修正時の影響範囲が読めない
A を直したら B が壊れ、さらに C が壊れ…
という“連鎖バグ”が発生しやすくなります。
● モジュール間の関係が把握しづらくなる
特に昔のコードや引き継ぎ案件で発生しやすい問題です。
● 再利用が困難になる
別ブックに移植しようとしても、依存モジュールが多すぎて面倒になります。
4. 理想は「下層 → 上層」の一方向依存
依存を整理する際の基本ルールは:
✔ 下層(共通処理) → 上層(業務処理)という一方向構造にする
● 例
- 下層:modCommon(汎用処理)
- 下層:modExcel(Excel操作)
- 上層:modSales(業務ロジック)
modSales は modExcel / modCommon を使うが、
modExcel が modSales を使うことはない。
この形を維持すると、構造が極めて健全になります。
5. 上層モジュールが下層に依存しないための工夫
● ① 下層モジュールに業務コードを混ぜない
共通処理に「顧客番号チェック」「売上計算」など業務ロジックを入れない。
● ② 変数・定数を Public で乱用しない
Public だらけだと依存が増え、どこから変更されるかわからなくなる。
● ③ “Excel操作”と“業務処理”を分ける
データ編集と画面処理が混ざると依存関係が複雑になる。
6. 依存関係を減らすためのサンプル設計
● modCommon(下層:共通処理)
Function SafeTrim(ByVal target As Variant) As String
If IsError(target) Then
SafeTrim = ""
Else
SafeTrim = Trim(CStr(target))
End If
End Function
● modExcel(下層:Excel操作)
Sub CopyRange(src As Range, dest As Range)
dest.Value = src.Value
End Sub
● modSales(上層:業務処理)
Sub ImportCustomerData()
Dim name As String
name = SafeTrim(Range("A1").Value)
CopyRange Range("A1"), Range("B1")
End Sub
上層が下層を呼び出すだけなので構造はスッキリします。
7. “依存の逆流”を防ぐ最大のポイント
✔ 業務ロジックを下層の共通モジュールに書かないこと
これを守るだけで依存関係の整ったプロジェクトになります。
8. まとめ
「分離」と「依存関係の整理」は、実務で VBA を長く運用していく上で最重要テーマの一つです。
● 本記事のポイント
- モジュールは目的ごとに分離する
- 依存は「下層 → 上層」に一方向が理想
- 共通モジュールに業務処理を書かない
- Public の乱用は依存悪化の原因
- 依存を意識すると再利用性が大幅アップ
コメント