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(ローカル変数) | LocalCount | Subを呼ぶたびにリセットされる |
| ▶ Static(保持される) | StaticCount | 呼び出し間で値が保持される |
| ▶ Module(モジュール変数) | ModuleCount | 同モジュール内で共有される |
| ▶ Public(全体スコープ) | PublicCount | 全モジュールで共有される |
| 🔄 Reset | ResetAll | 値をリセット(Staticは除外) |
💡ヒント:ボタンを色分けすると理解しやすい
- 青:ローカル
- 緑:Static
- 黄:モジュール
- 赤:Public
- 灰:Reset
実行テスト
| ボタン | 実行1回目 | 実行2回目 | 特徴 |
|---|---|---|---|
| Dim(Local) | 1 | 1 | Sub 終了で変数破棄 |
| Static | 1 | 2 | Sub 終了後も値保持 |
| Module | 1 | 2 | モジュール全体で保持 |
| Public | 1 | 2 | 他モジュールからも共有可能 |
| Reset | 全部 0 に戻る(Static除外) | — | Static はリセットされない |
学びのまとめ
| 宣言方法 | 有効範囲 | 値の保持 | 他モジュールから参照 | 主な用途 |
|---|---|---|---|---|
Dim(Sub内) | その Sub 内のみ | ❌ 毎回初期化 | ❌ | 一時的処理 |
Static(Sub内) | その Sub 内のみ | ✅ 保持される | ❌ | 呼び出し間で値維持 |
Dim(モジュール外) | モジュール全体 | ✅ 保持される | ❌ | モジュール間共有 |
Public | 全プロジェクト | ✅ 保持される | ✅ | 全体設定・カウンタなど |
応用アイデア
Module2を追加してMsgBox gCountを呼び出すと、Public変数の共有を実感できます。- Static変数だけが
ResetAllの影響を受けない点も重要。

