次の方法で共有


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

ループ カウンターが最終的な値に近づく間に、ステートメントのグループを繰り返します。

構文

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

部品

パーツ 説明
counter For ステートメントで必要です。 数値変数。 ループの制御変数。 詳細については、このトピックで後述 するカウンター引数 を参照してください。
datatype 任意。 counterのデータ型。 詳細については、このトピックで後述 するカウンター引数 を参照してください。
start 必須。 数値式。 counter の初期値になります。
end 必須。 数値式。 counterの最終的な値。
step 任意。 数値式。 ループを経るたびに counter がインクリメントされる量。
statements 任意。 指定した回数だけ実行される ForNext の間の 1 つ以上のステートメント。
Continue For 任意。 コントロールを次のループ イテレーションに転送します。
Exit For 任意。 For ループから制御を転送します。
Next 必須。 For ループの定義を終了します。

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

簡単な例

For...Next 構造体は、一連のステートメントを一定回数繰り返す場合に使用します。

次の例では、 index 変数は値 1 で始まり、ループの反復ごとにインクリメントされ、 index の値が 5 に達した後で終了します。

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

次の例では、 number 変数は 2 から始まり、ループの各反復で 0.25 減少し、 number の値が 0 に達した後で終了します。 Step-.25引数は、ループの各反復で値を 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 ステートメントまたはDo...ループ ステートメントは、ループ内でステートメントを実行する回数が事前にわからない場合に適切に機能します。 ただし、ループを特定の回数実行することが予想される場合は、 For...Next ループをお勧めします。 ループに最初に入るときの反復回数を決定します。

ループを入れ子にする

For ループを入れ子にするには、別のループ内にループを配置します。 次の例では、異なるステップ値を持つ入れ子になった 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 変数が必要です。

また、さまざまな種類の制御構造を相互に入れ子にすることもできます。 詳細については、「ネストされたコントロール構造」を参照してください。

Exit For と Continue For

Exit For ステートメントは、すぐに For... を終了します。 Next ループし、 Next ステートメントに続くステートメントに制御を転送します。

Continue For ステートメントは、制御をループの次のイテレーションに直ちに転送します。 詳細については、「 Continue ステートメント」を参照してください。

次の例は、 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 AndAlso 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 は最も内側のループを終了し、次に高いレベルの入れ子に制御を移します。

Exit For は、何らかの条件を評価した後でよく使用されます(たとえば、If...Then...Else 構造で)。 次の条件に対して Exit For を使用できます。

  • 繰り返し処理を続けることは不要または不可能です。 誤った値または終了要求によって、この条件が作成される可能性があります。

  • Try...Catch...Finallyステートメントは例外をキャッチします。 Exit For ブロックの末尾にFinallyを使用できます。

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

技術的な実装

For...Next ループが開始されると、Visual Basic はstartend、およびstepを評価します。 Visual Basic では、この時点でのみこれらの値が評価され、 startcounterに割り当てられます。 ステートメント ブロックを実行する前に、Visual Basic は counterendを比較します。 counterが既にend値より大きい場合 (または、stepが負の場合は小さい場合)、For ループは終了し、Next ステートメントに続くステートメントに制御が渡されます。 それ以外の場合は、ステートメント ブロックが実行されます。

Visual Basic は、Next ステートメントを検出するたびに、counterずつstepインクリメントし、For ステートメントに戻ります。 ここでも counterendと比較し、結果に応じてブロックを実行するかループを終了します。 このプロセスは、 counterend 渡されるか、 Exit For ステートメントが検出されるまで続行されます。

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

ループ内で counter の値を変更すると、コードの読み取りとデバッグが難しくなる可能性があります。 startend、またはstepの値を変更しても、ループが最初に入力されたときに決定された反復値には影響しません。

ループを入れ子にすると、内部レベルのNextステートメントの前に外側の入れ子レベルのNextステートメントが検出された場合、コンパイラはエラーを通知します。 ただし、コンパイラは、すべてのcounterステートメントでNextを指定した場合にのみ、この重複するエラーを検出できます。

ステップ引数

stepの値は、正または負のいずれかになります。 このパラメーターは、次の表に従ってループ処理を決定します。

ステップ値 ループは次の場合に実行されます。
正またはゼロ counter <= end
否定的 counter >= end

stepの既定値は 1 です。

反論

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

datatypeが存在しますか? counterは既に定義されていますか? 結果 ( counter が、 For...Next ループ全体をスコープとする新しいローカル変数を定義するかどうか)
いいえ イエス いいえ。 counter は既に定義されているためです。 counterのスコープがプロシージャに対してローカルでない場合は、コンパイル時の警告が発生します。
いいえ いいえ はい。 データ型は、 startend、および step 式から推論されます。 型推論の詳細については、「 Option Infer ステートメント 」および 「ローカル型推論」を参照してください。
イエス イエス はい。ただし、既存の counter 変数がプロシージャの外部で定義されている場合に限ります。 その変数は分離されたままです。 既存の counter 変数のスコープがプロシージャに対してローカルである場合、コンパイル時エラーが発生します。
イエス いいえ はい。

counterのデータ型によってイテレーションの型が決まります。これは次のいずれかの型である必要があります。

  • ByteSByteUShortShortUIntegerIntegerULongLongDecimalSingle、またはDouble

  • Enum ステートメントを使用して宣言する列挙型。

  • Object

  • 次の演算子を持つ型 T 。ここで、 BBoolean 式で使用できる型です。

    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

必要に応じて、counter ステートメントでNext変数を指定できます。 この構文を使用すると、全体的にプログラムの読みやすさが向上し、特に入れ子になった For ループがある場合に効果的です。 対応する For ステートメントに表示される変数を指定する必要があります。

startend、およびstep式は、counterの型に拡大する任意のデータ型に評価できます。 counterにユーザー定義型を使用する場合は、CTypestart、またはendの型をstepの型に変換するために、counter変換演算子を定義する必要がある場合があります。

例 1

次の例では、ジェネリック リストからすべての要素を削除します。 For Each の代わりに...次のステートメントの例は、降順で反復処理する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

例 2

次の例では、 Enum ステートメントを使用して宣言された列挙体を反復処理します。

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

例 3

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

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

こちらも参照ください