TL;DR —
Exit Forabandona un bucleForde inmediato;Exit Doabandona un bucleDo;Exit SubyExit Functionvuelven desde un procedimiento. Son una sola idea —sal ahora de la estructura actual— y el código que va después de esa estructura sigue ejecutándose. La trampa:Exit Forsolo abandona el bucle más interno, así que en bucles anidados el externo continúa. VBA no tieneContinueniExit If; para saltarte una iteración usas unIf(o, rara vez, unGoToa una etiqueta justo antes deNext).
Sub FindFirstMatch()
Dim i As Long, found As Long
For i = 1 To 100000
If Cells(i, 1).Value = "TARGET" Then
found = i
Exit For ' parar al encontrarlo - no hace falta recorrer el resto
End If
Next i
MsgBox IIf(found > 0, "Found on row " & found, "Not found")
End Sub
Exit es la forma de abandonar un bloque antes de tiempo sin abandonar el programa entero. Sal de un bucle
con Exit For o Exit Do, vuelve de un procedimiento con Exit Sub, y deja que
el resto de la macro siga adelante. Esa última parte es la clave de todo, y la línea que separa a Exit de
End: Exit cierra una puerta; End tira del enchufe.
Lo que aprenderás
- El modelo mental que une
Exit For,Exit Do,Exit SubyExit Functionen una sola regla - Por qué
Exit Forsale de un bucle, y por qué el código posterior al bucle aún se ejecuta - La trampa número uno:
Exit Forsolo abandona el bucle más interno en unForanidado - Por qué VBA no tiene
ContinueniExit If, y cómo saltarte una sola iteración limpiamente - El patrón de cláusula de guarda (
If ... Then Exit Sub) que sustituye a los bloquesIfprofundamente anidados - En qué se diferencia
Exit SubdeEnd: abandonar un procedimiento frente a detener toda la macro
El modelo mental: sal de esta estructura, deja el programa en marcha
Cada forma de Exit nombra la estructura que abandona, y abandona solo esa estructura:
Exit For ' sale del bucle For que lo contiene
Exit Do ' sale del bucle Do que lo contiene
Exit Sub ' sale del Sub que lo contiene (vuelve al llamador)
Exit Function ' sale de la Function que lo contiene (vuelve al llamador)
Piensa en tu procedimiento como un conjunto de habitaciones anidadas: un Sub contiene un bucle, y el bucle
contiene un If. Exit For sale de la habitación del bucle pero se queda dentro del Sub. Exit Sub sale
del procedimiento entero. En todos los casos, la ejecución se reanuda en lo siguiente que hay fuera de la
estructura que abandonaste: la línea después de Next, o el llamador que invocó tu Sub. Nada de lo que va
después de tu Exit dentro de ese bloque se ejecuta, pero todo lo que va después del bloque sí. Eso es lo que
hace que Exit sea estructurado: siempre sabes exactamente dónde aterriza el control, porque aterriza
justo fuera de la caja que nombraste.
Exit For: detener un bucle en cuanto has terminado
Por defecto, un bucle For ejecuta cada iteración. Muy a menudo no necesitas todas las iteraciones: estás
buscando, y en cuanto encuentras la respuesta, las pasadas que quedan son trabajo desperdiciado:
Dim i As Long
For i = 2 To 100000
If Cells(i, 1).Value = "" Then Exit For ' primera fila vacia - parar aqui
Next i
' i ahora contiene la fila donde paramos; la ejecucion sigue desde esta linea
Merece la pena fijar dos cosas. Primero, Exit For no reinicia ni borra el contador del bucle: tras el bucle,
i conserva el valor que tenía cuando saliste, que suele ser exactamente lo que quieres (la fila en la que te
detuviste). Segundo, el bucle es lo único que abandonaste. Cualquier código después de Next i se ejecuta
con normalidad. Si tu intención era abandonar el procedimiento entero, para eso está Exit Sub, no Exit For.
La trampa número uno: Exit For solo abandona el bucle más interno
Este es el error que le cuesta a la gente una tarde entera. Cuando anidas un For dentro de otro, Exit For
abandona solo el bucle en el que está —el interno—. El bucle externo sigue como si nada hubiera pasado:
Dim r As Long, c As Long
For r = 1 To 100
For c = 1 To 50
If Cells(r, c).Value = "STOP" Then Exit For ' sale SOLO del bucle c
Next c
' <-- el control aterriza AQUI, y el bucle externo r sigue hasta r = 100
Next r
No existe un Exit For, For para romper dos niveles a la vez. Cuando de verdad necesitas detener ambos
bucles, tienes tres opciones honestas: poner una bandera Boolean y comprobarla en la condición del bucle
externo; mover los bucles anidados a su propia Function y usar Exit Function para salir de los dos a la
vez; o —el único sitio donde los escritores de VBA con experiencia aún recurren a él— hacer GoTo a una
etiqueta justo después del Next externo. El enfoque de la Function suele ser el más limpio; mira
VBA GoTo para entender por qué el salto es el último recurso.
Exit Do: la misma idea para los bucles Do
Los bucles Do tienen su propia palabra clave, Exit Do, exactamente por la misma razón. Importa sobre todo
en el Do ... Loop sin condición, que de lo contrario se ejecutaría para siempre:
Dim n As Long
Do
n = n + 1
If n > 1000 Then Exit Do ' la unica salida de este bucle
Loop
Usa Exit Do dentro de Do While, Do Until y el Do ... Loop a secas. No intentes usar Exit For dentro
de un bucle Do ni al revés: la palabra clave debe coincidir con el tipo de bucle, o VBA lanza un error de
compilación. Para la diferencia entre las propias formas de bucle, mira VBA While Loop.
Exit Sub y Exit Function: volver antes de tiempo desde un procedimiento
Fuera de los bucles, la misma idea te hace volver desde un procedimiento entero. Exit Sub termina un Sub
de inmediato y devuelve el control a lo que lo haya llamado; Exit Function hace lo mismo con una Function,
devolviendo el valor que el nombre de la función tenga en ese momento:
Function SafeDivide(a As Double, b As Double) As Double
If b = 0 Then
SafeDivide = 0
Exit Function ' devolver 0 ahora; saltarse la division de abajo
End If
SafeDivide = a / b
End Function
Fíjate en el orden dentro de Exit Function: fija el valor de retorno antes de salir, porque Exit Function
se marcha de inmediato y nunca llega a las líneas de debajo. Esta forma de «comprueba una condición, abandona
pronto» es lo más útil que hace Exit, y tiene nombre.
El patrón de cláusula de guarda: Exit Sub en vez de Ifs anidados
Cuando un procedimiento tiene precondiciones —una hoja debe existir, una celda no puede estar vacía, el usuario
debe haber elegido algo— la estructura tentadora es una pirámide de bloques If anidados. La alternativa más
plana y legible es una cláusula de guarda: comprueba cada precondición al principio y haz Exit Sub si
falla, para que el trabajo de verdad se ejecute pegado al margen izquierdo, sin anidamiento:
Sub ProcessSelection()
If Selection Is Nothing Then Exit Sub
If Selection.Cells.Count = 0 Then Exit Sub
If Not TypeName(Selection) = "Range" Then Exit Sub
' llegados aqui, toda precondicion se cumple - haz el trabajo, sin anidar
Dim cell As Range
For Each cell In Selection
cell.Value = UCase(cell.Value)
Next cell
End Sub
Cada guarda se lee como una frase llana: «si no hay nada seleccionado, hemos terminado». La recompensa es que
el código importante nunca queda enterrado tres niveles de If hacia dentro. Cuando un procedimiento tiene una
razón clara para detenerse pronto, una guarda Exit Sub al principio le gana a envolver todo el cuerpo en
If ... End If.
En VBA no existe Continue ni Exit If
Dos cosas que los programadores que vienen de otros lenguajes buscan y no encontrarán. VBA no tiene una
sentencia Continue para saltar a la siguiente iteración, ni un Exit If: Exit solo abandona bucles
y procedimientos, nunca un bloque If (un If termina en su End If por sí solo). Para saltarte una
iteración de un bucle, envuelve el cuerpo en un If de modo que saltar sea simplemente «no hacer nada esta
vez»:
For i = 1 To n
If Cells(i, 1).Value = "" Then
' saltar filas vacias - simplemente no hacer nada y caer hasta Next
Else
' procesar aqui las filas no vacias
End If
Next i
Ese If invertido es el «continue» idiomático de VBA. La alternativa que verás en código antiguo —un GoTo a
una etiqueta colocada justo antes de Next— funciona, pero es un salto, y los saltos son más difíciles de
seguir que un If. Recurre a él solo cuando la lógica de salto esté de verdad demasiado enredada para un If,
y mira antes VBA GoTo.
Exit no es End: una puerta, no el enchufe
La frontera más importante de esta página. Exit Sub vuelve del procedimiento actual y deja que el
programa continúe: el llamador ejecuta su siguiente línea, tu limpieza se ejecuta, Excel queda en un estado
sensato. End detiene en seco toda la macro: descarta cada variable, cierra los
UserForms y —el daño de verdad— se salta cualquier limpieza que tuvieras pendiente, así que
Application.ScreenUpdating puede quedarse en False y los eventos pueden quedar deshabilitados. Cuando
quieres abandonar este procedimiento, la respuesta es casi siempre Exit Sub, nunca End.
Cómo te ayuda ExcelMaster
La salida anticipada es donde se encuentran «correcto» y «rápido»: una búsqueda que se detiene en la primera
coincidencia en lugar de recorrer 100.000 filas, un procedimiento que se retira limpiamente cuando sus entradas
son erróneas. Los dos errores clásicos son esperar que Exit For rompa bucles anidados y confundir Exit Sub
(abandonar el procedimiento) con End (detenerlo todo y saltarse la limpieza).
ExcelMaster te deja describir el objetivo
—«encuentra la primera fila donde la columna A esté vacía y detente»— y escribe el bucle con el Exit correcto,
añade cláusulas de guarda para las precondiciones y estructura la limpieza para que nada quede a medias. Tú
conservas el libro y el código.
Preguntas frecuentes
¿Cómo salgo de un bucle For en VBA?
Usa Exit For. Abandona de inmediato el bucle For que lo contiene y continúa en la primera línea después de
Next. Suele colocarse dentro de un If para que el bucle se detenga solo cuando se cumple una condición, por
ejemplo If Cells(i, 1).Value = "TARGET" Then Exit For. El contador del bucle conserva su valor actual después
de salir, que a menudo es la fila o el índice que buscabas.
¿Exit For sale de los bucles anidados?
No: Exit For abandona solo el bucle más interno en el que está; el bucle externo sigue corriendo. VBA no
tiene forma de salir de dos niveles de bucle con una sola sentencia. Para detener ambos, pon una bandera
Boolean y compruébala en el bucle externo, mueve los bucles anidados a una Function y usa Exit Function,
o haz GoTo a una etiqueta colocada después del Next externo.
¿Cuál es la diferencia entre Exit Sub y End?
Exit Sub vuelve del procedimiento actual y deja que el programa continúe: el llamador se reanuda y cualquier
limpieza que tengas se ejecuta. End detiene toda la macro de golpe: borra todas las variables, cierra los
formularios y se salta tu limpieza, lo que puede dejar ScreenUpdating desactivado o los eventos
deshabilitados. Para abandonar un procedimiento, usa Exit Sub; reserva End para emergencias de verdad.
¿Cómo me salto una iteración en un bucle de VBA?
VBA no tiene una sentencia Continue. La forma idiomática es envolver el cuerpo del bucle en un If para que
las iteraciones que quieres saltarte simplemente no hagan nada y caigan hasta Next. El código antiguo a veces
usa GoTo a una etiqueta justo antes de Next para emular Continue, pero un If invertido es más claro y
no introduce un salto.
¿Existen Exit Do y Exit While?
Existe Exit Do, que abandona cualquier bucle Do (Do While, Do Until o un Do ... Loop a secas). No
existe Exit While: el viejo bucle While ... Wend no tiene ninguna sentencia de salida, lo cual es una razón
más para preferir los bucles Do. La palabra clave Exit debe coincidir con el tipo de bucle: usa Exit For
en los bucles For y Exit Do en los bucles Do.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 24/09/2026.
Guías relacionadas: VBA GoTo · VBA End · VBA For Loop · VBA While Loop · VBA On Error
