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

Boolean 条件が True の場合、または条件が True になるまで、ステートメントのブロックを繰り返します。

構文

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

指定項目

用語 定義
Do 必須です。 Do ループの定義を開始します。
While Until を使用しない場合に、必ず指定します。 conditionFalse になるまでループを繰り返します。
Until While を使用しない場合に、必ず指定します。 conditionTrue になるまでループを繰り返します。
condition 任意。 Boolean 式。 conditionNothing の場合、Visual Basic ではそれを False として扱います。
statements 任意。 conditionTrue である間、またはその状態になるまで繰り返される、1 つまたは複数のステートメント。
Continue Do 任意。 Do ループの次の反復に制御を渡します。
Exit Do 任意。 Do ループから制御を移します。
Loop 必須です。 Do ループの定義を終了します。

Remarks

条件が満たされるまで、一連のステートメントを無限に繰り返す場合は、Do...Loop 構造体を使用します。 ステートメントを設定した回数だけ繰り返す場合は、通常、For...Next ステートメントのほうが適しています。

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

condition は、ループの開始時または終了時に 1 回だけテストできます。 ループの開始時に (Do ステートメントで) condition をテストする場合、ループは 1 回も実行されない可能性があります。 ループの最後に (Loop ステートメントで) テストする場合、ループは少なくとも 1 回は必ず実行されます。

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

Do ループを入れ子にするには、別のループ内にループを配置します。 また、さまざまな種類の制御構造を相互に入れ子にすることもできます。 詳細については、「入れ子になった制御構造」を参照してください。

注意

Do...Loop 構造は、While...End While ステートメントよりも柔軟性があります。conditionTrue でなくなったとき、または初めて True になったときに、ループを終了するかどうかを判断できるためです。 ループの開始時または終了時に condition をテストすることもできます。

Exit Do

Exit Do ステートメントを使用すると、別の方法で Do…Loop を終了させることができます。 Exit DoLoop ステートメントの次のステートメントに制御を直ちに渡します。

Exit Do は、何らかの条件を評価した (If...Then...Else 構造など) 後によく使用されます。 誤った値や終了要求など、反復処理を続行することが不要であるか、不可能である状況が検出された場合に、ループを終了させることができます。 Exit Do の用途の 1 つとしては、無限ループを引き起こす可能性がある条件をテストすることがあります。無限ループは、膨大な回数または無限に実行されるループです。 Exit Do を使用すると、ループを終了できます。

Do…Loop 内の任意の場所に、任意の数の Exit Do ステートメントを含めることができます。

入れ子になった 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 

例 2

次の例では、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 

例 3

次の例では、index 変数が 100 を超えた場合、condition によってループが停止します。 ただし、ループ内の If ステートメントでは、インデックス変数が 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 

例 4

次の例では、テキスト ファイル内のすべての行を読み取っています。 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

関連項目