Excel VBA | 変数スコープ 練習用 Excel ファイル を作る

Excel VBA VBA
スポンサーリンク

Public / Static / Dim の動作を見比べて理解

「Public / Static / Dim(ローカル)」の3種類のスコープを直接比較できる学習支援モード付きマクロ
を紹介します。

セットアップ

1️⃣ Excel を開いて新しいブックを作成
2️⃣ .xlsm(マクロ有効ブック)で保存(例:VBA_Scope_Compare.xlsm
3️⃣ Alt + F11 → 標準モジュールを挿入
4️⃣ 以下のコードを Module1 に貼り付けてください👇


コード全文

'========================================
' Excel VBA:スコープ比較(Public / Static / Dim)
'========================================

' --- Public 変数(全モジュール共通) ---
Public gCount As Integer

' --- モジュールレベル変数(モジュール内で共有) ---
Dim mCount As Integer

'---------------------------------------------
' 【1】ローカル変数(Dim)
'---------------------------------------------
Sub LocalCount()
    Dim count As Integer
    count = count + 1
    MsgBox "ローカル変数 count の値:" & count, vbInformation, "Dim(ローカル変数)"
    MsgBox "【解説】毎回 Sub 実行のたびに変数が作られ、終了後は破棄されます。" & vbCrLf & _
           "そのため、毎回 1 からスタートします。", vbOKOnly, "学習ポイント"
End Sub


'---------------------------------------------
' 【2】Static 変数(Sub 内で宣言・値保持)
'---------------------------------------------
Sub StaticCount()
    Static count As Integer
    count = count + 1
    MsgBox "Static 変数 count の値:" & count, vbInformation, "Static(保持される)"
    MsgBox "【解説】Static 変数は Sub の中で宣言されていますが、" & vbCrLf & _
           "次回呼び出し時も前回の値を保持します。", vbOKOnly, "学習ポイント"
End Sub


'---------------------------------------------
' 【3】モジュール変数(Dim)
'---------------------------------------------
Sub ModuleCount()
    mCount = mCount + 1
    MsgBox "モジュール変数 mCount の値:" & mCount, vbInformation, "モジュールスコープ"
    MsgBox "【解説】この mCount は Module1 の先頭で宣言されているため、" & vbCrLf & _
           "Module1 内のすべての Sub で共有されます。" & vbCrLf & _
           "Sub を抜けても値は保持されます。", vbOKOnly, "学習ポイント"
End Sub


'---------------------------------------------
' 【4】Public 変数(全モジュールで共有)
'---------------------------------------------
Sub PublicCount()
    gCount = gCount + 1
    MsgBox "Public 変数 gCount の値:" & gCount, vbInformation, "Public(全体スコープ)"
    MsgBox "【解説】Public 変数は全モジュールで共通です。" & vbCrLf & _
           "他のモジュールやフォームからもアクセスできます。", vbOKOnly, "学習ポイント"
End Sub


'---------------------------------------------
' 【5】リセット用(すべてのカウンタを初期化)
'---------------------------------------------
Sub ResetAll()
    gCount = 0
    mCount = 0
    MsgBox "全てのカウンタ(Public / Module)を 0 にリセットしました。", vbInformation, "リセット完了"
    MsgBox "【解説】Static 変数はリセットされません。" & vbCrLf & _
           "StaticCount だけは独立して値を保持し続けます。", vbOKOnly, "学習ポイント"
End Sub
VB

シートUI(操作ボタン)

1️⃣ Excel に戻る (Alt + Q)
2️⃣ 「開発タブ → 挿入 → フォームコントロールのボタン」を使って以下を配置👇

ボタン名(表示文字)割り当てマクロ説明
▶ Dim(ローカル変数)LocalCountSubを呼ぶたびにリセットされる
▶ Static(保持される)StaticCount呼び出し間で値が保持される
▶ Module(モジュール変数)ModuleCount同モジュール内で共有される
▶ Public(全体スコープ)PublicCount全モジュールで共有される
🔄 ResetResetAll値をリセット(Staticは除外)

💡ヒント:ボタンを色分けすると理解しやすい

  • 青:ローカル
  • 緑:Static
  • 黄:モジュール
  • 赤:Public
  • 灰:Reset

実行テスト

ボタン実行1回目実行2回目特徴
Dim(Local)11Sub 終了で変数破棄
Static12Sub 終了後も値保持
Module12モジュール全体で保持
Public12他モジュールからも共有可能
Reset全部 0 に戻る(Static除外)Static はリセットされない

学びのまとめ

宣言方法有効範囲値の保持他モジュールから参照主な用途
Dim(Sub内)その Sub 内のみ❌ 毎回初期化一時的処理
Static(Sub内)その Sub 内のみ✅ 保持される呼び出し間で値維持
Dim(モジュール外)モジュール全体✅ 保持されるモジュール間共有
Public全プロジェクト✅ 保持される全体設定・カウンタなど

応用アイデア

  • Module2 を追加して MsgBox gCount を呼び出すと、Public変数の共有を実感できます。
  • Static変数だけが ResetAll の影響を受けない点も重要。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました