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

ステートメントのグループを指定した回数だけ繰り返されます。Repeats a group of statements a specified number of times.

構文Syntax

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

指定項目Parts

パーツPart 説明Description
counter 必要なForステートメント。Required in the For statement. 数値型の変数。Numeric variable. ループ コントロール変数。The control variable for the loop. 詳細については、次を参照してください。カウンター引数このトピックで後述します。For more information, see Counter Argument later in this topic.
datatype 省略可能です。Optional. データ型counterします。Data type of counter. 詳細については、次を参照してください。カウンター引数このトピックで後述します。For more information, see Counter Argument later in this topic.
start 必須。Required. 数値式。Numeric expression. counter の初期値になります。The initial value of counter.
end 必須。Required. 数値式。Numeric expression. 最終値counterします。The final value of counter.
step 省略可能です。Optional. 数値式。Numeric expression. counterループのたびに増加します。The amount by which counter is incremented each time through the loop.
statements 省略可能です。Optional. 1 つまたは複数のステートメント間ForNext指定された回数を実行します。One or more statements between For and Next that run the specified number of times.
Continue For 省略可能です。Optional. 次のループの反復処理の制御を転送します。Transfers control to the next loop iteration.
Exit For 省略可能です。Optional. うちに制御を転送、Forループします。Transfers control out of the For loop.
Next 必須。Required. 定義を終了、Forループします。Terminates the definition of the For loop.

注意

Toキーワードは、カウンターの範囲を指定するこのステートメントで使用されます。The To keyword is used in this statement to specify the range for the counter. このキーワードを使用することも、を選択しています.Case ステートメントと配列の宣言。You can also use this keyword in the Select...Case Statement and in array declarations. 配列の宣言に関する詳細については、次を参照してください。 Dim ステートメントします。For more information about array declarations, see Dim Statement.

簡単な例Simple Examples

使用する、 For.Next時間数の一連のステートメントを繰り返し表示するときに構造体します。You use a For...Next structure when you want to repeat a set of statements a set number of times.

次の例では、index変数の値が 1 で開始し、終了の値の後に、ループの反復ごとにインクリメントされますindex5 に到達します。In the following example, the index variable starts with a value of 1 and is incremented with each iteration of the loop, ending after the value of index reaches 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 になります。In the following example, the number variable starts at 2 and is reduced by 0.25 on each iteration of the loop, ending after the value of number reaches 0. Stepの引数-.25ループの各反復処理で 0.25 で値を減らします。The Step argument of -.25 reduces the value by 0.25 on each iteration of the loop.

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...Loop ステートメントは、ループ内でステートメントを実行する回数が事前にわからない場合にうまく機能します。A While...End While Statement or Do...Loop Statement works well when you don't know in advance how many times to run the statements in the loop. ただし、特定回数だけループを実行する場合はFor.Nextループの方が適しています。However, when you expect to run the loop a specific number of times, a For...Next loop is a better choice. ループを最初に入力するときに、イテレーションの数を決定します。You determine the number of iterations when you first enter the loop.

ループの入れ子Nesting Loops

入れ子にすることができますFor内に別の 1 つのループを配置することでループします。You can nest For loops by putting one loop within another. 次の例で入れ子になったFor.Next異なるステップ値を持つ構造体。The following example demonstrates nested For...Next structures that have different step values. 外側のループは、ループのイテレーションごとに文字列を作成します。The outer loop creates a string for every iteration of the loop. 内側のループのイテレーションごとのループ カウンター変数をデクリメントをループします。The inner loop decrements a loop counter variable for every iteration of the loop.

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変数。When nesting loops, each loop must have a unique counter variable.

内で他のさまざまな種類の制御構造を入れ子にすることもできます。You can also nest different kinds control structures within each other. 詳細については、次を参照してください。制御構造の入れ子になったします。For more information, see Nested Control Structures.

Exit For と Continue ForExit For and Continue For

Exit Forステートメントがすぐに終了させる、 For.NextThe Exit For statement immediately exits the ForNext これに続くステートメントにループと転送の制御、Nextステートメント。loop and transfers control to the statement that follows the Next statement.

Continue Forステートメント コントロールに直ちに移します、ループの次の反復処理します。The Continue For statement transfers control immediately to the next iteration of the loop. 詳細については、次を参照してください。 Continue ステートメントします。For more information, see Continue Statement.

