Do...Loop ステートメント (Visual Basic)

指定されたブール型 (Boolean) の条件が真 (True) である間、または条件が真 (True) になるまで、一連のステートメントを繰り返します。

Do { While | Until } condition
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop
-or-
Do
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop { While | Until } condition

指定項目

語句

定義

Do

必ず指定します。 Do ループの定義を開始します。

While

Until を使用しない場合は、必ず指定します。 condition が偽 (False) になるまでループを繰り返します。

Until

While を使用しない場合は、必ず指定します。 condition が真 (True) になるまでループを繰り返します。

condition

省略可能です。 ブール式 (Boolean) を指定します。 condition が Nothing の場合、Visual Basic はこれを False として扱います。

statements

省略可能です。 condition が真 (True) である間、または真になるまで繰り返し実行される、任意の行数のステートメントを記述します。

Exit Do

省略可能です。 制御を Do ループの外に移します。

Loop

必ず指定します。 Do ループの定義を終了します。

解説

Do...Loop は一連のステートメントを、条件が満たされるまで何度でも繰り返し実行する場合に使用します。 設定した回数だけステートメントを繰り返す場合は、For...Next Statement を選択した方が通常は便利です。

While と Until のいずれかを使用して condition を指定しますが、両方は使用できません。

condition はループの最初または終わりに 1 回だけテストできます。 condition をループの最初に (Do ステートメント内で) テストする場合、ループが一度も実行されないことがあります。 ループの終わりに (Loop ステートメント内で) テストする場合、ループは必ず少なくとも 1 回は実行されます。

条件は、通常、2 つの値の比較によって判断されますが、ブール型 (Boolean) (Visual Basic) 値 (True または False) として評価できる式の場合どのような式でも指定できます。 指定できる値には、数値型などのその他のデータ型を Boolean に変換した値も含まれます。

Do ループは入れ子構造にできます。つまり、ループの中に別のループを入れることができます。 また、さまざまな種類の制御構造を入れ子にすることもできます。 詳細については、「入れ子になった制御構造 (Visual Basic)」を参照してください。

注意

Do...Loop 構造を使用すると、condition が真 (True) でなくなったときにループを終了するのか、それとも最初に True になったときに終了するのかを判断できるので、While...End While ステートメント (Visual Basic) を使用するよりも柔軟性が増します。 また、condition をループの最初にテストすることも、ループの終わりにテストすることもできます。

Exit Do

Exit Do ステートメントを使用すると、別の方法で Do…Loop を終了できます。 Exit Do は、Loop ステートメントの次のステートメントにすぐに制御を移します。

Exit Do は、If...Then...Else 構造の中などで、なんらかの条件を評価した後によく使用されます。 これを使用すると、ループの継続を不要または不可能にする条件 (エラー値や終了要求など) を検出した場合にループを終了できます。 Exit Do は、無限ループを引き起こす可能性がある条件をテストする場合などに使用されます。無限ループは、実行回数が多くなる (または無限に繰り返される) ループです。 Exit Do を使用してループから抜けることができます。

Exit Do ステートメントは、Do…Loop の任意の場所に何度でも使用できます。

入れ子構造になっている Do ループの中で使用すると、Exit Do は最も内側のループから入れ子構造の 1 つ外側のレベルに制御を移します。

使用例

次の例では、index 変数が 10 を上回るまで、ループ内のステートメントが実行され続けます。 Until 句がループの終わりに配置されています。

Dim index As Integer = 0
Do
    Debug.Write(index.ToString & " ")
    index += 1
Loop Until index > 10

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

次の例では、Until 句の代わりに While 句が使用されており、ループの終わりではなく最初に condition がテストされています。

Dim index As Integer = 0
Do While index <= 10
    Debug.Write(index.ToString & " ")
    index += 1
Loop

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

次の例では、index 変数が 100 を上回ったときに、condition によってループが停止されます。 ただし、ループ内の If ステートメントにより、index 変数が 10 を上回ったときに、Exit Do ステートメントによってループが停止されます。

Dim index As Integer = 0
Do While index <= 100
    If index > 10 Then
        Exit Do
    End If

    Debug.Write(index.ToString & " ")
    index += 1
Loop

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

次の例では、テキスト ファイルのすべての行が読み取られます。 OpenText メソッドによりファイルが開かれ、文字を読み取る StreamReader が返されます。 Do...Loop 条件で、StreamReaderPeek メソッドにより、その他の文字があるかどうかが判断されます。

Private Sub ShowText(ByVal textFilePath As String)
    If System.IO.File.Exists(textFilePath) = False Then
        Debug.WriteLine("File Not Found: " & textFilePath)
    Else
        Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath)

        Do While sr.Peek() >= 0
            Debug.WriteLine(sr.ReadLine())
        Loop

        sr.Close()
    End If
End Sub

参照

処理手順

方法: ループのパフォーマンスを改善する (Visual Basic)

参照

For...Next ステートメント (Visual Basic)

ブール型 (Boolean) (Visual Basic)

Exit ステートメント (Visual Basic)

While...End While ステートメント (Visual Basic)

概念

ループ構造 (Visual Basic)

入れ子になった制御構造 (Visual Basic)

履歴の変更

日付

履歴

理由

2011 年 1 月

解説が再構成され、例が追加されました。

情報の拡充