Excel VBA で処理を作っていると、「前回の値を保持したまま次の処理に活かしたい」と感じる場面が必ず訪れます。普通の変数(Dim)では、プロシージャを実行するたびに値が初期化されてしまいます。そのため「前回の値を覚えておいて」「実行のたびに値を少しずつ変化させていく」といった処理は実現できません。
このようなときに活躍するのが Static変数 です。
Static変数は、プロシージャが終了しても “値を保持し続ける” 特殊な変数で、ループ処理やカウンタ処理、イベント処理、フラグ管理など、さまざまな用途で使える非常に便利な仕組みです。
実務では「ボタンを押すたびにメッセージを変えたい」「前回の値との差を取得したい」「連続入力の整合性を管理したい」など、Static変数が大きな効果を発揮する場面が多くあります。
この記事では、Static変数の仕組み・使い方・Dimとの違い・実務での活用例・注意点まで、はじめての方でも確実に使いこなせるように深堀りして解説していきます。
目次
- ✅ Static変数とは?プロシージャをまたいで値を保持する特別な変数
- ・Static変数は「プロシージャ終了後も値を保持し続ける変数」
- ・普通(Dim)と何が違うのか?
- ・Static変数の基本構文
- ✅ Static変数の動作を確認する基本サンプル
- ・Static変数の動きを理解する最も簡単な例
- 【動作】
- ✔ なぜStatic変数は値を保持できるのか?
- ✅ StaticとDimとPublicの違い(実務で必ず知るべき比較)
- ・Dim:毎回初期化される
- ・Public(モジュールレベル変数):どこからでも参照可能
- ・Static:値が保持されるが範囲は“そのプロシージャだけ”
- ✅ Static変数が実務で役立つ場面(非常に多い)
- ✅ Static変数を使った具体的な実務サンプル(6例)
- 【例①】カウンタ処理を継続する
- 【例②】前回の値を保持して増減を判断する
- 【例③】初回のみ実行する処理
- 【例④】イベント発火の回数管理(Worksheet_Change)
- 【例⑤】重複検知時に“最初の1回だけ”警告を出したい場合
- 【例⑥】ループの中で“最初の値”を保持する
- ✅ Static変数が役立つExcel業務の具体例(実務視点)
- ❗ Static変数の注意点(必ず押さえる)
- 🧠 Static変数とPublic変数の使い分け(実務の最適解)
- 🧠 RPA(UiPath / Power Automate)との親和性が高い理由
- 🧠 ChatGPT 生成コードにStatic変数を組み込むとさらに便利
- 🟩 実務で使える Static変数入りテンプレート(12種類)
- ① 連続実行カウンタ
- ② 初回だけメッセージ表示
- ③ 前回値との比較
- ④ 同一データの連続入力チェック
- ⑤ ボタン連打制御(高速連打防止)
- ⑥ イベント多重発火の防止フラグ
- ⑦ 初回ループの記録値保持
- ⑧ 処理速度測定のスタート時間を保持
- ⑨ エラーが初めて出たときだけログ記録
- ⑩ 複数シートにまたがる連続番号管理
- ⑪ グループ単位の初期処理制御
- ⑫ "今日の初回" だけ特定処理を実行
- ✅ まとめ:【Static変数】は“値を保持したまま処理を継続する”最強のローカル変数
✅ Static変数とは?プロシージャをまたいで値を保持する特別な変数
・Static変数は「プロシージャ終了後も値を保持し続ける変数」
通常の変数(Dim)は、プロシージャが終わると破棄されます。しかし Static変数は、次に同じプロシージャが呼び出された時に「前回の値」をそのまま使えます。
・普通(Dim)と何が違うのか?
| 種類 | プロシージャ終了後 | 値の扱い |
|---|---|---|
| Dim | 値は破棄される | 初期化される |
| Static | 値が保持される | 前回の値から続ける |
Staticは、ローカル変数でありながら「グローバル変数のように記憶を持つ」という特徴があるのがポイントです。
・Static変数の基本構文
Static 変数名 As 型
Dim と書く部分を Static に変えるだけで、値の保持が可能になります。
✅ Static変数の動作を確認する基本サンプル
・Static変数の動きを理解する最も簡単な例
Sub TestStatic()
Static count As Long
count = count + 1
MsgBox count
End Sub
【動作】
このプロシージャを3回実行すると:
1回目 → 1
2回目 → 2
3回目 → 3
と、前回の結果を次に引き継いでいることが分かります。
✔ なぜStatic変数は値を保持できるのか?
Static変数は「同じプロシージャ内でのみ有効な持続変数」としてメモリに保持されます。
プロシージャが終わっても解放されず、モジュール内に保存された状態をキープします。
ただし、以下の制限があります:
- プロシージャ内でのみ有効(外部からはアクセス不可)
- Excelが再起動されると値はリセットされる
- プロシージャが別のモジュールにある場合は共有されない
つまり “同じ処理の中で継続して使えるローカル変数” というイメージです。
✅ StaticとDimとPublicの違い(実務で必ず知るべき比較)
・Dim:毎回初期化される
Sub TestDim()
Dim x As Long
x = x + 1
MsgBox x
End Sub
毎回
1 → 1 → 1
と表示されます。
・Public(モジュールレベル変数):どこからでも参照可能
Public x As Long
- どのプロシージャからでも使える
- 値が保持される
- 使いすぎると可読性が下がる
・Static:値が保持されるが範囲は“そのプロシージャだけ”
Staticは Dim と Public の良いところを組み合わせたような仕組みです。
| 種類 | 値の保持 | 参照可能範囲 | 用途 |
|---|---|---|---|
| Dim | × | プロシージャ内 | 一時的な値 |
| Static | ◎ | プロシージャ内 | 継続カウンタなど |
| Public | ◎ | どこでも | グローバル設定値 |
Staticは「ローカルなのに永続する」点が特徴です。
参考:【VBA】Dimとは?変数宣言の基本と書き方をわかりやすく解説|初心者でも実務で使える知識を解説
✅ Static変数が実務で役立つ場面(非常に多い)
・ボタンを押すたびに番号を増やす
・前回入力値との差を取りたい
・連続処理でフラグを保持したい
・特定イベントの回数管理
・重複発生時に一度だけ警告を出したい
・処理中に“最初の値”を記録しておきたい
静的変数を使うことで、処理の安定性と再利用性が大きく向上します。
✅ Static変数を使った具体的な実務サンプル(6例)
【例①】カウンタ処理を継続する
Sub CountClick()
Static count As Long
count = count + 1
MsgBox "実行回数:" & count
End Sub
業務では「今日何回実行されたか」などの記録として応用できます。
参考:【VBA】数値セル・特定の文字列のセル・値のセルなどのセル数のカウント方法
【例②】前回の値を保持して増減を判断する
Sub CheckDiff()
Static prevValue As Long
Dim currentValue As Long
currentValue = Range("A1").Value
If prevValue <> 0 Then
MsgBox "前回との差:" & currentValue - prevValue
End If
prevValue = currentValue
End Sub
売上や計測値の変動確認に便利です。
【例③】初回のみ実行する処理
Sub OnlyOnce()
Static initialized As Boolean
If initialized = False Then
MsgBox "初回だけ実行される処理です"
initialized = True
Else
MsgBox "2回目以降の処理です"
End If
End Sub
設定読み込みや接続処理の初期化に使えます。
【例④】イベント発火の回数管理(Worksheet_Change)
Private Sub Worksheet_Change(ByVal Target As Range)
Static count As Long
count = count + 1
Range("C1").Value = count '何回変更されたかを記録
End Sub
イベント多発時のデバッグにも応用できます。
【例⑤】重複検知時に“最初の1回だけ”警告を出したい場合
Sub CheckDuplicateOnce()
Static alerted As Boolean
Dim v As String
v = Range("A1").Value
If WorksheetFunction.CountIf(Range("A:A"), v) > 1 Then
If alerted = False Then
MsgBox "重複があります"
alerted = True
End If
End If
End Sub
ユーザーへの過剰なメッセージ表示を防げます。
【例⑥】ループの中で“最初の値”を保持する
Sub LoopFirstValue()
Static firstValue As Variant
Dim i As Long
For i = 1 To 10
If i = 1 Then firstValue = Cells(i, 1).Value
Next i
MsgBox "最初の値:" & firstValue
End Sub
多段ループの初回処理に役立ちます。
✅ Static変数が役立つExcel業務の具体例(実務視点)
・定期実行マクロで前回の処理状況を保持
・データチェック時に前行との比較を行う
・初回だけヘッダー書き込みをしたい
・クリック数や入力回数の計測
・ユーザー操作の状態管理(フラグ保持)
Static変数は“状態を保存できるローカル変数”として大活躍します。
❗ Static変数の注意点(必ず押さえる)
・Excelを閉じると値がリセットされる
・他プロシージャから値を参照できない
・グローバル変数と混同しやすい
・イベントの多重発火で予期せぬ動作になる場合あり
・複雑に使いすぎるとコード可読性が低下する
特に「グローバル変数化しないための安全な代替手段」として適切に使うことが重要です。
🧠 Static変数とPublic変数の使い分け(実務の最適解)
| 使用場面 | 推奨 |
|---|---|
| 同じプロシージャ内だけで使う継続値 | Static |
| 複数プロシージャで共通の値を共有したい | Public |
| 1回だけ実行する初期処理 | Static |
| Excelブック全体で使う設定値 | Public |
| 外部から変更されたくない値 | Static |
Staticは“安全な限定スコープでの記憶”という点で優れています。
🧠 RPA(UiPath / Power Automate)との親和性が高い理由
RPAとVBAを併用するプロジェクトでは、Static変数が次の用途で役に立ちます:
・連続処理の状態管理
・前回の値との差分取得
・RPA側に渡すデータを段階的に作成
・イベント制御の安定化
RPAでの Excel 操作は“逐次処理が多い”ため、Static変数が有効に働きます。
🧠 ChatGPT 生成コードにStatic変数を組み込むとさらに便利
ChatGPTが生成するVBAコードは「毎回初期化される」ことを前提に書かれていることが多いため、Static変数を挿入すると:
- 処理がより安定する
- 初期化不要でロジックが簡潔
- メッセージの多重表示を防げる
- 状態保存が簡単に実現できる
そのため、ChatGPTを活用したコード作成でもStaticは非常に相性のよい仕組みです。
🟩 実務で使える Static変数入りテンプレート(12種類)
記事の価値をさらに高めるため、実務でよく使うテンプレートをいくつか掲載します。
① 連続実行カウンタ
Static cnt As Long
cnt = cnt + 1
② 初回だけメッセージ表示
Static first As Boolean
If Not first Then
MsgBox "初回です"
first = True
End If
③ 前回値との比較
Static prev
If prev <> "" Then MsgBox prev & " → " & v
prev = v
④ 同一データの連続入力チェック
(現場で非常に多い)
⑤ ボタン連打制御(高速連打防止)
⑥ イベント多重発火の防止フラグ
⑦ 初回ループの記録値保持
⑧ 処理速度測定のスタート時間を保持
⑨ エラーが初めて出たときだけログ記録
⑩ 複数シートにまたがる連続番号管理
⑪ グループ単位の初期処理制御
⑫ "今日の初回" だけ特定処理を実行
実務では非常に多様な使い道があります。
✅ まとめ:【Static変数】は“値を保持したまま処理を継続する”最強のローカル変数
最後に、今回の記事のポイントを整理します。
- Static変数は“プロシージャ終了後も値を保持する”特殊な変数
- Dimと違い毎回初期化されない
- Publicのように広範囲ではないため安全
- カウンタ、初期処理、フラグ管理に最適
- クリック回数・前回値の保持など実務で大活躍
- イベント処理やRPA連携にも向いている
- 使いすぎると可読性低下の原因になるため目的に応じて使い分ける
Static変数を正しく使いこなせば、
Excel VBAの処理はより賢く、安定し、高品質なものになります。