次の例では、使用、Continue ForExit Forステートメント。The following example illustrates the use of the Continue For and Exit For statements.

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.NextYou can put any number of Exit For statements in a ForNext ループします。loop. 使用すると内で入れ子になったFor.NextWhen used within nested ForNext ループ、Exit For最も内側のループを終了し、入れ子の上位のレベルに制御を転送します。loops, Exit For exits the innermost loop and transfers control to the next higher level of nesting.

Exit For は何らかの条件 (たとえば、 If...Then...Else構造) を評価した後によく使用されます。Exit For is often used after you evaluate some condition (for example, in an If...Then...Else structure). 次の条件の場合、Exit Forを使用できます。You might want to use Exit For for the following conditions:

  • 反復処理を続けることは不要なか不可能です。Continuing to iterate is unnecessary or impossible. エラー値や終了要求は、この条件を作成可能性があります。An erroneous value or a termination request might create this condition.

  • Try...Catch...Finallyステートメントは例外をキャッチします。A Try...Catch...Finally statement catches an exception. Finallyブロックの最後にExit Forを使用できます。You might use Exit For at the end of the Finally block.

  • 何度も長時間または無限でも実行できるループ、無限ループがあります。You have an endless loop, which is a loop that could run a large or even infinite number of times. このような条件を検出した場合はExit Forを使用してループをエスケープすることができます。If you detect such a condition, you can use Exit For to escape the loop. 詳細については、Do...Loop ステートメントを参照してください。For more information, see Do...Loop Statement.

技術的な実装Technical Implementation

ときに、 For.Nextループの開始、Visual Basic の評価startend、およびstepします。When a For...Next loop starts, Visual Basic evaluates start, end, and step. Visual Basic では、この時間とし、割り当てにのみこれらの値を評価startcounterします。Visual Basic evaluates these values only at this time and then assigns start to counter. ステートメントの前にブロックが実行、Visual Basic の比較counterendします。Before the statement block runs, Visual Basic compares counter to end. 場合counterよりも大きいは既に、end値 (より小さい場合、またはstepが負の値)、Forループが終了と制御に続くステートメントに渡す、Nextステートメント。If counter is already larger than the end value (or smaller if step is negative), the For loop ends and control passes to the statement that follows the Next statement. それ以外の場合、ステートメント ブロックが実行されます。Otherwise, the statement block runs.

Visual Basic が発生するたびに、Nextインクリメント ステートメントでは、counterによってstepに戻って、Forステートメント。Each time Visual Basic encounters the Next statement, it increments counter by step and returns to the For statement. もう一度比較counterend、もう一度、ブロックが実行か、その結果に応じて、ループが終了したとします。Again it compares counter to end, and again it either runs the block or exits the loop, depending on the result. までこのプロセスは継続counter渡しますendまたはExit Forステートメントが見つかりました。This process continues until counter passes end or an Exit For statement is encountered.

まで、ループが停止しないcounter経過endします。The loop doesn't stop until counter has passed end. 場合counterと等しいendループが続行されます。If counter is equal to end, the loop continues. ブロックを実行するかどうかを決定する比較では、 counter <= end場合stepが正の値とcounter >= end場合stepが負の値。The comparison that determines whether to run the block is counter <= end if step is positive and counter >= end if step is negative.

値を変更する場合counterループ内で、コードは読み取り、デバッグが難しくなります。If you change the value of counter while inside a loop, your code might be more difficult to read and debug. 値を変更するstartend、またはstepループが最初に入力すると判断した反復値には影響しません。Changing the value of start, end, or step doesn't affect the iteration values that were determined when the loop was first entered.

ループを入れ子にする場合、コンパイラはエラーが発生したかどうか、Nextする前に外側の入れ子レベルのステートメント、Next内部レベルのステートメント。If you nest loops, the compiler signals an error if it encounters the Next statement of an outer nesting level before the Next statement of an inner level. ただし、コンパイラが検出できるこれを指定する場合にのみ、エラーを重複counterですべてNextステートメント。However, the compiler can detect this overlapping error only if you specify counter in every Next statement.

手順の引数Step Argument

