Cómo usar los bucles For-Next Loops en Excel 2016 VBA

  1. Software
  2. Oficina de Microsoft
  3. Excel
  4. Cómo usar los bucles For-Next Loops en Excel 2016 VBA

Libro Relacionado

Programación de Excel VBA para Dummies, 4ª Edición

Por John Walkenbach

El tipo más simple de bucle en la programación de Excel VBA es el bucle For-Next. El bucle es controlado por una variable de contador, que comienza en un valor y se detiene en otro valor. Las sentencias entre la sentencia For y la sentencia Next son las sentencias que se repiten en el bucle.

A Por-Siguiente ejemplo

El siguiente ejemplo utiliza un bucle For-Next para sumar los primeros 1.000 números positivos. La variable Total comienza como cero. Entonces ocurre el bucle. La variable Cnt es el contador de bucle. Comienza como 1 y se incrementa en 1 cada vez que pasa por el bucle. El bucle termina cuando Cnt es de 1.000.

Este ejemplo sólo tiene una sentencia dentro del bucle. Esta sentencia añade el valor de Cnt a la variable Total. Cuando el bucle termina, un MsgBox muestra la suma de los números.

Sub AddNumbers() Dim Total As Double Dim Cnt As Long Total = 0 For Cnt = 1 to 1000 Total = Total + Cnt Next Cnt MsgBox TotalEnd Sub.

Debido a que el contador de bucle es una variable normal, puede escribir código para cambiar su valor dentro del bloque de código entre las sentencias For y Next. Sin embargo, se trata de una práctica muy mala.

Para los siguientes ejemplos con un paso

Puede utilizar un valor de Paso para omitir algunos valores de contador en un bucle For-Next. Este es el ejemplo anterior, reescrito para sumar sólo los números impares entre 1 y 1.000:

Sub AddOddNumbers() Dim Total As Double Dim Cnt As Long Total = 0 For Cnt = 1 To 1000 Step 2 Total = Total + Cnt Next Cnt MsgBox TotalEnd Sub

Esta vez, Cnt comienza como 1 y luego toma valores de 3, 5, 7, y así sucesivamente. El valor de Paso determina cómo se incrementa el contador. Observe que el valor del lazo superior (1000) no se utiliza realmente porque el valor más alto de Cnt será 999.

He aquí otro ejemplo que utiliza un valor de Paso de 3. Este procedimiento funciona con la hoja activa y aplica un sombreado gris claro a cada tercera fila, desde la fila 1 hasta la fila 100.

Sub ShadeEveryThirdRow() Dim i As Long For i = 1 a 100 Step 3 Rows(i).Interior.Color = RGB(200, 200, 200, 200) Next iEnd Sub

Compruebe el resultado de ejecutar esta macro.

Usando un bucle para aplicar el sombreado de fondo a las filas.

Un ejemplo de For-Next con una sentencia Exit For

Un bucle For-Next también puede incluir una o más sentencias Exit For dentro del bucle. Cuando el VBA encuentra esta declaración, el bucle termina inmediatamente.

El siguiente ejemplo muestra la sentencia Exit For. Esta rutina es un procedimiento de Función, destinado a ser utilizado en una fórmula de hoja de cálculo. La función acepta un argumento (una variable llamada Str) y devuelve los caracteres a la izquierda del primer dígito numérico. Por ejemplo, si el argumento es “KBR98Z”, la función devuelve “KBR”.

Función TextPart(Str) Dim i As Long TextPart = "" For i = 1 To Len(Str) If IsNumeric(Mid(Str, i, 1)) Luego Salir por otra parte TextPart = TextPart y Mid(Str, i, 1) Terminar si la siguiente función iEnd

El bucle For-Next comienza con 1 y termina con el número que representa el número de caracteres de la cadena. El código utiliza la función Mid de VBA para extraer un solo carácter dentro del bucle. Si se encuentra un carácter numérico, se ejecuta la sentencia Exit For y el bucle termina prematuramente.

Si el carácter no es numérico, se añade al valor devuelto (que es el mismo que el nombre de la función). La única vez que el bucle examinará cada carácter es si la cadena pasó como el argumento no contiene caracteres numéricos.

Un ejemplo anidado de For-Next

Puede tener cualquier número de sentencias en el bucle y anidar bucles For-Next dentro de otros bucles For-Next.

El siguiente ejemplo utiliza un bucle For-Next anidado para insertar números aleatorios en un rango de celdas de 12 filas por 5 columnas.

Observe que la rutina ejecuta el bucle interno (el bucle con el contador Row) una vez para cada iteración del bucle externo (el bucle con el contador Col). En otras palabras, la rutina ejecuta la sentencia Cells(Row, Col) = Rnd 60 veces.

Estas celdas se llenaron usando un bucle For-Next anidado.

 Subrango de llenado() Dim Col Como largo Dim Row Como largo Para Col = 1 a 5 Para Row = 1 a 12 Celdas(Row, Col) = Rnd Siguiente Fila Siguiente Siguiente Fila Siguiente ColEnd Submenú

El siguiente ejemplo utiliza bucles For-Next anidados para inicializar una matriz tridimensional con el valor 100. Esta rutina ejecuta la expresión en medio de todos los bucles (la expresión de asignación) 1.000 veces (10 * 10 * 10 * 10), cada vez con una combinación diferente de valores para i, j y k:

Sub NestedLoops() Dim MyArray(10, 10, 10) Dim i As Long Dim j As Long Dim k As Long Dim k As Long For i = 1 a 10 For j = 1 a 10 For k = 1 a 10 MyArray(i, j, k) = 100 Next k Siguiente k Siguiente jSiguiente jSiguiente i ' Otras afirmaciones ir aquíFin

He aquí un último ejemplo que utiliza bucles For-Next anidados, con un valor Step. Este procedimiento crea un tablero de ajedrez cambiando el color de fondo de las celdas alternas.

Usar bucles para crear un patrón de tablero de ajedrez.

El contador Row bucles de 1 a 8. Una construcción If-Then determina qué estructura For-Next anidada utilizar. Para las filas impares, el contador de columnas comienza con 2. Para las filas pares, el contador de columnas comienza con 1. Ambos bucles usan un valor de Paso de 2, por lo que las celdas alternas se ven afectadas. Dos declaraciones adicionales hacen que las celdas sean cuadradas (igual que un tablero de ajedrez real).

Sub MakeCheckerboard() Dim R As Long, C As Long For R = 1 to 8 If WorksheetFunction.IsOdd(R) Then For C = 2 to 8 Step 2 Cells(R, C).Interior.Color = 255 Next C Else For C = 1 to 8 Step 2 Cells(R, C).Interior.Color = 255 Next C End If Next Rows("1:8").RowHeight = 35 Columns("A:H").ColumnWidth = 6.5End Sub

No Responses

Write a response