VBAのStaticで変数の値を維持する方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

Staticの概要

プロシージャ内で値を保持する変数を宣言する VBAの予約語

Static

概要 Static は、VBA でプロシージャ(Sub や Function)が終了しても値を保持し続ける変数を宣言するために使用されます。通常の Dim で宣言された変数はプロシージャの実行が終わるとリセットされますが、Static を使うと、次回の実行時にも前回の値を保持できます。

わかりやすく説明 Static は、「一度作った変数の値を、次にこのプロシージャを呼び出したときも覚えておくよ!」という命令です。

  • プロシージャが終了しても、変数の値がリセットされない。
  • ローカル変数として使用しながら、値を保持できる。
  • モジュールレベルの変数(DimPrivate)とは異なり、プロシージャ内でのみ有効。

Static の基本的な使い方

Static を使って、プロシージャを呼び出すたびにカウントアップする例です。

Sub ExampleStatic()
    Static counter As Integer ' 値を保持するカウンター変数
    
    counter = counter + 1
    MsgBox "カウント: " & counter, vbInformation, "Static 変数の例"
End Sub

解説:

  • Static counter As Integer を使うと、プロシージャを実行するたびに値が増加する。
  • 通常の Dim counter As Integer だと、毎回 1 からリセットされる。

Static を使って関数の前回の結果を保持する

Static を使って、関数が前回の結果を記憶しながら動作する例です。

Function RunningTotal(value As Integer) As Integer
    Static total As Integer ' 累積値を保持
    
    total = total + value
    RunningTotal = total
End Function

解説:

  • この関数を呼び出すたびに、前回の合計が保持される。
  • Static total As Integer を使うことで、関数が終了しても値をリセットしない。

Static を使った Excel のセル操作

Static を使って、ボタンをクリックするたびにカウントアップし、Excel のセルに反映する例です。

Sub CountButtonClick()
    Static clickCount As Integer
    
    clickCount = clickCount + 1
    Range("A1").Value = clickCount
End Sub

解説:

  • ボタンをクリックするたびに、セル A1 の値が増加する。
  • Static を使わない場合、毎回 1 からリセットされてしまう。

エラーを回避する方法

Static 変数を使用する際、意図しない初期化ミスを防ぐ方法を紹介します。

Sub SafeStaticExample()
    Static counter As Integer
    
    ' 変数の値が異常に大きくなった場合、リセット
    If counter > 1000 Then counter = 0
    
    counter = counter + 1
    MsgBox "カウント: " & counter, vbInformation, "安全な Static 変数"
End Sub

解説:

  • カウンターが 1000 を超えた場合にリセットすることで、誤動作を防ぐ。

Static の注意事項

  • Static はプロシージャ内でのみ有効: モジュールレベルの変数とは異なり、他のプロシージャからは参照できない。
  • 値は VBA の実行が終了するまで保持: マクロを停止・終了するとリセットされる。
  • グローバルに値を保持したい場合はモジュールレベルの変数を使う: モジュール全体で変数を共有する場合は、DimPublic を使用する。

よくある質問

Q: Static を使うと変数の値はいつリセットされますか?
A: マクロの実行が終了するまで値を保持します。ただし、VBA プロジェクトをリセットした場合は値が失われます。
Q: Static はグローバル変数として使えますか?
A: いいえ。Static はプロシージャ内でのみ有効です。グローバル変数として使う場合は PublicDim をモジュールレベルで使用してください。
Q: 複数の Static 変数を同じプロシージャ内で使えますか?
A: はい。同じプロシージャ内で複数の Static 変数を宣言し、それぞれの値を保持できます。
Q: Static 変数をリセットする方法はありますか?
A: プロシージャ内ではリセットできません。VBA の実行を完全に停止するか、リセット(Ctrl + Break や VBA のリセットボタン)すると値がクリアされます。

まとめ

  • Static は、プロシージャが終了しても値を保持する変数を宣言するために使用される。
  • 関数や Sub を呼び出すたびに前回の値を維持できる。
  • プロシージャ内でのみ有効で、他のプロシージャからは参照できない。
  • プログラムの実行が終了すると、Static 変数の値はリセットされる。
  • グローバルに値を保持したい場合は、モジュールレベルの変数を使うべき。