ループの中で変数の宣言をしても、ループするごとに変数が作成されるわけではない
ということに、初めて気が付きました!
てっきり宣言部分を通過するときに、通過するごとに別の変数が作成され、メモリ領域がとられているものかと思っていました。
なぜ気が付いたかというと、ループの中の変数が、ひとつ前の値を引きずっていたからです。
たとえばですが、このような表があり、100点以上だったら変数bufに合格を代入します。100点未満だったらbufにはなにもいれません。
以下のようなコードを書きました。まったく意味のないコードですが・・・。
For分の中にbufを宣言するコードを書いており、その都度変数が初期化されるものと信じて書いています。最終的にbufが合格だったらメッセージボックスを表示するようにしています。
Dim i As Long
For i = 1 To 5
Dim buf As String
If Cells(i, 1).Value >= 100 Then
buf = “合格”
End If
Next i
If buf = “合格” Then
MsgBox “おめでとうございます”
End If
最後の人は30点なので、bufは空っぽと信じていますが、実はbufには3行目の人の「合格」が入ったままになっており、メッセージボックスが表示されます。
デバックでステップ実行してみると、なんと!ステップインしたとたん、変数の宣言部分まで進んでもいないのに、ローカルウインドウには変数 i も buf もできちゃっています!
変数はプロシージャ内のどこに書こうと、最初に実行されちゃうんですね!
達人の皆様からしたら「え?知らなかったの?」と思われちゃうでしょうか、私は新発見だったので、忘れないように記しておくことにしました。
上記のような場合は都度変数を初期化しなければなりませんね。
Dim i As Long
For i = 1 To 5
Dim buf As String
buf = “” ‘前の値を引きずらないように初期化!
If Cells(i, 1).Value >= 100 Then
buf = “合格”
End If
Next i
初期化されないならわざわざループの中に書く必要もないですね
Dim i As Long, buf As String ‘最初に持ってきた
For i = 1 To 5
buf = “” ‘前の値を引きずらないように初期化!
If Cells(i, 1).Value >= 100 Then
buf = “合格”
End If
Next i
t-hom’s diary さんのブログで勉強させていただきました。ありがとうございました。
VBA 変数宣言はIfやFor等のコードブロック中に書いても機能する – t-hom’s diary (hateblo.jp)
コメント