忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBA】Static(静的変数)の使い方!プロシージャが終わっても値を保持する魔法の宣言

通常、VBAのプロシージャ内で Dim を使って宣言した変数は、処理が終わるとメモリから消去され、値はリセットされます。しかし、Static キーワードを使うと、プロシージャが終了しても値を保持し続けることができます。実行回数をカウントしたり、前回の状態を引き継ぎたい時に非常に便利です。

1. 基本概念:静的変数(Static)とは?

静的変数は、マクロが実行されている間、そのプロシージャ専用の「個別のメモリ領域」に居座り続けます。他のプロシージャからは見えない(カプセル化されている)のに、値は消えないという特性を持っています。

[ 特徴 ]
・プロシージャが終了しても値が破棄されない。
・そのプロシージャ内からしかアクセスできない(安全性が高い)。
・ブックを閉じたり、コードを書き換えてリセット(終了)ボタンを押すと初期化される。

2. 実践サンプル:呼び出し回数をカウントする

ポイント:Dim の代わりに Static を使うだけ!

以下の例では、Sub1 が呼ばれるたびに変数 x がカウントアップされます。Dim であれば毎回 1 に戻りますが、Static なので増え続けます。

' --- 呼び出される側のプロシージャ ---
Sub Sub1()
  Static x As Integer  ' 静的変数の宣言

  x = x + 1
  Debug.Print x
End Sub

' --- 実行用プロシージャ ---
Sub Sub2()
  Dim i As Integer
  
  ' 10回連続で Sub1 を呼び出す
  For i = 1 To 10
    Call Sub1
  Next i
End Sub

3. 実行結果

Sub2 を実行すると、イミディエイトウィンドウにはリセットされることなく加算された結果が表示されます。

1
2
3
4
5
6
7
8
9
10

4. エンジニアの視点:モジュールレベル変数との使い分け

1. ここがメリット!: 値を保持するためにモジュールの一番上で Public や Private 変数を使うこともできますが、それだと「他のプロシージャから間違えて書き換えられる」リスクがあります。Static はそのプロシージャ内に閉じているため、影響範囲を最小限に抑えられます。
2. 実務での活用例: ログ出力の連番振り、再帰処理の深さ制限、または「初回呼び出し時のみ実行したい初期化処理」のフラグ管理(Static isInitialized As Boolean)などに非常に有効です。
3. Javaエンジニアの視点: メソッド内の static 変数に近い挙動です。状態(State)をプロシージャレベルで保持できるため、クラスを作るまでもないちょっとした「記憶機能」を実装するのに最適で「いけいけ」な手法です。


5. まとめ

「プロシージャを抜けても値を忘れてほしくない」。そんな時は Static の出番です。グローバル変数を無暗に増やさず、必要な場所だけで値を保持するこのテクニックをマスターして、より堅牢でスマートなVBAプログラムを目指しましょう。


PR