制御構文「Do While~Loopステートメント」について
今回の制御構文は「Do While~Loopステートメント」です。
Do While文は、For文と同じ繰り返し処理になります。
実際にサンプルコードを見てみましょう。
Sub test12()
Dim i As Integer
i = 1
Do While i <= 3
MsgBox "<Do While>繰り返し処理:" & i & "回目"
i = i + 1
Loop
End Sub
「Do While~Loopステートメント」の基本構文は以下の通りです。
Do While <条件式> ・・・ (条件式が不一致ならループ処理を終了)
<繰り返される実行したい処理>
Loop
このソースコードを実行すると以下のような結果になります。
同じループ処理であるFor文と似たような動作をします。
繰り返す条件は以下の通りです。
For文 | Do While文 |
---|---|
<カウンタ変数>が指定した値になると終了 | <条件式>が不一致の時に終了 |
どういう事か、サンプルコードより説明します。
Do While i <= 3
まず「Do While i <= 3 」で、この条件式は「変数iが3以下」であり、この条件が満たされている限り、ループ処理は継続されます。
よって、変数iが「4」になったら、条件式が満たされない、つまり不一致になりますので、ループ処理は終了します。
サンプルコードでは繰り返される間、以下の処理が実行されます。
MsgBox "<Do While>繰り返し処理:" & i & "回目"
i = i + 1
この中で重要なのは「i = i + 1」です。
Do While文では、For文のように<カウンタ変数>が存在しないため、ループしても何もカウントされません。
そこでこのDo While文の条件式が不一致になるように、「i = i + 1」を書いています。
もしこれがない場合、あるいは条件式が不一致になるような記述がなければ無限ループしてしまいます。
前回のFor文の解説時、Do While文の方が無限ループになりやすいと説明したのはこのためです。
サンプルコードは以下の流れでループ処理をします。
Do While文、または他の言語ではWhile文とも呼ばれてますが、For文と同じで基本となるループ処理(繰り返し処理)です。
しっかりとおさえておきましょう。
<補足情報>Do While文のいろんな書き方
WhileをLoopの後ろに書いた場合
WhileはLoopの後ろに記述する事も可能です。
WhileはLoopの後ろにしたサンプルコードを用意しました。
Sub test12a()
Dim i As Integer
i = 1
Do While i = 3
MsgBox "<Do While[1つ目]>繰り返し処理:" & i & "回目"
i = i + 1
Loop
'変数iに1を代入してリセット
i = 1
Do
MsgBox "<Do While[2つ目]>繰り返し処理:" & i & "回目"
i = i + 1
Loop While i = 3
End Sub
前と後ろにしただけで何が違うかと言うと、WhileをLoopの後ろに書くと、必ずDoの後の処理が実行されます。
分かりやすく説明すると、以下の画像3のように実行されます。
このように、前と後ろのどちらかに書く事で、異なる動作をさせる事ができます。
Do While分でサイコロ目の6が出るまで振ってみる
For文は基本、何回繰り返すかを設定しますが、Do While文では、条件が不一致になるまで繰り返すという違いがあります。
そこで、サイコロの目が6になったら繰り返しをやめるというサンプルコードを作ってみました。
Sub test12b()
Dim i As Integer
'乱数を発生させるための記述
Randomize
'変数iが「6」以外の時ループする ・・・ つまり「6」になればループ終了
Do
'ランダムで「1」~「6」までの整数を発生させて変数iに代入する
i = Int(6 * Rnd(1)) + 1
MsgBox "サイコロの目は【" & i & "】です"
Loop While i <> 6
End Sub
まずサイコロを見立てた部分の記述を解説します。
知っての通り、サイコロは数字の「1」「2」「3」「4」「5」「6」のうち1つが出ます。
どの数字が出るかは、イカサマでもしない限りランダムです。
VBAでは乱数を発生させる
'乱数を発生させるための記述
Randomize
i = Int(6 * Rnd(1)) + 1
上記2つ記述で、サイコロと同じようにランダムで「1」「2」「3」「4」「5」「6」を発生させています。
ここは少し難しいので、現時点ではそのような記述である事だけ分かっていただければ問題ないです。
サイコロの目が「6」が出たら終了は
Loop While i <> 6
条件式を「6」以外にしておけば、「1」や「5」なら条件式と一致するので、繰り返されます。
「6」が出れば、条件式が不一致になるため終了します。
実際に実行してみました。
このように、Do While文を用いる事で、サイコロの目が「6」まで振り続けるシミュレーションが可能です。
ループ処理を使うことで、様々な計算やシミュレーションを行うことができるでしょう。