step正または負にすることができます。The value of step can be either positive or negative. このパラメーターは、次の表に従って、ループ処理を決定します。This parameter determines loop processing according to the following table:

ステップ値Step value 場合、ループが実行されます。Loop executes if
正またはゼロPositive or zero counter <= end
Negative counter >= end

既定値のstepは 1 です。The default value of step is 1.

カウンターの引数Counter Argument

次の表に示すかどうかcounter全体をスコープは、新しいローカル変数を定義します。For…Nextループします。The following table indicates whether counter defines a new local variable that’s scoped to the entire For…Next loop. この決定によって異なるかどうかdatatypeが存在するかどうかおよびcounterは既に定義されています。This determination depends on whether datatype is present and whether counter is already defined.

datatype存在でしょうか。Is datatype present? counter既に定義されていますか?Is counter already defined? 結果 (かどうかcounter全体をスコープは、新しいローカル変数を定義しますFor...Nextループ)。Result (whether counter defines a new local variable that’s scoped to the entire For...Next loop)
いいえNo [はい]Yes いいえ、ためcounterは既に定義されています。No, because counter is already defined. 場合のスコープcounterいない、プロシージャに対してローカルに、コンパイル時に警告が発生します。If the scope of counter isn't local to the procedure, a compile-time warning occurs.
いいえNo いいえNo はい。Yes. データ型から推論されます、 startend、およびstep式。The data type is inferred from the start, end, and step expressions. 型の推定については、次を参照してください。 Option Infer ステートメントローカル型推論します。For information about type inference, see Option Infer Statement and Local Type Inference.
[はい]Yes [はい]Yes [はい] が場合にのみ、既存のcounterプロシージャの外部変数が定義されています。Yes, but only if the existing counter variable is defined outside the procedure. その変数は別に維持します。That variable remains separate. 場合、既存のスコープcounter変数は、プロシージャに対してローカルに、コンパイル時エラーが発生します。If the scope of the existing counter variable is local to the procedure, a compile-time error occurs.
[はい]Yes いいえNo はい。Yes.

データ型counterイテレーションでは、次の種類のいずれかを指定する必要がありますの種類を決定します。The data type of counter determines the type of the iteration, which must be one of the following types:

  • A ByteSByteUShortShortUIntegerIntegerULongLongDecimalSingle、またはDoubleします。A Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double.

  • 列挙体を使用して宣言する、 Enum ステートメントします。An enumeration that you declare by using an Enum Statement.

  • ObjectAn Object.

  • T、次の演算子を持つ場所B型で使用できるは、Boolean式。A type T that has the following operators, where B is a type that can be used in a Boolean expression.

    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ステートメント。You can optionally specify the counter variable in the Next statement. 入れ子にしていない場合は特に、この構文は、プログラムの読みやすさを向上Forループします。This syntax improves the readability of your program, especially if you have nested For loops. 対応する表示される変数を指定する必要がありますForステートメント。You must specify the variable that appears in the corresponding For statement.

startend、およびstep式が評価される任意のデータ型の型を拡張するcounterします。The start, end, and step expressions can evaluate to any data type that widens to the type of counter. ユーザー定義型を使用する場合counter、定義する必要がありますが、CType変換演算子の型に変換するstartend、またはstepの型にcounterIf you use a user-defined type for counter, you might have to define the CType conversion operator to convert the types of start, end, or step to the type of counter.

Example

次の例では、ジェネリック リストからすべての要素を削除します。The following example removes all elements from a generic list. この例では、For Each...Next ステートメントの代わりに、降順に反復処理するFor...Nextステートメントを使用します。Instead of a For Each...Next Statement, the example shows a For...Next statement that iterates in descending order. 例では、removeAtメソッドで削除された要素の後にある要素のインデックス値がより小さくなるため、この手法を使用します。The example uses this technique because the removeAt method causes elements after the removed element to have a lower index value.

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

Example

次の例を使用して宣言されている列挙型を反復処理、 Enum ステートメントします。The following example iterates through an enumeration that's declared by using an Enum Statement.

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

Example

次の例では、ステートメントのパラメーターが演算子のオーバー ロードを持つクラスを使用して、 +->=、および<=演算子。In the following example, the statement parameters use a class that has operator overloads for the +, -, >=, and <= operators.

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

関連項目See also