値が消えない静的変数


プロシージャの中で宣言するプロシージャレベル変数は、プロシージャが終了するとクリアされます。同じプロシージャを実行すると、宣言によって変数が使用できるようになりますが、このとき変数は初期化されるので、前回そのプロシージャを実行したときの値は残っていません。

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ではセルという超便利なオブジェクトを使えますから、静的変数を多用する機会はそれほど多くないと思います。前回の値を保持したいのなら、セルに入れておけばいいのですから。