VBAの変数初期化忘れで起こるバグとは|エラーにならないから気づきにくい落とし穴

VBAで変数の初期化を忘れると、前回のループで使った値がそのまま残ってしまい、意図しない結果になることがあります。エラーにならないので気づきにくいのが厄介なポイントです。変数は使う前に必ず初期値を入れる習慣をつけましょう。

この記事では、次の内容を順番に解説します。

  • 初期化忘れで起きる典型的なバグの例
  • 初期化忘れを防ぐ2つの対策
  • ローカル変数とモジュール変数の違い

初期化忘れで起きるバグとは?

次のコードを見てください。変数 total をSubの外に置いて、2つのマクロで使い回しています。

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

SumExample1 を実行すると「15」と表示されます。次に SumExample2 を実行すると「30」と表示されます。

1回目の結果(15)がそのまま total に残っているため、2回目は15+15=30になってしまっています。エラーにはならないので、気づかずに間違った値を使い続けてしまう危険があります。

初期化忘れを防ぐ方法は?

対策①:処理の最初に初期値を明示的に入れる

変数を使う前に必ず初期値を代入します。数値なら 0、文字列なら ""(空文字)を入れておくのが基本です。

Sub SumExample()
    Dim i As Long
    Dim total As Long

    total = 0 ' 必ず初期化する

    For i = 1 To 5
        total = total + i
    Next i

    MsgBox total
End Sub

対策②:Sub内で変数を宣言する(ローカル変数にする)

変数をSubの中で宣言すると、そのSubが終わるたびに自動でリセットされます。使う範囲を必要最小限に絞ることで、前回の値が残る問題を根本から防げます。

Sub SumExample()
    Dim i As Long
    Dim total As Long ' Subの中で宣言 → 毎回リセットされる

    For i = 1 To 5
        total = total + i
    Next i

    MsgBox total
End Sub

できるだけ変数はSubの中で宣言するのがおすすめです。

ローカル変数とモジュール変数の違いは?

変数をどこで宣言するかによって、使える範囲と値の持ち方が変わります。

  • ローカル変数:Sub内で Dim で宣言。そのSubが終わると自動でリセットされる。初期化忘れの心配が少ない。
  • モジュール変数:Subの外(モジュールの先頭)で Dim で宣言。そのモジュール内の複数のSubで使いまわせるが、値がリセットされないので初期化を忘れると前回の値が残る。
  • グローバル変数Public で宣言。ファイルを閉じるまですべてのSubから使えるが、値の管理が複雑になりやすい。

複数のSubをまたいで値を使いたい場合は、モジュール変数やグローバル変数を使うことになりますが、その分初期化の管理をしっかり行う必要があります。

まとめ

変数の初期化忘れはエラーにならないため、気づきにくい落とし穴です。次の2点を意識するだけで大きく防げます。

  • 使う前に初期値を入れるtotal = 0 のように、処理の最初に明示的に値を入れる。
  • 変数はできるだけSubの中で宣言する:ローカル変数にすれば毎回自動でリセットされる。
  • モジュール変数・グローバル変数は慎重に使う:値が残り続けるので、処理の最初に必ず初期化する。

よくある質問

VBAの変数はDimで宣言しなくても使える?

使えますが、宣言なしで使うとタイプミスに気づけなかったり、意図しない型で動いたりする危険があります。モジュールの先頭に Option Explicit と書くと、Dimで宣言していない変数を使ったときにエラーが出るようになります。初心者のうちは Option Explicit を入れておくのがおすすめです。

文字列型の変数は初期化しなくてもいい?

文字列型(String)の変数は宣言時に自動で空文字("")に初期化されます。数値型(Long・Integerなど)は0、論理型(Boolean)はFalseに自動で初期化されます。ただし、明示的に初期化する方が意図が伝わりやすくコードも読みやすくなります。

Staticを使うと値がリセットされないって本当?

はい、本当です。Static で宣言した変数は、そのSubが終わっても値がリセットされず、次回実行時も前回の値が残ります。カウンターのように「何回実行したか」を記録したいときに便利ですが、意図せず値が残ることもあるので注意が必要です。

Option Explicitはどこに書けばいい?

モジュールの一番上(最初の行)に書きます。VBAの編集画面で「ツール」→「オプション」→「変数の宣言を強制する」にチェックを入れると、新しいモジュールを作るたびに自動で追加されるようになります。

初期化が必要な変数と不要な変数の見分け方は?

Sub内で宣言したローカル変数は毎回自動でリセットされるので、基本的には初期化しなくても動きます。ただし「値を足していく」「フラグを管理する」など意図的に初期値を決めたい場合は明示的に初期化しましょう。Subの外で宣言したモジュール変数・グローバル変数は必ず初期化が必要と考えておくのが安全です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

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

上部へスクロール