【Excelマクロ】「For r =1 To x」は、r=xになっても終わらない?

テーマはマクロのfor構文の疑問の解消 Excelの話

プログラマなどの人なら常識なのかも知れませんが、ド文系の人間が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が入力されるはずでした。

ExcelでFor構文を使った画面1

しかし、マクロを動かすと、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 でした。

ExcelでFor構文を使った画面2

文系の人間にはこの辺りが理解できず、「???」となってしまいました。

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 Sub

r を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きっちりになることはありません。

ExcelでFor構文を使った画面3

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

コメント

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