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

指定された回数だけ、一連のステートメントを繰り返すフロー制御ステートメントです。

For counter [ As datatype ] = start To end [ Step step ]
    [ statements ]
    [ Continue For ]
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ counter ]

指定項目

指定項目

説明

counter

For ステートメントには必ず指定します。数値変数を指定します。このループの制御変数になります。詳細については、このトピックで後述する「counter 引数」を参照してください。

datatype

省略可能です。counter のデータ型を指定します。詳細については、このトピックで後述する「counter 引数」を参照してください。

start

必須です。数式を指定します。counter の初期値になります。

end

必須です。数式を指定します。counter の最終値になります。

step

省略可能です。数式を指定します。ループを 1 回実行するごとに引数 counter を増やす量です。

statements

省略可能です。For と Next の間に記述したステートメントは、指定した回数だけ実行されます。

Continue For

省略可能です。制御をループの次の反復処理に移します。

Exit For

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

Next

必須です。For ループの定義を終了します。

[!メモ]

このステートメントで To のキーワードがカウンターの範囲を指定するために使用されます。また Select...Case ステートメント (Visual Basic) と配列申告でこのキーワードを使用できます。配列の宣言の詳細については、「Dim ステートメント (Visual Basic)」を参照してください。

簡単な例

回数の一連のステートメントを繰り返し実行する場合に For…Next の構造を使用します。

次の例では、1 の値を持つ index の変数の先頭は index の到達 5.の値の後に終了した場合は、ループ反復ごとにインクリメントします。

For index As Integer = 1 To 5
    Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5

次の例では、2 時の number の変数の先頭は number の到達 0 の値の終了後にループの各反復処理の軽減され、0.25。-.25 の Step の引数はループの各反復で値 0.25 が低くなります。

