Café y Código

4. Bucles: For Next y Do While

En esta lección aprenderás a:

  • Repetir código un número exacto de veces con For i = 1 To N … Next i.
  • Repetir mientras se cumpla una condición con Do While … Loop.
  • Recorrer cada celda de un rango con For Each … In … Next.
  • Salir anticipadamente de un bucle con Exit For.

For Next — número fijo de repeticiones

NumerarFilas.bas
VBA
1 Sub NumerarFilas()
2 Dim i As Integer
3
4 For i = 1 To 10
5 Cells(i, 1).Value = "Fila " & i
6 Next i
7 End Sub

Vista tipo Excel: la primera fila muestra las letras de columna; la primera columna muestra los números de fila. En las celdas con fórmula (=...), cada referencia lleva un color distinto. Clic en la referencia: resalta solo esa celda. Clic en el resto de la celda (por ejemplo el = o los operadores): resalta todas las celdas citadas. Repetir el mismo gesto sobre lo ya resaltado lo oculta.

Ejemplos de StepResumen

Si omites Step el incremento por defecto es 1.

AB
1 CódigoResultado
2For i = 10 To 1 Step -1Cuenta de 10 hasta 1
3For i = 0 To 100 Step 10Cuenta 0, 10, 20, … 100
4For i = 2 To 20 Step 2Solo números pares: 2, 4, 6…

Do While — repetir mientras una condición sea verdadera

RecorrerHastaVacio.bas
VBA
1 Sub RecorrerHastaVacio()
2 Dim fila As Long
3 fila = 2
4
5 Do While Cells(fila, 1).Value <> ""
6 Cells(fila, 3).Value = Cells(fila, 2).Value * 1.19
7 fila = fila + 1
8 Loop
9 End Sub

For Each — recorrer una colección

ColorearNegativos.bas
VBA
1 Sub ColorearNegativos()
2 Dim celda As Range
3
4 For Each celda In Range("B2:B20")
5 If celda.Value < 0 Then
6 celda.Interior.Color = RGB(255, 200, 200)
7 End If
8 Next celda
9 End Sub

Exit For — salir antes de tiempo

BuscarProducto.bas
VBA
1 Sub BuscarProducto()
2 Dim i As Long
3 Dim buscar As String
4 buscar = "Laptop"
5
6 For i = 2 To 100
7 If Cells(i, 1).Value = buscar Then
8 MsgBox "Encontrado en fila " & i
9 Exit For
10 End If
11 Next i
12 End Sub

Practica en Excel

Abre Excel (o copia los datos con el botón de la tabla), sigue los pasos y comprueba el resultado en tu hoja.

  1. Crea NumerarFilas() y verifica que A1:A10 queda numerado. Modifica el For para numerar de la fila 5 a la 15.
  2. Escribe datos en A2:A8 y números en B2:B8. Ejecuta RecorrerHastaVacio() y verifica C.
  3. Agrega valores negativos en B2:B20 y ejecuta ColorearNegativos(). Modifica para que positivos queden en verde.
  4. Escribe "Laptop" en alguna fila de la col A y ejecuta BuscarProducto().

Ejercicios de práctica

Ejercicio 1 — Números del 1 al 20

Escribe los números del 1 al 20 en la columna A usando For i = 1 To 20.

Ver solución sugerida
Del1Al20.bas
VBA
1 Sub Del1Al20()
2 Dim i As Integer
3 For i = 1 To 20
4 Cells(i, 1).Value = i
5 Next i
6 End Sub

Ejercicio 2 — Múltiplos de 5

Usa Step 5 para escribir en la columna A los múltiplos de 5 desde 5 hasta 100.

Ver solución sugerida
MultiplosDe5.bas
VBA
1 Sub MultiplosDe5()
2 Dim i As Integer
3 Dim fila As Integer
4 fila = 1
5 For i = 5 To 100 Step 5
6 Cells(fila, 1).Value = i
7 fila = fila + 1
8 Next i
9 End Sub

