プログラマなどの人なら常識なのかも知れませんが、ド文系の人間がExcelマクロをいじっていて疑問に思ったことです。「For 変数=~ To ~」を使ったときに変数が思ったものと違う動きをしていた話です。
「For ~=~ To ~」で変数が思っているより1多い?
「For r = 1 To 10」ならForが終わったら r は10じゃないの?
こんなコードを用意しました。
変数の「 r 」に For~ の構文を使って1~10を順番に入れて、1列目に1行目から順番に数字を入れていきます。
For のループ処理が10で終わった後に変数 r に続きで1を足して11行目に11と表示させようと思いました。
Sub sample()
Dim r As Long
For r = 1 To 10
Cells(r, 1) = r
Next
Cells(r + 1, 1) = 11
End Sub「For r = 1 To 10」なのでForが終わった時に r は10でそれに1を足して 10+1=11で11行目に11が入力されるはずでした。

しかし、マクロを動かすと、11行目が空白で12行目に「11」が入力される結果となりました。
「なぜ11行目がブランクに?」と不思議に思います。
そこで、Forのループの直後の変数 r をMsgboxで表示させてみます。
Sub sample()
Dim r As Long
For r = 1 To 10
Cells(r, 1) = r
Next
'For 直後の変数rをMsgboxで表示させる
MsgBox "rの値:" & r
Cells(r + 1, 1) = 11
End Subすると、「For r = 1 To 10」の直後の変数r は10ではなく、11 でした。

文系の人間にはこの辺りが理解できず、「???」となってしまいました。
r=10で終わりではなくr=11で10を超えるのでループ終わり
文系の人間なら、「For r = 1 To 10」なら、rが10までと書いているので、rが10になって処理したらForが終わると思うのが普通です。
しかし。プログラムの世界は奥が深い。
どうやら、Excelのマクロでは、rが10になったら終わるのではないようです。
「For r = 1 To 10」で、1から順番に2,3,..9, 10,と順番に r を 1 増やしていき10を超えても、10, 11と増やしていき、r = 10で終わるのではなく、r > 10 となったところで終わるようです。
想像ですが、こんな感じの処理なんだと思います。
Sub sample3()
Dim r As Long
Dim x As Long 'xはForを回すためだけの変数
r = 1 'r の初期値を1にする
For x = 1 To 999 'Forをxを使ってひたすら回す
Cells(r, 1) = r
r = r + 1 'Forが1回まわるたびrを1増やす
If r > 10 Then 'rが10より大きくなったらForから抜ける
Exit For
End If
Next
MsgBox "rの値:" & r
Cells(r + 1, 1) = 11
End Subr を1から順番に増やしていって、10を超えたらForが終わるということです。
なぜ、判定でr=10になったらForをやめるのではなく、rが10を超えたらなのか?
想像ですが、r が toできっちり終わるとは限らないからでしょう。
For ~ = ~ To ~ は1づつ増えるとは限らない
「For r = 1 To x」の構文はStepのオプションで指定することで1づつ増やす以外に増やす数字を指定できます。
例えば、Step 2 と指定すれば2づつ増えていきます。
「For r = 2 To 15 Step 2」で変数rを2から15まで、2づつ増やしてみます。
Sub sample4()
Dim r As Long
For r = 2 To 15 Step 2 'rをStepで 2づつ増やす
Cells(r, 1) = r
Next
MsgBox "rの値: " & r
End Sub
この場合だと、当然変数rは2, 4, 6, 8, 10, 14・・・と増えていくので、15きっちりになることはありません。

このように、「For r = 1 To x (Step y)」は、Stepの刻み方でちょうどで終わるとは限らないので、指定した値に等しくなったところで終わるのではなく、XXを超えたところで終わるという処理になっているのだと思います。


コメント