見逃しやすい「初期化漏れ」
VBAでマクロを作っていると、変数の初期化を忘れてもエラーが出ないことがよくあります。
コンパイル(VBAのコードに間違いがないかを事前にチェックする作業)エラーにもならず、実行もできてしまうので「動いているから問題ない」と思い込んでしまうことが多いのです。
しかし、初期化されていない変数には思わぬ値が入っていたり、前回のループ(繰り返し)処理の値がそのまま使われてしまったりして、意図しない結果を生むことがあります。
「初期化忘れ」で起きる典型的なバグとその防止策を、実例を交えて紹介します。
初期化を忘れた場合の例
次のようなコードを見てください。
Sub SumExample()
Dim i As Long
Dim total As Long
For i = 1 To 5
total = total + i
Next i
MsgBox "合計: " & total
End Sub
totalは最初に何も値を入れていません(初期化されていません)。- VBAでは、数値型の変数は宣言時に自動で0に初期化されるため、このコードは実行時にエラーにはなりません。
- 実行結果としては
1+2+3+4+5 = 15が正しく表示されます。
でも、なぜ危ないのか?
このコードを少し改造して、変数 total を外に出してみましょう。
Dim total As Long
Sub SumExample1()
Dim i As Long
For i = 1 To 5
total = total + i
Next i
MsgBox "1回目: " & total
End Sub
Sub SumExample2()
Dim i As Long
For i = 1 To 5
total = total + i
Next i
MsgBox "2回目: " & total
End Sub
これを順番に実行すると、1回目で15、2回目で30と表示されます。
つまり、前の値がそのまま残ってしまっているのです。これが「初期化されていない状態」で変数を使いまわした場合のバグです。
初期化忘れを防ぐには
対策1:毎回初期値を代入する
Dim total As Long
Sub SumExample()
Dim i As Long
total = 0 ' 必ず初期化する
For i = 1 To 5
total = total + i
Next i
MsgBox total
End Sub
初期化 = 値を明確に入れることが重要です。
対策2:変数のスコープ(使える範囲)を限定する
できるだけ、必要な範囲だけで使うローカル変数(特定のSub内で動く変数)を使いましょう。こうすれば、処理ごとに自動で初期化されるため、安全です。
Sub SumExample()
Dim i As Long
Dim total As Long ' ローカル変数として宣言
For i = 1 To 5
total = total + i
Next i
MsgBox total
End Sub
実装するメリット
- 意図しない値の持ち越しを防げる
- デバッグ時に「なぜか値がおかしい…」という混乱が減る
- スコープを意識することで、読みやすいコードになる
まとめ
変数の初期化忘れは、表面上は動いているように見えて、実は危ない落とし穴です。
特に、Dim でグローバル変数やモジュールレベル変数を使うと、前回の値がそのまま残っていることがあるため、処理の最初に明示的な初期化が必要です。
※グローバル変数:モジュールを跨いで使うことができる変数
※モジュール変数:モジュール内で複数のSubで利用できる変数
忘れずに初期化する習慣をつけることが、信頼性の高いマクロを作る第一歩です。
