スポンサーリンク

【Excel/VBA】ループの中で変数の宣言をしても、ループするごとに変数が作成されるわけではない

vba
スポンサーリンク
※当サイトは広告を含みます

ループの中で変数の宣言をしても、ループするごとに変数が作成されるわけではない

ということに、初めて気が付きました!

てっきり宣言部分を通過するときに、通過するごとに別の変数が作成され、メモリ領域がとられているものかと思っていました。

なぜ気が付いたかというと、ループの中の変数が、ひとつ前の値を引きずっていたからです。

たとえばですが、このような表があり、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)

スポンサーリンク
スポンサーリンク
vba
スポンサーリンク
mwkをフォローする
エクセルがともだち

コメント

タイトルとURLをコピーしました