Excel VBA | 変数のスコープ(適用範囲)

Excel VBA VBA
スポンサーリンク

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で新しいモジュールを追加

  1. Excelで Alt + F11 を押してVBEを開く
  2. メニューから「挿入」→「標準モジュール」
  3. 名前が「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シートにボタンを追加

シートに新しいボタンを追加し、以下のマクロを割り当てましょう👇

ボタン名割り当てマクロ説明
▶ PublicSetPublicSetPublic変数を5に設定
▶ PublicAddPublicAddPublic変数に+2
▶ PublicShowPublicShow現在のPublic値を表示
▶ StaticSampleStaticSample実行回数を表示(カウントアップ)
▶ ResetStaticResetStaticStaticの注意メッセージ

比較表まとめ

宣言場所/キーワード有効範囲値の保持主な用途
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

体験のおすすめ実験順序

  1. Sample1~Sample6(Module1)でローカル・モジュール変数の動作確認
  2. PublicSet → PublicAdd → PublicShow(Module2)を実行してPublic共有を体験
  3. StaticSample を何度も押して、Static変数が保持されるのを確認

補足Tips

トピック内容
🔸 Public変数全ブック共通ではない。ブックごとに独立。
🔸 Static変数実行停止(リセット)まで生き続ける。
🔸 命名規則Public: gCount / モジュール: mNum / ローカル: lTmp など区別を付けると混乱防止。
🔸 安全設計グローバル変数を乱用せず、できるだけ引数で受け渡すのが良い設計。

これで完成です!
この1つのExcelブックで、次の全範囲を比較できます:

  • ✅ ローカル変数
  • ✅ モジュール変数
  • ✅ Public変数(全モジュール共有)
  • ✅ Static変数(保持型ローカル変数)

タイトルとURLをコピーしました