【VBA】Option Explicit の徹底と変数管理|スコープ設計でバグを防ぐ基本

モジュールの分割と再利用 ― 共通処理を別モジュールへ

VBA を安全・正確・効率的に運用するために欠かせないのが
Option Explicit(変数宣言の強制) と
体系的な変数管理 です。

特にモジュールを分割して再利用性を高める場合、
変数の曖昧さはバグの温床になります。

本記事では、実務で最初に徹底すべき基本テクニックとして
「Option Explicit の徹底」と「変数管理のコツ」
について具体的に解説します。


スポンサーリンク

1. Option Explicit とは? ― “宣言していない変数を使わせない仕組み”

Option Explicit とは、
すべての変数の宣言を必須にする VBA の命令 です。

標準モジュールクラスモジュール先頭に書きます。

Option Explicit

● 有効にするとどうなる?

  • Dim を書かない変数は使用できない
  • スペルミスによる誤動作を防げる
  • 変数の型をきちんと意識して開発するようになる

特に誤記によるバグ(例:Cnt と Cunt を間違える)は
Option Explicit があるだけで ゼロにできます


スポンサーリンク

2. Option Explicit を自動で挿入する設定(必須)

毎回手動で書くのは現実的ではないため、
必ず VBE 設定で自動挿入を有効にします。


✔ 【手順】

  1. VBE を開く(Alt + F11)
  2. メニュー〔ツール〕→〔オプション〕
  3. 「変数の宣言を強制する」にチェック

これで新規モジュールには自動的に 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文字で型を示す「プレフィックス」方式がよく使われます。

例:

推奨プレフィックス
LonglnglngCount
StringstrstrName
BooleanblnblnFlg
RangerngrngTarget

もちろん強制ではありませんが、
モジュール間で統一しておくことが大切です。


スポンサーリンク

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 内部処理」が理想

コメント

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