【Excelマクロ】変数の初期化忘れで起こるバグ

見逃しやすい「初期化漏れ」

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で利用できる変数

忘れずに初期化する習慣をつけることが、信頼性の高いマクロを作る第一歩です。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール