VBAで繰り返しといえばFor文です。
しかし、Forステートメントメントは明確に繰り返し回数が決まっていないと使用できないため、終了条件を指定して「とりあえず」繰り返し処理をするのがVBAのDo〜Whileステートメントです。
Do〜While制御文は使用機会の多いとてもパワフルな制御文です。
VBAのDo〜Whileを使いこなす
VBAのDo〜Loopの終了条件を指定して適当なところで処理を中止するのが、WhileキーワードやUntilキーワードです。
VBAの中では馴染みにくい制御文ですが、その分パワフルです。テキストファイル処理ではDo〜While処理がテンプレート化しています。
1.Do〜Loop構文
先に
Sub sumple1()
Dim i As Integer
Do
i = i + 1
Cells(i, 1).Value = i
Loop
End Sub
i = i + 1
Cells(i, 1).Value = i
Loop
End Sub
このコードは無限ループします。しかし実際はiがIntegerで宣言されているので32767行目でオーバーフローして停止します。
2.前置While構文
WhileキーワードをDoの方につけるパターンです。「繰り返し処理に入る前に」終了条件を確認します。
ほとんどの場合はこちらで大丈夫です。
Sub sumple2()
Dim i As Integer
Do While i < 100
i = i + 1
Cells(i, 1).Value = i
Loop
End Sub
「100より小さい場合に」繰り返し処理に入ります。
繰り返し処理内でiをインクリメントしているので100まで入力されます。
3.後置While構文
WhileキーワードをLoopの方につけるパターンです。「繰り返し処理の後に」終了条件を確認します。前置While構文と決定的に違うのは「必ず一回実行されることが保証」されます。もう一度繰り返すかユーザーに確認するときなど、とても便利です。
Sub sumple()
Dim i As Integer
Dim MaxIndex As Integer
Do
MaxIndex = i + 100
Do While i < MaxIndex
i = i + 1
Cells(i, 1).Value = i
Loop
Cells(i, 1).Activate
Loop While MsgBox("もう一度繰り返しますか", vbOKCancel) = vbOK
End Sub
MaxIndex = i + 100
MaxIndexは繰り返し処理に入る前に、現在のiより100大きい数になっています。iとMaxindexはInteger宣言されているので、直後は0であることが保証されています。
後置While文はFor制御文では完全に不可能な挙動をします。(泥くさく実装は出来ますが)より適した制御文を選べるようになると、VBAを触るのが楽しくなります。
VBAにはUntilキーワードも用意されていますがVBA独自ですので、Whileキーワードのみを使用するのが好ましいとされています。