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

VBA On Error en Excel — Resume Next vs GoTo y por qué las macros esconden errores

|

VBA On Error en Excel — Resume Next vs GoTo y por qué las macros esconden errores

Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación el 08/06/2026

En resumenOn Error decide qué hace tu macro después de un error en tiempo de ejecución: por defecto se detiene y le planta un cuadro de diálogo en la cara al usuario. On Error cambia eso. Hay exactamente tres formas, y usar la equivocada es justo como las macros acaban corrompiendo datos en silencio:

Sub ProcesarDatos()
    On Error GoTo ControlErrores   ' cualquier error de abajo salta al controlador
    Dim hoja As Worksheet
    Set hoja = Sheets("Informe")   ' si "Informe" no existe → salta abajo
    hoja.Range("A1").Value = 100

    Exit Sub                       ' PÁRATE aquí, o te cuelas en el controlador
ControlErrores:
    MsgBox "El paso falló: " & Err.Description
End Sub

Las tres formas, en un solo bloque:

On Error GoTo ControlErrores   ' enruta los errores a un controlador con etiqueta — la opción fiable
On Error Resume Next           ' ignora el error y ejecuta la línea siguiente — peligroso si lo olvidas
On Error GoTo 0                ' VUELVE a desactivar el atrape — de nuevo "párate y muestra el diálogo"

El modelo mental: On Error es un interruptor para «¿adónde voy cuando me estrello?»

Imagina cada línea de tu macro conduciendo por una carretera. El comportamiento por defecto cuando una línea topa con un error en tiempo de ejecución —una hoja que no existe, un /0, un tipo incompatible— es pisar el freno a fondo: la ejecución se detiene y Excel muestra el recuadro amarillo Error en tiempo de ejecución '…' con Depurar / Finalizar. Para ti, en tiempo de diseño, eso está bien. Para un usuario que ejecuta tu herramienta, es un callejón sin salida que ni siquiera sabe leer.

On Error es el interruptor que redirige ese choque. No evita el error —el error sigue ocurriendo—, solo decide adónde va el control a continuación. Ese único cambio de enfoque despeja casi toda la confusión: no estás «atrapando» nada en el sentido de Java o Python, estás fijando un destino para el próximo choque.

El interruptor queda en esa posición durante el resto del procedimiento actual (o hasta que vuelvas a cambiarlo). Es por procedimiento — un controlador que pones en ProcesarDatos no hace nada por un Sub al que llame, salvo que ese Sub fije el suyo propio.

La única regla: On Error Resume Next esconde los errores, no los maneja

Esta es la regla que separa una macro robusta de una bomba de relojería:

On Error Resume Next le dice a VBA «sea lo que sea lo que se acaba de romper, finge que no pasó y sigue adelante». Silencia el síntoma. No arregla ni siquiera registra el problema.

Usado a propósito, en una línea concreta que esperas que falle, es perfecto. Usado a la ligera —un On Error Resume Next al principio de un Sub y luego olvidado— silencia todos los errores de ese procedimiento. La macro «funciona», escribe resultados medio vacíos y nadie se entera durante un mes.

El patrón honesto es ámbito reducido + comprobación inmediata + volver a desactivarlo:

' QUEREMOS borrar una forma que puede existir o no.
On Error Resume Next                 ' ármalo para exactamente una línea de riesgo
ActiveSheet.Shapes("LogoViejo").Delete
If Err.Number <> 0 Then Err.Clear    ' reconócelo y reinicia — la forma simplemente no estaba
On Error GoTo 0                      ' DESÁRMALO de inmediato — deja de ignorar errores

Tres cosas lo hacen seguro: cubre una sola línea, comprueba Err.Number justo después (ver el objeto Err) y llama a On Error GoTo 0 para desarmar. Quita cualquiera de las tres y vuelves a esconder errores.

La segunda trampa: olvidar Exit Sub antes del controlador

Un controlador con etiqueta no es más que código al final del procedimiento. Nada impide que el flujo normal se cuele directamente en él una vez terminado el trabajo de verdad:

Sub GuardarInforme()
    On Error GoTo ControlErrores
    ' ... trabajo de verdad que sale bien ...
    MsgBox "¡Guardado!"             ' mensaje de éxito
                                    ' ⚠ falta Exit Sub — la ejecución sigue bajando...
ControlErrores:
    MsgBox "Error al guardar."      ' ...y el usuario ve LOS DOS mensajes
End Sub

En una ejecución correcta el usuario recibe «¡Guardado!» y «Error al guardar.». La solución es una línea: Exit Sub (o Exit Function) justo antes de la etiqueta del controlador, para que el flujo normal abandone el procedimiento antes de poder colarse. Esta es la columna vertebral estructural que cubrimos en Manejo de errores en VBA.

On Error GoTo 0 — la forma que todos olvidan

On Error GoTo 0 restablece el atrape de errores al «párate y muestra el diálogo» por defecto. Importa por dos motivos:

  • Después de un Resume Next deliberado, es como dejas de ignorar los errores para que el siguiente fallo real no se trague en silencio.
  • Durante el desarrollo, es como dejas que VBA se detenga en la línea culpable para poder pulsar Depurar — en vez de que un controlador activo te aleje a rastras de la escena del crimen.
