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



