Excel VBA スコープ学習支援モード付きマクロ
クリックしたボタンごとに
- 実行結果(MsgBox)
- そしてその後に「なぜそうなったのか?」という解説メッセージ
が表示されます。
全コード(Module1 に貼り付け)
'====================================
' Excel VBA 変数スコープ 学習支援モード
'====================================
' --- モジュールレベル変数 ---
Dim num As Integer
'--------------------------------
' ローカル変数の例
'--------------------------------
Sub Sample1()
Dim num As Integer
num = 10
MsgBox "Sample1 の num = " & num, vbInformation, "ローカル変数"
MsgBox "【解説】この num は Sample1 内でだけ使える変数です。" & vbCrLf & _
"他の Sub では同じ名前でも別物になります。", vbOKOnly, "学習ポイント"
End Sub
Sub Sample2()
On Error Resume Next
MsgBox "Sample2 の num = " & num, vbInformation, "ローカル変数アクセス"
If Err.Number <> 0 Then
MsgBox "エラー!Sample2 からは num が見えません。", vbExclamation, "スコープ外"
MsgBox "【解説】Sample2 では num が宣言されていないため、" & vbCrLf & _
"Sample1 の num にはアクセスできません。" & vbCrLf & _
"これはプロシージャのスコープ(有効範囲)の違いです。", vbOKOnly, "学習ポイント"
Err.Clear
End If
End Sub
'--------------------------------
' モジュールレベル変数の例
'--------------------------------
Sub Sample3()
num = 10
MsgBox "Sample3 の num = " & num, vbInformation, "モジュール変数の設定"
MsgBox "【解説】この num はモジュールの先頭で宣言されています。" & vbCrLf & _
"そのため、同じモジュール内の他の Sub からも参照できます。", vbOKOnly, "学習ポイント"
End Sub
Sub Sample4()
num = num + 5
MsgBox "Sample4 の num = " & num, vbInformation, "モジュール変数の参照"
MsgBox "【解説】前回 Sample3 で設定した num(10) が保持されています。" & vbCrLf & _
"モジュール変数は Sub を抜けても値が消えません。", vbOKOnly, "学習ポイント"
End Sub
'--------------------------------
' 同名変数(ローカル優先)
'--------------------------------
Sub Sample5()
Dim num As Integer
num = 50
MsgBox "Sample5 のローカル num = " & num, vbInformation, "ローカル優先"
MsgBox "【解説】モジュールにも num が定義されていますが、" & vbCrLf & _
"Sub 内で再度 Dim すると、こちらのローカル変数が優先されます。" & vbCrLf & _
"同じ名前でも別の変数として扱われます。", vbOKOnly, "学習ポイント"
End Sub
Sub Sample6()
MsgBox "Sample6 のモジュール num = " & num, vbInformation, "モジュール変数の確認"
MsgBox "【解説】Sample5 のローカル変数は Sub 終了時に消えています。" & vbCrLf & _
"ここで表示されているのはモジュール変数の num(15 のまま)です。", vbOKOnly, "学習ポイント"
End Sub
'--------------------------------
' リセット用マクロ
'--------------------------------
Sub ResetNum()
num = 0
MsgBox "モジュール変数 num を 0 にリセットしました。", vbInformation, "リセット完了"
MsgBox "【解説】モジュール変数は明示的に初期化しない限り、" & vbCrLf & _
"前回の値を保持し続けます。リセットで動作をやり直せます。", vbOKOnly, "学習ポイント"
End Sub
VBシート設定(学習用UI)
- Excel に戻る(
Alt + Q) - 「開発タブ → 挿入 → フォームコントロールのボタン」を配置
- 以下のように並べて、それぞれマクロを登録👇
| ボタン名(表示文字) | 割り当てマクロ |
|---|---|
| ▶ ローカル変数(Sample1) | Sample1 |
| ▶ スコープ外エラー確認(Sample2) | Sample2 |
| ▶ モジュール変数代入(Sample3) | Sample3 |
| ▶ モジュール変数参照(Sample4) | Sample4 |
| ▶ ローカル優先(Sample5) | Sample5 |
| ▶ モジュール確認(Sample6) | Sample6 |
| 🔄 Reset(リセット) | ResetNum |
🪄 ボタンの色を変えたり、枠線で囲って「ローカル」「モジュール」などのグループ分けをするとわかりやすいです。
実行時の学習フロー
| ボタン | 学べること | 表示される説明 |
|---|---|---|
| Sample1 | ローカル変数 | 「Sub 内でしか使えない」 |
| Sample2 | スコープ外アクセス | 「他のSubからは見えない」 |
| Sample3 | モジュール変数の初期化 | 「全Subで共有される」 |
| Sample4 | モジュール変数の保持 | 「Subを超えて値が残る」 |
| Sample5 | 同名変数の優先順位 | 「ローカルが優先される」 |
| Sample6 | モジュール変数の確認 | 「ローカルは消えている」 |
| ResetNum | 初期化 | 「モジュール変数を0に戻す」 |
追加ヒント(上級者向け発展)
- もし全モジュール共通の変数を使いたい場合は
Public num As Integerに変更。 - もしSub内で値を保持したいだけなら
Static num As Integerも試してみましょう。