Ejercicio 3 — Tabla de multiplicar

Escribe la tabla de multiplicar del 7 en la columna A (7×1=7, 7×2=14, … 7×12=84) usando un bucle For.

Ver solución sugerida
TablaDelSiete.bas
VBA
1 Sub TablaDelSiete()
2 Dim i As Integer
3 For i = 1 To 12
4 Cells(i, 1).Value = "7 x " & i & " = " & 7 * i
5 Next i
6 End Sub

Ejercicio 4 — Suma de un rango

Escribe 10 números en B1:B10. Usa For Each para sumarlos en una variable y mostrar el total con MsgBox.

Ver solución sugerida
SumaRango.bas
VBA
1 Sub SumaRango()
2 Dim celda As Range
3 Dim suma As Double
4 suma = 0
5
6 For Each celda In Range("B1:B10")
7 suma = suma + celda.Value
8 Next celda
9
10 MsgBox "Total: " & suma
11 End Sub

Ejercicio 5 — Cuenta atrás

Usa For i = 10 To 1 Step -1 para escribir "10, 9, 8... 1" en A1:A10 y en A11 escribe "¡Despegue!".

Ver solución sugerida
CuentaAtras.bas
VBA
1 Sub CuentaAtras()
2 Dim i As Integer
3 For i = 10 To 1 Step -1
4 Cells(11 - i, 1).Value = i
5 Next i
6 Cells(11, 1).Value = "¡Despegue!"
7 End Sub

Ejercicio 6 — Contar celdas no vacías ⭐⭐

Escribe datos en algunas celdas de A1:A20 (deja otras vacías). Usa For Each y un contador para contar cuántas tienen contenido. Muestra el resultado con MsgBox.

Ver solución sugerida
ContarNoVacias.bas
VBA
1 Sub ContarNoVacias()
2 Dim celda As Range
3 Dim contador As Integer
4 contador = 0
5
6 For Each celda In Range("A1:A20")
7 If celda.Value <> "" Then
8 contador = contador + 1
9 End If
10 Next celda
11
12 MsgBox "Celdas con contenido: " & contador
13 End Sub

Ejercicio 7 — Cuadrados ⭐⭐

Escribe números en A1:A10. Usa un bucle For para escribir en la columna B el cuadrado de cada número de la columna A.

Ver solución sugerida
Cuadrados.bas
VBA
1 Sub Cuadrados()
2 Dim i As Integer
3 For i = 1 To 10
4 Cells(i, 2).Value = Cells(i, 1).Value ^ 2
5 Next i
6 End Sub

Ejercicio 8 — Máximo sin función ⭐⭐

Escribe 10 números en B1:B10. Usa For Each para encontrar el valor máximo sin usar la función Max de VBA. Muéstralo con MsgBox.

Ver solución sugerida
MaximoManual.bas
VBA
1 Sub MaximoManual()
2 Dim celda As Range
3 Dim maximo As Double
4 maximo = Cells(1, 2).Value
5
6 For Each celda In Range("B1:B10")
7 If celda.Value > maximo Then
8 maximo = celda.Value
9 End If
10 Next celda
11
12 MsgBox "Máximo: " & maximo
13 End Sub

Ejercicio 9 — Do While hasta "FIN" ⭐⭐

Escribe nombres en A2:A8 y en A9 escribe "FIN". Usa Do While para leer y mostrar en Debug.Print cada nombre hasta encontrar "FIN".

Ver solución sugerida
LeerHastaFin.bas
VBA
1 Sub LeerHastaFin()
2 Dim fila As Long
3 fila = 2
4
5 Do While Cells(fila, 1).Value <> "FIN"
6 Debug.Print Cells(fila, 1).Value
7 fila = fila + 1
8 Loop
9 Debug.Print "Fin de la lista."
10 End Sub

Ejercicio 10 — Todas las hojas ⭐⭐

