INDEX
Staticの概要
プロシージャ内で値を保持する変数を宣言する VBAの予約語 | ||
Static 概要 Static は、VBA でプロシージャ(Sub や Function)が終了しても値を保持し続ける変数を宣言するために使用されます。通常の わかりやすく説明 Static は、「一度作った変数の値を、次にこのプロシージャを呼び出したときも覚えておくよ!」という命令です。 |
||
|
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 の実行が終了するまで保持: マクロを停止・終了するとリセットされる。
- グローバルに値を保持したい場合はモジュールレベルの変数を使う: モジュール全体で変数を共有する場合は、
Dim
やPublic
を使用する。
よくある質問
- Q: Static を使うと変数の値はいつリセットされますか?
- A: マクロの実行が終了するまで値を保持します。ただし、VBA プロジェクトをリセットした場合は値が失われます。
- Q: Static はグローバル変数として使えますか?
- A: いいえ。Static はプロシージャ内でのみ有効です。グローバル変数として使う場合は
Public
やDim
をモジュールレベルで使用してください。 - Q: 複数の Static 変数を同じプロシージャ内で使えますか?
- A: はい。同じプロシージャ内で複数の Static 変数を宣言し、それぞれの値を保持できます。
- Q: Static 変数をリセットする方法はありますか?
- A: プロシージャ内ではリセットできません。VBA の実行を完全に停止するか、リセット(
Ctrl + Break
や VBA のリセットボタン)すると値がクリアされます。
まとめ
- Static は、プロシージャが終了しても値を保持する変数を宣言するために使用される。
- 関数や Sub を呼び出すたびに前回の値を維持できる。
- プロシージャ内でのみ有効で、他のプロシージャからは参照できない。
- プログラムの実行が終了すると、Static 変数の値はリセットされる。
- グローバルに値を保持したい場合は、モジュールレベルの変数を使うべき。