ループ カウンターが最終的な値に近づく間に、ステートメントのグループを繰り返します。
構文
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 |
任意。 指定した回数だけ実行される For と Next の間の 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 はstart
、end
、およびstep
を評価します。 Visual Basic では、この時点でのみこれらの値が評価され、 start
が counter
に割り当てられます。 ステートメント ブロックを実行する前に、Visual Basic は counter
と end
を比較します。
counter
が既にend
値より大きい場合 (または、step
が負の場合は小さい場合)、For
ループは終了し、Next
ステートメントに続くステートメントに制御が渡されます。 それ以外の場合は、ステートメント ブロックが実行されます。
Visual Basic は、Next
ステートメントを検出するたびに、counter
ずつstep
インクリメントし、For
ステートメントに戻ります。 ここでも counter
を end
と比較し、結果に応じてブロックを実行するかループを終了します。 このプロセスは、 counter
が end
渡されるか、 Exit For
ステートメントが検出されるまで続行されます。
ループは、 counter
が end
を通過するまで停止しません。
counter
がend
と等しい場合、ループは続行されます。 ブロックを実行するかどうかを決定する比較は、counter
が正の場合は <end
= step
、counter
が負の場合は >end
= step
。
ループ内で counter
の値を変更すると、コードの読み取りとデバッグが難しくなる可能性があります。
start
、end
、またはstep
の値を変更しても、ループが最初に入力されたときに決定された反復値には影響しません。
ループを入れ子にすると、内部レベルのNext
ステートメントの前に外側の入れ子レベルのNext
ステートメントが検出された場合、コンパイラはエラーを通知します。 ただし、コンパイラは、すべてのcounter
ステートメントでNext
を指定した場合にのみ、この重複するエラーを検出できます。
ステップ引数
step
の値は、正または負のいずれかになります。 このパラメーターは、次の表に従ってループ処理を決定します。
ステップ値 | ループは次の場合に実行されます。 |
---|---|
正またはゼロ |
counter
<= end |
否定的 |
counter
>= end |
step
の既定値は 1 です。
反論
次の表は、 counter
が、 For…Next
ループ全体をスコープとする新しいローカル変数を定義するかどうかを示しています。 この決定は、 datatype
が存在するかどうか、および counter
が既に定義されているかどうかによって異なります。
datatype が存在しますか? |
counter は既に定義されていますか? |
結果 ( counter が、 For...Next ループ全体をスコープとする新しいローカル変数を定義するかどうか) |
---|---|---|
いいえ | イエス | いいえ。 counter は既に定義されているためです。
counter のスコープがプロシージャに対してローカルでない場合は、コンパイル時の警告が発生します。 |
いいえ | いいえ | はい。 データ型は、 start 、 end 、および step 式から推論されます。 型推論の詳細については、「 Option Infer ステートメント 」および 「ローカル型推論」を参照してください。 |
イエス | イエス | はい。ただし、既存の counter 変数がプロシージャの外部で定義されている場合に限ります。 その変数は分離されたままです。 既存の counter 変数のスコープがプロシージャに対してローカルである場合、コンパイル時エラーが発生します。 |
イエス | いいえ | はい。 |
counter
のデータ型によってイテレーションの型が決まります。これは次のいずれかの型である必要があります。
Byte
、SByte
、UShort
、Short
、UInteger
、Integer
、ULong
、Long
、Decimal
、Single
、またはDouble
。Enum ステートメントを使用して宣言する列挙型。
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
必要に応じて、counter
ステートメントでNext
変数を指定できます。 この構文を使用すると、全体的にプログラムの読みやすさが向上し、特に入れ子になった For
ループがある場合に効果的です。 対応する For
ステートメントに表示される変数を指定する必要があります。
start
、end
、およびstep
式は、counter
の型に拡大する任意のデータ型に評価できます。
counter
にユーザー定義型を使用する場合は、CType
、start
、または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
こちらも参照ください
.NET