On Error Resume Next
Set libro = Workbooks("Presupuesto.xlsx")   ' quizá esté abierto, quizá no
On Error GoTo 0                             ' a partir de aquí, los errores vuelven a detener la macro
If libro Is Nothing Then Set libro = Workbooks.Open("C:\Datos\Presupuesto.xlsx")

La opinión: un On Error Resume Next pelado, sin comprobar Err, es un error, no robustez

La gente recurre a On Error Resume Next porque hace desaparecer el cuadro rojo, y «ningún mensaje de error» parece «ningún error». No lo es. Una macro que no puede fallar a voces es una macro en la que no puedes confiar — simplemente falla en silencio, dentro de tus datos.

Mi regla práctica: cada On Error Resume Next debe tener su comprobación de Err.Number correspondiente y un On Error GoTo 0 en pocas líneas. Si no puedes señalar a esos dos acompañantes, no has manejado el error — lo has enterrado. Para cualquier cosa que vaya más allá de saltarse un fallo esperado, usa On Error GoTo Etiqueta y un controlador de verdad.

Cuándo usar cada forma

Quieres… Usa Cuidado con
Enrutar todos los errores a un sitio y reaccionar On Error GoTo ControlErrores Pon Exit Sub antes de la etiqueta
Saltarte una línea que esperas que falle On Error Resume Next (reducido) Comprueba Err.Number, luego On Error GoTo 0
Dejar de ignorar / depurar en la línea real On Error GoTo 0 Sin él, Resume Next sigue armado
Reintentar la línea fallida tras una corrección Resume (en un controlador) Bucle infinito si no corriges la causa

Errores frecuentes con On Error (y la solución)

Síntoma Causa Solución
La macro corre pero los resultados están medio vacíos On Error Resume Next quedó activo y se traga errores reales Quítalo, o redúcelo a una línea + On Error GoTo 0
El usuario ve el mensaje de éxito y el de fallo Falta Exit Sub antes de la etiqueta del controlador Añade Exit Sub justo antes de ControlErrores:
«Etiqueta no definida» Hay On Error GoTo X pero ninguna etiqueta X: en este procedimiento Añade la etiqueta, o usa Resume Next/GoTo 0
El controlador salta pero no sabes qué se rompió Nunca leíste Err.Description / Err.Number Lee el objeto Err en el controlador
El error sigue deteniendo la macro tras correr el controlador El controlador corrió pero no hizo Resume ni Exit Decide la salida: Resume Next, Resume o Exit Sub

Cuando el manejo de errores es casi toda tu macro — describe el trabajo y ya

Fíjate cuánto de una macro «sencilla» se convierte en fontanería: arma el controlador, comprueba Err, desarma, limpia, decide si reanudas. En un flujo real —importar tres archivos, cuadrar por el ID de pedido, marcar las diferencias— el andamiaje de errores puede pesar más que la lógica que de verdad te importa. ExcelMaster Agent te deja enunciar ese trabajo en español sencillo y genera Python que ya gestiona los fallos y hace una copia de seguridad de tu archivo antes de tocar nada — sin On Error, sin Resume, sin corrupción silenciosa de datos. Prueba gratis →

Guías relacionadas

Preguntas frecuentes

¿Qué hace On Error en VBA? On Error fija qué ocurre cuando se produce un error en tiempo de ejecución en el procedimiento actual. En lugar del comportamiento por defecto (detenerse y mostrar el diálogo Error en tiempo de ejecución), puedes enrutar el error a un controlador (On Error GoTo Etiqueta), saltarte la línea que falla (On Error Resume Next) o restaurar el comportamiento por defecto (On Error GoTo 0).

¿Es mala práctica On Error Resume Next? No intrínsecamente — pero solo cuando se reduce a una única línea que esperas que pueda fallar, seguida de una comprobación de Err.Number y un On Error GoTo 0. Dejado activo a lo largo de todo un procedimiento silencia cada error, lo que esconde fallos y corrompe los resultados en silencio. Para el manejo general, prefiere On Error GoTo Etiqueta.

¿Cuál es la diferencia entre On Error GoTo 0 y On Error Resume Next? On Error Resume Next ignora los errores y continúa con la línea siguiente. On Error GoTo 0 hace lo contrario — desactiva el atrape de errores para que el siguiente error vuelva a detener la macro y mostrar el diálogo. Normalmente usas GoTo 0 para desarmar un bloque Resume Next.

¿Cómo desactivo el manejo de errores en VBA? Usa On Error GoTo 0. Borra cualquier On Error Resume Next o On Error GoTo Etiqueta activo en el procedimiento actual y restaura el comportamiento por defecto de VBA de detenerse ante el error.

¿Funciona On Error a través de los procedimientos llamados? No. On Error es por procedimiento. Si A fija un controlador y llama a B, un error en B no lo atrapa el controlador de A, salvo que B no tenga controlador propio — en cuyo caso el error sube hasta A. Cada procedimiento que necesite manejo debe fijar el suyo.