Instrucción For...Next (Visual Basic)For...Next Statement (Visual Basic)

Repite un grupo de instrucciones un número especificado de veces.Repeats a group of statements a specified number of times.

SintaxisSyntax

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

ElementosParts

PartePart DescripciónDescription
counter Obligatorio en la instrucción For.Required in the For statement. Variable numérica.Numeric variable. Variable de control del bucle.The control variable for the loop. Para obtener más información, vea el argumento Counter más adelante en este tema.For more information, see Counter Argument later in this topic.
datatype Opcional.Optional. Tipo de datos de counter.Data type of counter. Para obtener más información, vea el argumento Counter más adelante en este tema.For more information, see Counter Argument later in this topic.
start Requerido.Required. Expresión numérica.Numeric expression. Valor inicial de counter.The initial value of counter.
end Requerido.Required. Expresión numérica.Numeric expression. Valor final de counter.The final value of counter.
step Opcional.Optional. Expresión numérica.Numeric expression. Cantidad por la que se incrementa el counter cada vez a través del bucle.The amount by which counter is incremented each time through the loop.
statements Opcional.Optional. Una o varias instrucciones entre For y Next que ejecutan el número especificado de veces.One or more statements between For and Next that run the specified number of times.
Continue For Opcional.Optional. Transfiere el control a la siguiente iteración del bucle.Transfers control to the next loop iteration.
Exit For Opcional.Optional. Transfiere el control fuera del bucle For.Transfers control out of the For loop.
Next Requerido.Required. Finaliza la definición del bucle For.Terminates the definition of the For loop.

Nota

La palabra clave To se usa en esta instrucción para especificar el intervalo del contador.The To keyword is used in this statement to specify the range for the counter. También puede usar esta palabra clave en la Instrucción Case y en declaraciones de matriz.You can also use this keyword in the Select...Case Statement and in array declarations. Para obtener más información sobre las declaraciones de matriz, vea instrucción Dim.For more information about array declarations, see Dim Statement.

Ejemplos sencillosSimple Examples

Se usa un For... Next estructura cuando desee repetir un conjunto de instrucciones un número de veces.You use a For...Next structure when you want to repeat a set of statements a set number of times.

En el ejemplo siguiente, la variable index comienza con un valor de 1 y se incrementa con cada iteración del bucle, finalizando después del valor de index llega a 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

En el ejemplo siguiente, la variable number comienza en 2 y se reduce en 0,25 en cada iteración del bucle, finalizando después de que el valor de number llegue a 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. El argumento Step de -.25 reduce el valor en 0,25 en cada iteración del bucle.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 

Sugerencia

While... End while instrucción o do... La instrucción de bucle funciona bien cuando no se sabe de antemano cuántas veces ejecutar las instrucciones en el bucle.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. Sin embargo, cuando espera ejecutar el bucle un número determinado de veces, una For... Next bucle es una mejor opción.However, when you expect to run the loop a specific number of times, a For...Next loop is a better choice. El número de iteraciones se determina cuando se escribe el bucle por primera vez.You determine the number of iterations when you first enter the loop.

Anidar buclesNesting Loops

Puede anidar For bucles colocando un bucle dentro de otro.You can nest For loops by putting one loop within another. En el ejemplo siguiente se muestra For anidadas... Next estructuras que tienen valores de pasos diferentes.The following example demonstrates nested For...Next structures that have different step values. El bucle exterior crea una cadena para cada iteración del bucle.The outer loop creates a string for every iteration of the loop. El bucle interno reduce una variable de contador de bucle para cada iteración del bucle.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

Al anidar bucles, cada bucle debe tener una variable de counter única.When nesting loops, each loop must have a unique counter variable.

También puede anidar distintos tipos de estructuras de control.You can also nest different kinds control structures within each other. Para obtener más información, vea estructuras de control anidadas.For more information, see Nested Control Structures.

Salir de y continuar paraExit For and Continue For

La instrucción Exit For sale inmediatamente del For... NextThe Exit For statement immediately exits the ForNext bucle y transfiere el control a la instrucción que sigue a la instrucción Next.loop and transfers control to the statement that follows the Next statement.

