Excel VBA スコープ練習(拡張版)
'=============================
' Excel VBA 変数スコープ 練習用
'=============================
' --- モジュールレベル変数 ---
Dim num As Integer
' --- ローカル変数の例 ---
Sub Sample1()
Dim num As Integer
num = 10
MsgBox "Sample1 の num = " & num, vbInformation, "ローカル変数(Sample1)"
End Sub
Sub Sample2()
' ローカル変数を宣言していない → エラーになる例
On Error Resume Next
MsgBox "Sample2 の num = " & num, vbInformation, "ローカル変数アクセス"
If Err.Number <> 0 Then
MsgBox "エラー!Sample2 からは num が見えません。", vbExclamation, "スコープ外"
Err.Clear
End If
End Sub
' --- モジュール変数の例 ---
Sub Sample3()
num = 10
MsgBox "Sample3 の num = " & num, vbInformation, "モジュール変数の設定"
End Sub
Sub Sample4()
num = num + 5
MsgBox "Sample4 の num = " & num, vbInformation, "モジュール変数の参照"
End Sub
' --- ローカル変数とモジュール変数の同名例 ---
Sub Sample5()
Dim num As Integer
num = 50
MsgBox "Sample5 のローカル num = " & num, vbInformation, "ローカル優先"
End Sub
Sub Sample6()
MsgBox "Sample6 のモジュール num = " & num, vbInformation, "モジュール変数の値"
End Sub
VB「変数スコープ練習ブック(Module1)」に
Public変数とStatic変数も追加して比較できる拡張版を作りましょう。
以下の手順で、同じファイル内に追記してOKです。
これで「ローカル/モジュール/Public/Static」を一目で比較できます。
手順
① VBEで新しいモジュールを追加
- Excelで
Alt + F11を押してVBEを開く - メニューから「挿入」→「標準モジュール」
- 名前が「Module2」になるはずです
ここでは「Public変数」用のサンプルを入れます。
🌐 【Public変数の例】(Module2に貼り付け)
'=============================
' Public変数の練習(全モジュール共通)
'=============================
Public gCount As Integer ' ← すべてのモジュールからアクセス可能
Sub PublicSet()
gCount = 5
MsgBox "PublicSet: gCount = " & gCount, vbInformation, "Public変数の設定"
End Sub
Sub PublicAdd()
gCount = gCount + 2
MsgBox "PublicAdd: gCount = " & gCount, vbInformation, "Public変数の加算"
End Sub
Sub PublicShow()
MsgBox "PublicShow: 現在の gCount = " & gCount, vbInformation, "Public変数の参照"
End Sub
VB💡 ポイント
Publicは 全モジュール共通で利用可能。Module1で作ったDim num As Integerとは独立。- 他のモジュールから
gCountを直接参照できる。
② Static変数の確認用コード(Module1に追記)
Module1に次を追加してください👇
'=============================
' Static変数の練習
'=============================
Sub StaticSample()
Static sCount As Integer
sCount = sCount + 1
MsgBox "StaticSample 実行回数: " & sCount, vbInformation, "Static変数"
End Sub
Sub ResetStatic()
' Static変数は自動初期化できないため、再宣言で新規作成しか方法なし。
' (ここではメッセージだけ表示)
MsgBox "Static変数はリセットできません(再起動時にクリアされます)", vbInformation, "注意"
End Sub
VB💡 ポイント
Static変数は プロシージャ内で宣言しても値が保持される。- 同じマクロを連続で実行すると、カウンタが増えていく。
- Excelを閉じるかVBAをリセット(Ctrl+Break → Reset)するとクリアされる。
③ Excelシートにボタンを追加
シートに新しいボタンを追加し、以下のマクロを割り当てましょう👇
| ボタン名 | 割り当てマクロ | 説明 |
|---|---|---|
| ▶ PublicSet | PublicSet | Public変数を5に設定 |
| ▶ PublicAdd | PublicAdd | Public変数に+2 |
| ▶ PublicShow | PublicShow | 現在のPublic値を表示 |
| ▶ StaticSample | StaticSample | 実行回数を表示(カウントアップ) |
| ▶ ResetStatic | ResetStatic | Staticの注意メッセージ |
比較表まとめ
| 宣言場所/キーワード | 有効範囲 | 値の保持 | 主な用途 | 例 |
|---|---|---|---|---|
Dim(Sub内) | そのSub内のみ | 終了で破棄 | 一時的変数 | Dim x As Integer |
Static(Sub内) | そのSub内のみ | 継続保持 | カウンタなど | Static s As Integer |
Dim(モジュール外) | モジュール内全体 | 継続保持 | Sub間共有 | Dim num As Integer |
Public(モジュール外) | 全モジュール共有 | 継続保持 | 全体設定など | Public gCount As Integer |
体験のおすすめ実験順序
- Sample1~Sample6(Module1)でローカル・モジュール変数の動作確認
- PublicSet → PublicAdd → PublicShow(Module2)を実行してPublic共有を体験
- StaticSample を何度も押して、Static変数が保持されるのを確認
補足Tips
| トピック | 内容 |
|---|---|
| 🔸 Public変数 | 全ブック共通ではない。ブックごとに独立。 |
| 🔸 Static変数 | 実行停止(リセット)まで生き続ける。 |
| 🔸 命名規則 | Public: gCount / モジュール: mNum / ローカル: lTmp など区別を付けると混乱防止。 |
| 🔸 安全設計 | グローバル変数を乱用せず、できるだけ引数で受け渡すのが良い設計。 |
これで完成です!
この1つのExcelブックで、次の全範囲を比較できます:
- ✅ ローカル変数
- ✅ モジュール変数
- ✅ Public変数(全モジュール共有)
- ✅ Static変数(保持型ローカル変数)

