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

Excel VBA VBA
スポンサーリンク

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)

  1. Excel に戻る(Alt + Q
  2. 「開発タブ → 挿入 → フォームコントロールのボタン」を配置
  3. 以下のように並べて、それぞれマクロを登録👇
ボタン名(表示文字)割り当てマクロ
▶ ローカル変数(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 も試してみましょう。


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