La instrucción Continue For transfiere el control inmediatamente a la siguiente iteración del bucle.The Continue For statement transfers control immediately to the next iteration of the loop. Para obtener más información, vea instrucción continue.For more information, see Continue Statement.

En el ejemplo siguiente se muestra el uso de las instrucciones Continue For y Exit 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

Puede incluir cualquier número de instrucciones Exit For en un For... NextYou can put any number of Exit For statements in a ForNext realizar.loop. Cuando se usa dentro de For anidadas... NextWhen used within nested ForNext bucles, Exit For sale del bucle más interno y transfiere el control al siguiente nivel superior de anidamiento.loops, Exit For exits the innermost loop and transfers control to the next higher level of nesting.

Exit For se usa a menudo después de evaluar alguna condición (por ejemplo, en una estructura If... Then... Else).Exit For is often used after you evaluate some condition (for example, in an If...Then...Else structure). Es posible que desee usar Exit For para las siguientes condiciones:You might want to use Exit For for the following conditions:

  • Continuar la iteración no es necesario o imposible.Continuing to iterate is unnecessary or impossible. Un valor erróneo o una solicitud de finalización podría crear esta condición.An erroneous value or a termination request might create this condition.

  • Un Try... Catch... Finally instrucción detecta una excepción.A Try...Catch...Finally statement catches an exception. Puede usar Exit For al final del bloque de Finally.You might use Exit For at the end of the Finally block.

  • Tiene un bucle sin fin, que es un bucle que podría ejecutar un número de veces grande o incluso infinito.You have an endless loop, which is a loop that could run a large or even infinite number of times. Si detecta este tipo de condición, puede usar Exit For para escapar el bucle.If you detect such a condition, you can use Exit For to escape the loop. Para obtener más información, vea.. . Instrucción Loop.For more information, see Do...Loop Statement.

Implementación técnicaTechnical Implementation

Cuando una For... Next bucle se inicia, Visual Basic evalúa start, end y step.When a For...Next loop starts, Visual Basic evaluates start, end, and step. Visual Basic evalúa estos valores solo en este momento y, a continuación, asigna start a counter.Visual Basic evaluates these values only at this time and then assigns start to counter. Antes de que se ejecute el bloque de instrucciones, Visual Basic compara counter con end.Before the statement block runs, Visual Basic compares counter to end. Si counter ya es mayor que el valor de end (o menor si step es negativo), el bucle de For finaliza y el control pasa a la instrucción que sigue a la instrucción 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. De lo contrario, se ejecuta el bloque de instrucciones.Otherwise, the statement block runs.

Cada vez que Visual Basic encuentra la instrucción Next, incrementa counter de step y vuelve a la instrucción For.Each time Visual Basic encounters the Next statement, it increments counter by step and returns to the For statement. Una vez más, compara counter con end y, de nuevo, ejecuta el bloque o sale del bucle, en función del resultado.Again it compares counter to end, and again it either runs the block or exits the loop, depending on the result. Este proceso continúa hasta que counter pasa end o se encuentra una instrucción Exit For.This process continues until counter passes end or an Exit For statement is encountered.

El bucle no se detiene hasta que counter ha pasado end.The loop doesn't stop until counter has passed end. Si counter es igual a end, el bucle continúa.If counter is equal to end, the loop continues. La comparación que determina si se va a ejecutar el bloque es counter <= end si step es positivo y counter >= end si step es negativo.The comparison that determines whether to run the block is counter <= end if step is positive and counter >= end if step is negative.

Si cambia el valor de counter mientras se encuentra dentro de un bucle, el código podría ser más difícil de leer y depurar.If you change the value of counter while inside a loop, your code might be more difficult to read and debug. Cambiar el valor de start, end o step no afecta a los valores de iteración que se determinaron cuando se escribió el bucle por primera vez.Changing the value of start, end, or step doesn't affect the iteration values that were determined when the loop was first entered.

Si anida bucles, el compilador indicará un error si encuentra la instrucción Next de un nivel de anidamiento externo antes de la instrucción Next de un nivel interno.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. Sin embargo, el compilador puede detectar este error superpuesto solo si se especifica counter en cada instrucción Next.However, the compiler can detect this overlapping error only if you specify counter in every Next statement.

