条件により繰り返し処理を行う場合、VB/VBAではDo~Loopステートメントを使用します。
Do~Loopステートメントは、繰り返し処理を行う条件判定をWhile句またはUntil句で指定します。
While句は条件式が「真」であるあいだ繰り返し処理を行い、Until句は条件式が「偽」であるあいだ(真になるまで)繰り返し処理を行います。
語句 | 説明 |
While |
条件式がTrue(真)の間繰り返し処理を行い、条件式がFalse(偽)でループを抜けます。 |
Until |
条件式がFalse(偽)の間繰り返し処理を行い、条件式がTrue(真)でループを抜けます。 |
また、While句/Until句は繰り返し処理の先頭(Doの後)に指定することも、後方(Loopの後)に指定することもできるので、使用方法としては以下の4つのパターンが考えられます。
【Do~Loopステートメントによる制御構文】
制御構文 | 説明 |
Do While 判定条件
繰り返し処理
Loop
|
ループの先頭で条件判定を行い、条件式がTrue(真)のあいだ繰り返し処理を行います。 ループの先頭で判定を行っているため、条件によっては繰り返し処理が一度も実行されません。
|
Do
繰り返し処理
Loop While 判定条件
|
ループの最後で条件判定を行い、条件式がTrue(真)のあいだ繰り返し処理を行います。
ループの最後で判定を行っているため、必ず一回は繰り返し処理を実行します。
|
Do Until 判定条件
繰り返し処理
Loop
|
ループの先頭で条件判定を行い、条件式がFalse(偽)のあいだ繰り返し処理を行います。
ループの先頭で判定を行っているため、条件によっては繰り返し処理が一度も実行されません。
|
Do
繰り返し処理
Loop Until 判定条件
|
ループの最後で条件判定を行い、条件式がFalse(偽)のあいだ繰り返し処理を行います。
ループの最後で判定を行っているため、必ず一回は繰り返し処理を実行します。
|
【Do While~Loopの使用例】
Dim sum As Integer
sum = 0
Do While sum < 10
sum = sum + 1
Loop
Debug.Print sum
上記例ではsumの値が10より小さいあいだループ処理が行われ、sumの値が10になった時点で条件がFalseとなるのでループを抜けます。よって結果は「10」と表示されます。
【Do Until~Loopの使用例】
Dim sum As Integer
sum = 0
Do Until sum > 10
sum = sum + 1
Loop
Debug.Print sum
上記例ではsumの値が10より大きくなるまでループ処理が行われ、sumの値が11になった時点で条件がTrueとなるのでループを抜けます。よって結果は「11」と表示されます。
また、条件により途中でループ処理を強制終了したい(ループを抜けたい)場合は、Exitステートメントを使用します。
【Exitステートメントによるループ処理の中断】
Do
If sum > 10 Then
Exit Do
End If
sum = sum + 1
Loop
上記例では判定をループの中で行い、条件を満たした場合にExitステートメントによりループを抜けます。
サンプルプログラム
以下サンプルは数当てゲームになります。
0~9の範囲で発生させた乱数をユーザに当てさせ、何度もゲームを繰り返します。正解するかゲームごとに続行確認のメッセージが表示されるのでそれをキャンセルすることでループ処理を抜け、ゲーム終了となります。
Public Sub sample()
Dim inputData As String
Dim intData As Integer
Dim ran As Integer
Do
' 0~9の乱数を取得します
ran = Int(Rnd * 10)
' ユーザに数値を入力させます
inputData = InputBox("0~9の整数を入力してください")
' 入力値のチェック
If IsNumeric(inputData) Then
' 入力値を数値に変換します
intData = CInt(inputData)
' 乱数と入力値を照合して判定します
If intData = ran Then
MsgBox "正解です!"
Exit Do
Else
MsgBox "不正解です!答えは「" & ran & "」です。"
End If
' 続行の確認をし、キャンセルでループを抜けます
If MsgBox("続けますか?", vbInformation + vbOKCancel, "確認") = vbCancel Then
Exit Do
End If
Else
MsgBox "0~9の整数を入力してください", vbCritical
End If
Loop
End Sub
※上記サンプルでは入力値のチェックを数値かどうかしか見ていませんが、厳密には0~9の整数かどうかのチェックも必要かもしれません。