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 がまだ宣言されていない場合は、必ず指定します。 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 構造を使用します。

For...Next ループが開始されると、start、end、および step が評価されます。 これらの値が評価されるのはこのときだけです。 次に、start が counter に代入されます。 ステートメント ブロックが実行される前に、counter と end が比較されます。 counter の値が既に end 値より大きい場合 (step が負の場合は小さい場合)、For ループが終了し、Next ステートメントの次のステートメントに制御が渡されます。 それ以外の場合は、ステートメント ブロックが実行されます。

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

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

ループ内で counter の値を変更すると、コードの読みやすさが低下してデバッグが難しくなります。 start、end、または step の値を変更しても、最初のループ開始時に決定された反復値には影響が及びません。

ヒント

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

step 引数

step には正の数または負の数を指定できます。 どちらを指定するかによって、ループの処理方法が次のように決まります。

ステップの値

実行条件

正の数または 0

counter <= end

counter >= end

step を省略すると、ループを繰り返すごとに counter に 1 が加算されます。

counter 引数

このループの外側で counter を宣言していない場合は、For ステートメント内で宣言する必要があります。 その場合、counter のスコープはループの本体になります。 ただし、ループの外側と内側の両方で counter を宣言することはできません。

オプションとして、Next ステートメントに counter を指定することもできます。 こうするとプログラムの読みやすさが向上し、特に For ループを入れ子にしている場合は効果があります。 その場合には、For ステートメントで指定したのと同じ変数を指定する必要があります。

counter のデータ型によって反復の型が決まります。データ型は次のいずれかである必要があります。

  • 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

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

ループの入れ子

For ループは入れ子構造にできます。つまり、ループの中に別のループを入れることができます。 ただし、それぞれのループに一意の counter 変数を指定する必要があります。

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

内側の入れ子レベルの Next ステートメントの前に外側の入れ子レベルの Next ステートメントが来た場合は、コンパイラからエラーが報告されます。 ただし、コンパイラがこのエラーを検出できるのは、すべての Next ステートメントに counter を指定した場合に限られます。

Exit For

Exit ステートメント (Visual Basic) は、For…Next ループを即座に終了し、Next ステートメントの次のステートメントに制御を移します。

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)」を参照してください。

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

使用例

次の例は、For…Next ステートメントの使用方法を示しています。 ループの反復処理が実行されるたびに、ループ カウンター変数がインクリメントされます。 step 引数を指定していないので、既定値の 1 が使用されます。

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

次の例では、counter 引数と step 引数を Double 浮動小数点数として指定しています。

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 

次の例は、それぞれ異なる 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

次の例では、ジェネリック リストからすべての要素を削除しています。 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

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

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

Public Enum Mammals
    Buffalo
    Gazelle
    Mongoose
    Rhinocerous
    Whale
End Enum


Public Sub ListSomeMammals()
    For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinocerous
        Debug.Write(mammal.ToString & " ")
    Next
    Debug.WriteLine("")
    ' Output: Gazelle Mongoose Rhinocerous
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

参照

処理手順

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

参照

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

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

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

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

List<T>

概念

ループ構造 (Visual Basic)

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

履歴の変更

日付

履歴

理由

2010 年 12 月

「解説」セクションが再構成され、例が追加されました。

情報の拡充