「プロシージャ冒頭の変数宣言」という悪習を捨てよ:VBAを掌握するスコープ戦略
VBAの世界には、いまだに「プロシージャの先頭で全ての変数を宣言せよ」という化石のような教えが蔓延している。かつてメモリが極限まで貴重だった時代の名残だが、現代の業務自動化において、この書き方は「バグの温床」であり、「保守性を殺す元凶」だ。
真のアーキテクトは、変数の寿命を極限まで絞り込む。今回は、なぜ「ブロックレベルでの変数宣言」があなたのコードを救うのか、その真髄を説く。
—
1. なぜ「冒頭一括宣言」が敗北を招くのか
プロシージャの冒頭で宣言された変数は、そのプロシージャが終了するまでメモリに残り続ける。これがなぜ問題か。
- 意図しない状態の流用: 途中で使ったはずの変数が、数百行後のロジックで「前回の値」を持ったまま再利用されてしまう。
- 認知負荷の増大: 読者は「この変数はどこで使われるのか?」をコード全体を追って探さなければならない。
- メモリとパフォーマンス: 巨大なオブジェクトや配列を必要以上に長い間保持することは、Excelの挙動を不安定にする引き金となる。
「必要な場所で、必要なだけ宣言する」。これが堅牢なシステムを作るための大原則だ。
—
2. 実践:ブロックレベルでの変数宣言テクニック
VBAはC#やJavaのような厳密なブロックスコープ(`{ }`内のみ有効)を持たないが、「論理的なスコープ」を意識することで、コードの質は劇的に変わる。
以下のコードを比較してほしい。
悪い例:典型的な「ゴミ屋敷」コード
Sub ProcessData()
‘ 冒頭で全宣言。どこで使われるか不明瞭
Dim i As Long, j As Long, ws As Worksheet, dataArr As Variant
‘ … 50行の処理 …
‘ ループカウンタ i をここで使う
For i = 1 To 10
‘ …
Next i
‘ … 別の50行の処理 …
‘ ループカウンタ j をここで使う(なぜか i も混ざるミスが発生しやすい)
For j = 1 To 5
‘ …
Next j
End Sub
良い例:局所化された「プロフェッショナル」コード
Sub ProcessData()
‘ 処理の単位ごとにスコープを区切る
‘ — 第1フェーズ:データの抽出 —
Dim wsData As Worksheet
Set wsData = ThisWorkbook.Sheets(“Source”)
Dim dataArr As Variant
dataArr = wsData.Range(“A1:C100”).Value
‘ wsData, dataArr はこのフェーズ終了後に用済み
‘ — 第2フェーズ:計算処理 —
‘ i をここだけで定義。他の場所で i を使い回すミスを防ぐ
Dim i As Long
For i = LBound(dataArr, 1) To UBound(dataArr, 1)
‘ 処理ロジック
Next i
‘ — 第3フェーズ:出力処理 —
‘ 必要なタイミングで必要な変数だけを定義
Dim wsOut As Worksheet
Set wsOut = ThisWorkbook.Sheets(“Result”)
‘ …
End Sub
—
3. 堅牢な設計のための「ライフサイクル」の極意
ファイル連携やデータベース操作を伴うツールでは、特にこの「変数の寿命」が重要だ。
1. オブジェクトの解放を徹底せよ: `Set obj = Nothing` を行うタイミングは、そのオブジェクトが不要になった直後だ。プロシージャの最後でまとめて解放するのではない。
2. スコープを狭めればバグは見つかる: 変数の宣言場所と使用場所が近ければ、万が一のバグが発生した際に「どの変数が原因か」が即座に特定できる。
3. 変数の名前でスコープを暗示せよ: もしプロシージャを分割できないほど巨大なロジックがあるなら、それは変数の問題ではなく「設計の問題」だ。`Sub` を細かく切り、変数を引数として渡す設計にシフトせよ。
—
4. チーフアーキテクトからの提言
あなたが書いたコードは、半年後の自分や、あなたの後任者がメンテナンスする。
「動けばいい」というコードは、ただの負債だ。
- 変数宣言は「必要な直前」に行え。
- `For` 文のカウンタはそのブロック内でのみ存在させろ。
- プロシージャは「単一の責務」を持つように分割せよ。
これらを守るだけで、あなたのコードから「原因不明のバグ」は激減する。VBAという言語の制約に甘んじるのではなく、エンジニアとしての規律で、その脆弱な言語を最強のツールへと昇華させろ。
現場でコードを叩く時、常に自問自答せよ。「この変数は、今ここで定義する必要があるか?」と。その問いこそが、あなたのコードを世界最高峰の品質へと導く唯一の道である。