For number As Double = 2 To 0 Step -0.25
    Debug.Write(number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0 
ヒントヒント

ループまたはのステートメントを実行する回数先立ってわからない場合 While...End While ステートメント (Visual Basic)Do...Loop ステートメント (Visual Basic) は適しています。一方、指定の回数だけループを実行する場合は、For...Next ループが最適です。このループでは、最初にループに入るときに、繰り返しの回数を決定します。

ループの入れ子

For ループは入れ子構造にできます。つまり、ループの中に別のループを入れることができます。次の例は、それぞれ異なる step 値を指定した入れ子になった For...Next 構造体を示しています。外側のループでは、ループの反復処理が実行されるたびに文字列が作成されます。内側のループでは、ループの反復処理が実行されるたびにループ カウンター変数がデクリメントされます。

For indexA = 1 To 3
    ' Create a new StringBuilder, which is used
    ' to efficiently build strings.
    Dim sb As New System.Text.StringBuilder()

    ' Append to the StringBuilder every third number
    ' from 20 to 1 descending.
    For indexB = 20 To 1 Step -3
        sb.Append(indexB.ToString)
        sb.Append(" ")
    Next indexB

    ' Display the line.
    Debug.WriteLine(sb.ToString)
Next indexA
' Output:
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2

ループの入れ子は、各ループに一意の変数を counter ある必要があります。

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

の終了、のを続行します。

Exit For のステートメントは Next のステートメントの次のステートメントにすぐに For[…]Next のループおよび制御を移し終了します。

Continue For ステートメントは、制御をループの次の反復処理に直ちに移します。詳細については、「Continue ステートメント (Visual Basic)」を参照してください。

次の例は、Continue For ステートメントと Exit For ステートメントの使用方法を示しています。

For index As Integer = 1 To 100000
    ' If index is between 5 and 7, continue
    ' with the next iteration.
    If index >= 5 And index <= 8 Then
        Continue For
    End If

    ' Display the index.
    Debug.Write(index.ToString & " ")

    ' If index is 10, exit the loop.
    If index = 10 Then
        Exit For
    End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10

Exit For ステートメントは、For…Next ループで何度でも使用できます。入れ子構造になっている For…Next ループ内で使用すると、Exit For は最も内側のループを抜け、入れ子構造の 1 つ外側のレベルに制御を移します。

Exit For は条件を評価した後によく使用されます (たとえば、If…Then…Else の構造体)次のような条件の場合に Exit For を使用できます。

  • ループの継続が不要または不可能である。エラー値または終了要求はこの要件を作成する場合があります。

  • Try…Catch…Finally のステートメントで例外をキャッチします。Finally ブロックの最後で Exit For を使用できます。

  • 大きい、または無限実行回数が多いループになります。無限ループがあります。このような条件を検出した場合は、Exit For を使用してループを抜けることができます。詳細については、「Do...Loop ステートメント (Visual Basic)」を参照してください。

技術的な実装

For...Next ループが開始されると、start、end、および step が評価されます。Visual Basic は、現時点でのみこれらの値を評価し、counterに start を再配置。ステートメント ブロックの実行、Visual Basic が endに counter を比較する前に、counter が既に場合は step が負の場合 end の値 (またはそれより小さい)、Next のステートメントの次のステートメントに For のループの終わりとコントロールのパス。それ以外の場合は、ステートメント ブロックが実行されます。

Next ステートメントが実行されるたびに、step の値が counter に加算され、For ステートメントに戻ります。その後、counter と end が再び比較され、その結果に応じて、ステートメント ブロックが再度実行されるかループが終了します。このプロセスは、counter が end を超えるか、Exit For ステートメントに到達するまで継続されます。

ループは counter が endを通過するまで停止しません。counter と end が等しい場合にはループは継続されます。ブロックの実行を行うかどうかは、step が正の場合は counter <= end の比較によって決定され、step が負の場合は counter >= end の比較によって決定されます。

ループ内での値を counter ときに、変更する、コードが読みにくく、デバッグが困難な場合があります。startの値を変更して、end、または step は、最初のループに入る時点で決定されるとイテレーションの値には影響しません。

ループになっている場合、コンパイラは内部のレベルの Next のステートメントの前に外側の入れ子レベルの Next のステートメントが発生した場合はエラーを発行します。ただし、コンパイラがこのエラーを検出できるのは、すべての Next ステートメントに counter を指定した場合に限られます。

5z06z1kb.collapse_all(ja-jp,VS.110).gifstep 引数

step には正の数または負の数を指定できます。このパラメーターには、次の表に従って、ループの処理方法を決定します:

ステップの値

実行条件

正の数または 0

counter <= end

counter >= end

step の既定値は 1 です。

5z06z1kb.collapse_all(ja-jp,VS.110).gifcounter 引数

次の表は counter が For…Next のループ スコープに新しいローカル変数を定義するかどうかを示します。この確認は datatype があるかどうか、および counter が既に定義されているかどうかによって異なります。

datatype ですか。

counter は既に定義されていますか。

(counter が For...Next のループ スコープに新しいローカル変数を定義するかどうか結果)

counter が既に定義されているため、No。counter の範囲がプロシージャにローカルである、コンパイル時に警告が発生します。

はい。データ型は start、endと step の式から推論されます。型の推論については、Option Infer ステートメントローカル型の推論 (Visual Basic)を参照してください。

counter の既存の変数がプロシージャの外部で定義された場合にのみ○ (ただし。この変数は別に残ります。counter の既存の変数のスコープがプロシージャにローカルな場合、コンパイル エラーが発生します。

はい。

counter のデータ型は次の型の 1 つが必要があるイテレーションの型が決まります:

  • Byte、SByte、UShort、Short、UInteger、Integer、ULong、Long、Decimal、Single、または Double。

  • Enum ステートメント (Visual Basic) を使用して宣言した列挙型。

  • Object。

  • 次の演算子を含む T 型。B は Boolean 式で使用できる型です。

    Public Shared Operator >= (op1 As T, op2 As T) As B

    Public Shared Operator <= (op1 As T, op2 As T) As B

    Public Shared Operator - (op1 As T, op2 As T) As T

    Public Shared Operator + (op1 As T, op2 As T) As T

Next のステートメントに counter 変数を指定できます。この構文は、特に For の入れ子になったループ、プログラムの読みやすさが向上します。For のステートメントに表示される変数を指定する必要があります。

start、end、および step には、counter と同じ型に拡張可能な任意のデータ型として評価される式を指定できます。counterのユーザー定義型を使用すると、counterの種類に start、end、または step の型を変換するには CType の変換演算子を定義しなければならない場合があります。

使用例

次の例では、ジェネリック リストからすべての要素を削除しています。For Each...Next ステートメント (Visual Basic)の代わりに、降順で繰り返し発生 For…Next のステートメントを示しています。この例では removeAt のメソッドに、削除された要素の後に要素のインデックス値が小さくなるため、この方法を使用します。

Dim lst As New List(Of Integer) From {10, 20, 30, 40}

For index As Integer = lst.Count - 1 To 0 Step -1
    lst.RemoveAt(index)
Next

Debug.WriteLine(lst.Count.ToString)
' Output: 0

次の例では、Enum ステートメント (Visual Basic)を使用して宣言された列挙型を繰り返します。

Public Enum Mammals
    Buffalo
    Gazelle
    Mongoose
    Rhinoceros
    Whale
End Enum


Public Sub ListSomeMammals()
    For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros
        Debug.Write(mammal.ToString & " ")
    Next
    Debug.WriteLine("")
    ' Output: Gazelle Mongoose Rhinoceros
End Sub

次の例では、ステートメントのパラメーターで +、-、>=、および <= の各演算子のオーバーロードを持つクラスを使用しています。

Private Class Distance
    Public Property Number() As Double

    Public Sub New(ByVal number As Double)
        Me.Number = number
    End Sub

    ' Define operator overloads to support For...Next statements.
    Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
        Return New Distance(op1.Number + op2.Number)
    End Operator

    Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
        Return New Distance(op1.Number - op2.Number)
    End Operator

    Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
        Return (op1.Number >= op2.Number)
    End Operator

    Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
        Return (op1.Number <= op2.Number)
    End Operator
End Class


Public Sub ListDistances()
    Dim distFrom As New Distance(10)
    Dim distTo As New Distance(25)
    Dim distStep As New Distance(4)

    For dist As Distance = distFrom To distTo Step distStep
        Debug.Write(dist.Number.ToString & " ")
    Next
    Debug.WriteLine("")

    ' Output: 10 14 18 22 
End Sub

参照

関連項目

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

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

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

List<T>

概念

ループ構造 (Visual Basic)

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

その他の技術情報

コレクション (C# および Visual Basic)