Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación 05/06/2026
En resumen — Un bucle While repite código mientras una condición siga siendo verdadera. Úsalo cuando no sabes de antemano el número de filas. Copia y adapta:
Sub BucleHastaVacio()
Dim i As Long
i = 2 ' empezar en la fila 2
Do While Cells(i, 1).Value <> "" ' corre mientras la columna A tenga datos
Cells(i, 2).Value = Cells(i, 1).Value * 1.1
i = i + 1 ' el paso que termina el bucle
Loop
End Sub
Las historias de Excel congelado se remontan todas a una línea que falta. Entiende el porqué y no volverás a escribir una.
La idea central: un bucle es una promesa de que terminará — y la cumples tú
Un bucle For i = 1 To 100 termina solo. La instrucción For es dueña del contador; no puede correr para siempre aunque no hagas nada.
Un bucle While te entrega esa responsabilidad a ti. Corre exactamente mientras su condición sea True, y no tiene ni idea de cómo hacer que esa condición cambie. Así que cada bucle While es una promesa —«esto acabará volviéndose False»— y eres tú quien la cumple. Un bucle infinito no es un accidente raro; es lo que ocurre en el instante en que rompes la promesa.
Este encuadre te dice cuándo recurrir a un bucle While: para un número desconocido —«hasta que se acaben los datos», «hasta que el archivo abra»—. Si puedes cifrar los pasos de antemano, quieres For, y eliminas de raíz la posibilidad de romper la promesa.
La regla que cumple la promesa: inicio, prueba, paso
Todo bucle While correcto tiene las mismas tres partes. Nómbralas y el bucle infinito se vuelve imposible de escribir por accidente:
i = 2 ' 1. INICIO — fija la variable que lee la prueba
Do While Cells(i, 1).Value <> "" ' 2. PRUEBA — la promesa: esto se volverá False
' ... el trabajo ...
i = i + 1 ' 3. PASO — mueve la variable HACIA la salida
Loop
Un bucle infinito es siempre una parte 3 rota: falta el paso, o se aleja de la salida (decrementar cuando la prueba quiere que el valor crezca). «¿Por qué no se detiene mi bucle?» tiene una sola respuesta — encuentra la variable de la PRUEBA y comprueba que el PASO la empuja hacia False.
Elegir la palabra clave — misma promesa, intención más clara
| Forma | Comprueba la promesa | Para qué |
|---|---|---|
Do While ... Loop |
antes de cada pasada | La opción moderna. El cuerpo puede correr 0 veces. |
Do Until ... Loop |
antes (se detiene si es verdadera) | Se lee «hasta terminar» — a menudo más claro. |
Do ... Loop While |
después de cada pasada | Cuando el cuerpo debe correr al menos una vez. |
While ... Wend |
antes de cada pasada | Heredado — sin Exit, evítalo en código nuevo. |
Do While condición y Do Until condición son el mismo bucle dicho de dos maneras — elige el que se lea más natural. La única recomendación real: prefiere Do a While...Wend, porque solo Do te deja salir antes.
' Prueba al final — el cuerpo siempre corre una vez (p. ej. pedir, luego validar)
Do
n = InputBox("Introduce un número positivo")
Loop While n <= 0
Cumplir la promesa en condiciones reales
Sal en cuanto termines — Exit Do supera a una variable indicadora, y es la razón de preferir Do:
Do While Cells(i, 1).Value <> ""
If Cells(i, 1).Value < 0 Then
MsgBox "Primer negativo en la fila " & i
Exit Do
End If
i = i + 1
Loop
Cuando la salida depende del mundo exterior, añade una segunda promesa: un tope. Archivos, redes y otras aplicaciones fallan de forma intermitente, así que un bucle de reintento cuya única salida sea «funcionó» puede correr sin fin:
Dim intentos As Long
Do
intentos = intentos + 1
On Error Resume Next
Workbooks.Open "C:\informes\diario.xlsx"
On Error GoTo 0
If Not Workbooks Is Nothing Then Exit Do
Loop While intentos < 5 ' el tope, promesa de respaldo
La guarda intentos < 5 convierte «se autorrepara» en «no puede congelarse». Todo bucle que espera un estado externo debería tener una.
Cuando la promesa se rompe: el bucle infinito
Si nada en su interior puede volver la condición False, Excel muestra «no responde» y has roto la promesa. Tres comprobaciones lo evitan siempre:
- ¿El PASO cambia la variable que lee la PRUEBA? (
i = i + 1,n = n - 1, leer el siguiente registro…) - ¿El PASO va hacia la salida? (crecer cuando la prueba quiere
< 10, no decrecer) - ¿Un bucle con estado externo tiene un tope de iteraciones?
¿Atrapado ahora mismo en un bucle desbocado? Pulsa Esc o Ctrl + Pausa para interrumpir la macro, y corrige el PASO antes de volver a ejecutar.
Cuándo no deberías escribir el bucle en absoluto
Un bucle While es la herramienta correcta para «procesar hasta que se acaben los datos», pero también la forma más común en que una macro que funciona se convierte en silencio en una hoja congelada. ExcelMaster Agent te permite enunciar el objetivo en su lugar —«limpia cada fila de la columna A hasta que terminen los datos y escribe el resultado en la columna B»— y genera código acotado que cumple la promesa por ti. Pruébalo gratis →
Guías relacionadas
- Bucle For en VBA — cuando el número se conoce de antemano
- VBA If Then Else — la lista de comprobación para ramificar
- VBA Select Case — encaminar un valor hacia varias salidas
Preguntas frecuentes
¿Por qué mi bucle While de VBA nunca se detiene? El PASO falta o va en sentido equivocado. Encuentra la variable de la condición y asegúrate de que algo en su interior la empuje hacia el valor de salida. Añade un tope como red de seguridad.
¿Cuál es la diferencia entre While y Do While?
Funcionalmente casi idénticos al inicio del bucle. La diferencia práctica: Do While admite Exit Do y es la sintaxis moderna recomendada; While...Wend es heredado y no puede salir antes.
¿Cómo recorro filas hasta que una celda esté vacía?
Do While Cells(i, 1).Value <> "" (o Do Until Cells(i, 1).Value = ""), incrementando i en cada pasada. Detente en la primera celda vacía.
¿Do While o Do Until?
El que se lea con más claridad. Do While continúa mientras es verdadera; Do Until continúa hasta que es verdadera. Son intercambiables.
