モジュールの分割と再利用 ― 共通処理を別モジュールへ
VBA を安全・正確・効率的に運用するために欠かせないのが
Option Explicit(変数宣言の強制) と
体系的な変数管理 です。
特にモジュールを分割して再利用性を高める場合、
変数の曖昧さはバグの温床になります。
本記事では、実務で最初に徹底すべき基本テクニックとして
「Option Explicit の徹底」と「変数管理のコツ」
について具体的に解説します。
目次
1. Option Explicit とは? ― “宣言していない変数を使わせない仕組み”
Option Explicit とは、
すべての変数の宣言を必須にする VBA の命令 です。
標準モジュールやクラスモジュールの先頭に書きます。
Option Explicit
● 有効にするとどうなる?
- Dim を書かない変数は使用できない
- スペルミスによる誤動作を防げる
- 変数の型をきちんと意識して開発するようになる
特に誤記によるバグ(例:Cnt と Cunt を間違える)は
Option Explicit があるだけで ゼロにできます。
2. Option Explicit を自動で挿入する設定(必須)
毎回手動で書くのは現実的ではないため、
必ず VBE 設定で自動挿入を有効にします。
✔ 【手順】
- VBE を開く(Alt + F11)
- メニュー〔ツール〕→〔オプション〕
- 「変数の宣言を強制する」にチェック
これで新規モジュールには自動的に Option Explicit が挿入されます。
3. 変数管理の基本方針 ― スコープを明確にする
モジュールを分割すると、
「変数をどの範囲で使うべきか」が重要になります。
変数の扱いには 3つのスコープ(有効範囲) があります。
● ① プロシージャレベル(最小範囲)
Sub Sample()
Dim count As Long
End Sub
- 一番安全
- 再利用モジュールと相性が良い
- 基本はこの範囲で完結させるべき
● ② モジュールレベル(そのモジュール内で有効)
Option Explicit
Private mode As String
- 他モジュールから影響されない
- 状態保持に利用できる(ただし乱用は危険)
● ③ プロジェクト全体(Public)
Public UserName As String
- 依存関係を複雑化させる
- 再利用性を損なう
- 原則として避けるべき
4. “スコープ最小化”が保守性と再利用性を上げる
モジュール分割の目的は
コードの独立性を高めて、再利用しやすくすること
です。
そのためには、
✔ 変数はできるだけプロシージャ内で完結させる
これを徹底することで…
- 依存関係が減る
- 他モジュールへ影響しない
- コードの追跡が容易になる
実務では “Public の乱用” が最もトラブルを生むため要注意です。
5. 変数名のルールを決める ― 型の明示で可読性が向上
変数名は最初の3文字で型を示す「プレフィックス」方式がよく使われます。
例:
| 型 | 推奨プレフィックス | 例 |
|---|---|---|
| Long | lng | lngCount |
| String | str | strName |
| Boolean | bln | blnFlg |
| Range | rng | rngTarget |
もちろん強制ではありませんが、
モジュール間で統一しておくことが大切です。
6. 実務でありがちな失敗例と対策
● ❌ よくあるNGケース
Public tmp As Variant 'よく分からない変数が全体で使われている
結果 →
どこで値が変わったかわからなくなる。
再利用不可。
● ✔ 改善案
Sub Calculate()
Dim lngTmp As Long '用途が明確
End Sub
スコープが限定され、追跡しやすい。
7. 共通モジュールは「Public関数 + Private変数」が理想形
共通モジュールでは次の構造がもっとも安全で再利用性が高いです。
✔ 外から使わせたいもの → Public Function
✔ 内部でしか使わないもの → Private 変数・Private Sub
● 例:理想的な共通ユーティリティ
Option Explicit
'外部に公開(再利用できる)
Public Function SafeTrim(ByVal txt As Variant) As String
If IsError(txt) Then
SafeTrim = ""
Else
SafeTrim = Trim(CStr(txt))
End If
End Function
'内部専用(外部から呼ばせない)
Private Function IsValid(ByVal txt As Variant) As Boolean
IsValid = (txt <> "")
End Function
この構造によって
- 依存関係が整理され
- 公開すべき関数だけ外部に見える
- 内部処理は隠蔽される
というメリットが得られます。
8. まとめ
● 本記事のポイント
- Option Explicit は必ず有効にする
- 変数は原則プロシージャ内に閉じる
- Public 変数は依存関係を複雑にするため最小限に
- スコープ管理=保守性と再利用性の重要要素
- 共通モジュールは「Public 関数」+「Private 内部処理」が理想
コメント