プロシージャの中で宣言するプロシージャレベル変数は、プロシージャが終了するとクリアされます。同じプロシージャを実行すると、宣言によって変数が使用できるようになりますが、このとき変数は初期化されるので、前回そのプロシージャを実行したときの値は残っていません。
Sub Sample44() Dim Number As Long MsgBox Number Number = Number + 1 MsgBox Number End Sub
上記のプロシージャは、実行するたびに「0」と「1」が表示されます。
【1回目】
【2回目】
そうではなく、プロシージャが終了しても変数の値を保持して、次に同じプロシージャが実行されたとき、直前の値が格納されたままにするには、静的変数を使います。静的変数は、Staticステートメントを使って変数を宣言します。
Sub Sample45() Static Number As Long MsgBox Number Number = Number + 1 MsgBox Number End Sub
【1回目】
【2回目】
静的変数は、プロシージャレベルの変数としてしか宣言できません。すべてのプロシージャで使用できるモジュールレベル変数や、パブリック変数などは、静的変数にできません。
静的変数は、どんな状況でも必ず値を保持するわけではありません。たとえば、上記Sample45を続けて実行すると、確かに変数Numberは直前の値を保持します。しかし、
Sub Sample46() End Sub
のように、新しいプロシージャを作成すると、静的変数Numberはクリアされます。これは、新しいプロシージャを作成したとこで、VBAプロジェクト全体が再コンパイルされたからです。また、Endステートメントを実行すると、やはり静的変数はクリアされます。
Sub Sample46() Static Number As Long MsgBox Number Number = Number + 1 If MsgBox(Number & vbCrLf & "値をクリアしますか?", vbYesNo) = vbYes Then End End If End Sub
VBやC#などのプログラミング言語と違って、Excel VBAではセルという超便利なオブジェクトを使えますから、静的変数を多用する機会はそれほど多くないと思います。前回の値を保持したいのなら、セルに入れておけばいいのですから。