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. 詳細については、このトピックで後述する「 Counter 引数」を参照してください。For more information, see Counter Argument later in this topic.
datatype 省略可。Optional. counterのデータ型。Data type of counter. 詳細については、このトピックで後述する「 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. 指定した回数だけ実行される、ForNext 間の1つ以上のステートメント。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. このキーワードは、 Select...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で始まり、ループの反復ごとにインクリメントされ、index の値が5に達した後に終了します。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. -.25Step 引数は、ループの各反復処理で値を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 

ヒント

しばらくお待ちください... 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 ます。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...Next を終了します。The 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

Forには、任意の数の Exit For ステートメントを含めることができNextYou can put any number of Exit For statements in a ForNext loop。loop. 入れ子になった For...Next 内で使用する場合When 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. counterend の値よりも大きい場合 (または 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 ステートメントを検出するたびに、step によって counter がインクリメントされ、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. このプロセスは counterend になるか、Exit For ステートメントが検出されるまで続行されます。This process continues until counter passes end or an Exit For statement is encountered.

counterendになるまで、ループは停止しません。The loop doesn't stop until counter has passed end. counterendに等しい場合、ループは続行されます。If counter is equal to end, the loop continues. ブロックを実行するかどうかを決定する比較は、step が正の場合は end <= countercounterが負の場合は >= 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. ただし、コンパイラは、すべての Next ステートメントで counter を指定した場合にのみ、この重複エラーを検出できます。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
正または0Positive or zero counter <= end
不適切Negative counter >= end

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

Counter 引数Counter Argument

次の表は、counterFor…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. 型の推定の詳細については、「オプション推論ステートメントローカル型の推論」を参照してください。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:

  • ByteSByteUShortShortUIntegerIntegerULongLongDecimalSingleDoubleA 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 型。 BBoolean 式で使用できる型です。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

必要に応じて、Next ステートメントで counter 変数を指定することもできます。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にユーザー定義型を使用する場合は、startend、または step の型を counterの型に変換するために、CType 変換演算子を定義することが必要になる場合があります。If 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...次のステートメントの例では、降順に反復処理する 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

次の例では、列挙ステートメントを使用して宣言された列挙型を反復処理します。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