Argumento StepStep Argument

El valor de step puede ser positivo o negativo.The value of step can be either positive or negative. Este parámetro determina el procesamiento de bucles según la tabla siguiente:This parameter determines loop processing according to the following table:

Valor del pasoStep value El bucle se ejecuta siLoop executes if
Positivo o ceroPositive or zero counter <= end
NegativoNegative counter >= end

El valor predeterminado de step es 1.The default value of step is 1.

Argumento CounterCounter Argument

En la tabla siguiente se indica si counter define una nueva variable local cuyo ámbito es el bucle de For…Next completo.The following table indicates whether counter defines a new local variable that’s scoped to the entire For…Next loop. Esta determinación depende de si datatype está presente y de si ya se ha definido counter.This determination depends on whether datatype is present and whether counter is already defined.

¿Está datatype presente?Is datatype present? ¿@No__t_0 ya está definido?Is counter already defined? Resultado (si counter define una nueva variable local cuyo ámbito es el bucle de For...Next completo)Result (whether counter defines a new local variable that’s scoped to the entire For...Next loop)
NoNo Yes No, porque el counter ya está definido.No, because counter is already defined. Si el ámbito de counter no es local para el procedimiento, se produce una advertencia de tiempo de compilación.If the scope of counter isn't local to the procedure, a compile-time warning occurs.
NoNo NoNo Sí.Yes. El tipo de datos se deduce de las expresiones start, end y step.The data type is inferred from the start, end, and step expressions. Para obtener información sobre la inferencia de tipos, vea Option Infer Statement e inferencia de tipo local.For information about type inference, see Option Infer Statement and Local Type Inference.
Yes Yes Sí, pero solo si la variable de counter existente se define fuera del procedimiento.Yes, but only if the existing counter variable is defined outside the procedure. Esa variable sigue siendo independiente.That variable remains separate. Si el ámbito de la variable de counter existente es local para el procedimiento, se produce un error en tiempo de compilación.If the scope of the existing counter variable is local to the procedure, a compile-time error occurs.
Yes NoNo Sí.Yes.

El tipo de datos de counter determina el tipo de la iteración, que debe ser uno de los siguientes tipos:The data type of counter determines the type of the iteration, which must be one of the following types:

  • @No__t_0, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single o 0.A Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double.

  • Una enumeración que se declara mediante una instrucción enum.An enumeration that you declare by using an Enum Statement.

  • Interfaz Object.An Object.

  • @No__t_0 de tipo que tiene los operadores siguientes, donde B es un tipo que se puede utilizar en una expresión 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

Opcionalmente, puede especificar la variable counter en la instrucción Next.You can optionally specify the counter variable in the Next statement. Esta sintaxis mejora la legibilidad del programa, sobre todo si tiene bucles For anidados.This syntax improves the readability of your program, especially if you have nested For loops. Debe especificar la variable que aparece en la instrucción de For correspondiente.You must specify the variable that appears in the corresponding For statement.

Las expresiones start, end y step pueden evaluarse como cualquier tipo de datos que se amplíe al tipo de counter.The start, end, and step expressions can evaluate to any data type that widens to the type of counter. Si usa un tipo definido por el usuario para counter, es posible que tenga que definir el CType operador de conversión para convertir los tipos de start, end o step al tipo de counter.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.

EjemploExample

En el ejemplo siguiente se quitan todos los elementos de una lista genérica.The following example removes all elements from a generic list. En lugar de para cada... Instrucción siguiente, en el ejemplo se muestra un For... Next instrucción que recorre en iteración en orden descendente.Instead of a For Each...Next Statement, the example shows a For...Next statement that iterates in descending order. En el ejemplo se utiliza esta técnica porque el método removeAt hace que los elementos situados después del elemento quitado tengan un valor de índice inferior.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

EjemploExample

En el ejemplo siguiente se recorre en iteración una enumeración declarada mediante una instrucción 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

EjemploExample

En el ejemplo siguiente, los parámetros de instrucción usan una clase que tiene sobrecargas de operador para los operadores +, -, >= y <=.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

Vea tambiénSee also