【VBAスタンダード対策】状態を保持する「Static変数」の構造を攻略!
通常、Subプロシージャ内で宣言された変数は、End Sub に到達した瞬間にメモリから消滅します。しかし、Static キーワードを使って宣言された変数は、プロシージャが終了してもその値をメモリ上に維持し続けます。この「静的な保持」の仕組みを理解しましょう。
1. 問題:実行をまたぐ数値の変化
【 問題 】 以下のSubプロシージャ Accumulate を、他の場所から2回連続で呼び出したとします。2回目の実行時に、メッセージボックスに表示される数値はいくつでしょうか?
Static total As Integer
Dim subTotal As Integer
total = total + 10
subTotal = subTotal + 10
MsgBox total
End Sub
① 0 ② 10 ③ 20 ④ エラーになる
2. 正解:変数の初期化と保持に関する正解
正解: ③ 20
3. 解説:なぜ「20」になるのか?
通常の Dim で宣言された subTotal は、End Sub のたびにリセットされますが、Static で宣言された total は前回の値を引き継ぎます。1回目で10になり、2回目でさらに10が加算されるため、結果は20となります。
1回目実行:
[開始] total(0) -> [加算] total(10) -> [終了] 保持
2回目実行:
[開始] total(10) -> [加算] total(20) -> [終了] 保持
[ Dimとの構造的な違い ]
★ Dim 変数:End Subでメモリが解放され、次回はまた0(初期値)から始まる。
★ Static 変数:End Subを通ってもメモリが解放されず、ブックを閉じるまで値を維持する。
1. ここが試験に出る!: 試験では「変数の有効範囲(スコープ)」と「生存期間(ライフサイクル)」が混同しやすいポイントとして狙われます。Static変数は「そのSubの中でしか使えない(ローカルスコープ)」けれど、「値は消えない(モジュールレベル並みの寿命)」という特殊な構造を持っていることを押さえましょう。
2. エンジニアの視点: 仰る通り、実務では「誰がいつこの値を書き換えたか」が不透明になりやすく、バグの温床になりがちです。Java 17のクラス変数に近いですが、より影響範囲を限定した「状態を持つメソッド」を作りたい時に使われます。ただ、可読性を優先するなら、モジュールレベル変数にするか、引数で値を回す方が「理系NEO」な綺麗な設計と言えますね。
4. まとめ
「Static = End Subを越えて記憶する」。この構造を理解すれば、実行回数のカウントや累積計算など、フラグ管理が容易になります。減数分裂が特定の情報を次へ繋ぐように、VBAも Static を使うことで、プロシージャの枠を超えて「状態」を維持することができるのです。