🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Exit For en Excel — Exit For, Exit Do, Exit Sub y la salida anticipada limpia

|

VBA Exit For en Excel — Exit For, Exit Do, Exit Sub y la salida anticipada limpia

TL;DR — Exit For abandona un bucle For de inmediato; Exit Do abandona un bucle Do; Exit Sub y Exit Function vuelven 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 For solo abandona el bucle más interno, así que en bucles anidados el externo continúa. VBA no tiene Continue ni Exit If; para saltarte una iteración usas un If (o, rara vez, un GoTo a una etiqueta justo antes de Next).

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 Sub y Exit Function en una sola regla
  • Por qué Exit For sale de un bucle, y por qué el código posterior al bucle aún se ejecuta
  • La trampa número uno: Exit For solo abandona el bucle más interno en un For anidado
  • Por qué VBA no tiene Continue ni Exit 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 bloques If profundamente anidados
  • En qué se diferencia Exit Sub de End: 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