Usa For Each hoja In Worksheets para recorrer todas las hojas del libro y mostrar sus nombres en la ventana Inmediata con Debug.Print.

Ver solución sugerida
ListarHojas.bas
VBA
1 Sub ListarHojas()
2 Dim hoja As Worksheet
3 For Each hoja In Worksheets
4 Debug.Print hoja.Name
5 Next hoja
6 End Sub

Ejercicio 11 — Contar valores mayores que 100 ⭐⭐⭐

Escribe 15 números en B1:B15 (mezcla valores menores y mayores que 100). Usa For Each para contar cuántos son mayores que 100 y escribe ese conteo en D1.

Ver solución sugerida
ContarMayores.bas
VBA
1 Sub ContarMayores()
2 Dim celda As Range
3 Dim contador As Integer
4 contador = 0
5
6 For Each celda In Range("B1:B15")
7 If celda.Value > 100 Then
8 contador = contador + 1
9 End If
10 Next celda
11
12 Range("D1").Value = contador
13 End Sub

Ejercicio 12 — Colorear urgentes ⭐⭐⭐

Escribe textos en A1:A15, algunos de ellos conteniendo la palabra "urgente". Usa For Each e InStr() para colorear en rojo las celdas que contengan esa palabra (sin importar mayúsculas).

Ver solución sugerida
ColorearUrgentes.bas
VBA
1 Sub ColorearUrgentes()
2 Dim celda As Range
3 For Each celda In Range("A1:A15")
4 If InStr(LCase(celda.Value), "urgente") > 0 Then
5 celda.Interior.Color = RGB(255, 150, 150)
6 Else
7 celda.Interior.Color = xlNone
8 End If
9 Next celda
10 End Sub

Ejercicio 13 — Primer negativo con Exit For ⭐⭐⭐

Escribe números en B1:B20 (algunos negativos). Usa For i con Exit For para encontrar la primera celda con valor negativo y mostrar su fila con MsgBox.

Ver solución sugerida
PrimerNegativo.bas
VBA
1 Sub PrimerNegativo()
2 Dim i As Long
3 Dim fila As Long
4 fila = 0
5
6 For i = 1 To 20
7 If Cells(i, 2).Value < 0 Then
8 fila = i
9 Exit For
10 End If
11 Next i
12
13 If fila > 0 Then
14 MsgBox "Primer negativo en fila: " & fila
15 Else
16 MsgBox "No hay valores negativos."
17 End If
18 End Sub

Ejercicio 14 — Promedio excluyendo ceros ⭐⭐⭐

Escribe números en C1:C20 (algunos son 0). Usa For Each para calcular el promedio de los valores que NO sean 0. Escribe el resultado en D1.

Ver solución sugerida
PromedioSinCeros.bas
VBA
1 Sub PromedioSinCeros()
2 Dim celda As Range
3 Dim suma As Double
4 Dim contador As Integer
5 suma = 0
6 contador = 0
7
8 For Each celda In Range("C1:C20")
9 If celda.Value <> 0 Then
10 suma = suma + celda.Value
11 contador = contador + 1
12 End If
13 Next celda
14
15 If contador > 0 Then
16 Range("D1").Value = suma / contador
17 Else
18 Range("D1").Value = "Sin datos"
19 End If
20 End Sub

Ejercicio 15 — Llenar tablero de multiplicar ⭐⭐⭐

Usa dos bucles For anidados para llenar un tablero de multiplicar del 1 al 10 en el rango A1:J10. Cells(fila, col).Value = fila * col.

Ver solución sugerida
TablaMultiplicar.bas
VBA
1 Sub TablaMultiplicar()
2 Dim fila As Integer
3 Dim col As Integer
4
5 For fila = 1 To 10
6 For col = 1 To 10
7 Cells(fila, col).Value = fila * col
8 Next col
9 Next fila
10 End Sub

Pon a prueba tus conocimientos

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.