VBA On Error – Mejores Prácticas de Manejo de Errores

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on marzo 3, 2022

Hoja de trucos de errores VBA

Errores

Descripción
Código VBA
On Error – Detener el código y mostrar el error
On Error Goto 0
On Error – Omitir el error y continuar la ejecución
En caso de error reanudar siguiente
On Error – Ir a una línea de código [Etiqueta]
On Error Goto [Etiqueta]
Borra (reinicia) el error
En caso de error Ir a-1
Muestra el número de error
MsgBox Err.Number
Muestra la descripción del error
MsgBox Err.Description
Función para generar un error propio
Err.Raise

Ver más «Cheat Sheets» de VBA y descargas gratuitas en PDF

Manejo de Errores de VBA

El Manejo deErrores de VBA se refiere al proceso de anticipar, detectar y resolver los Errores de Tiempo de Ejecución de VBA. El proceso de Manejo de Errores de VBA ocurre cuando se escribe el código, antes de que cualquier error ocurra realmente. Los errores de tiempo de ejecución de VBA son errores que ocurren durante la ejecución del código. Ejemplos de errores en tiempo de ejecución incluyen:

Declaración On Error de VBA

La mayor parte del manejo de errores de VBA se realiza con la sentencia On Error. La sentencia On Error le dice a VBA qué hacer si encuentra un error. Hay tres sentencias On Error:

  • On Error GoTo 0
  • On Error Resume Next
  • On Error GoTo Line

On Error GoTo 0

En el error Ir a 0 es la configuración por defecto de VBA. Puede restaurar esta configuración por defecto añadiendo la siguiente línea de código:

On Error GoTo 0

Cuando se produce un error con On Error GoTo 0, VBA dejará de ejecutar el código y mostrará su cuadro de mensaje de error estándar.

mensaje error por defecto

A menudo usted agregará un On Error GoTo 0 después de agregar el manejo de errores On Error Resume Next (próxima sección):

Sub ErrorGoTo0()
 
On Error Resume Next
    ActiveSheet.Shapes("Boton_Inicio").Delete
On Error GoTo 0
 
'correr más código
 
End Sub

On Error Resume Next

On Error Resume Next le dice a VBA que se salte cualquier línea de código que contenga errores y pase a la siguiente línea.

On Error Resume Next

Nota: On Error Resume Next no arregla un error, o lo resuelve de alguna manera. Simplemente le dice a VBA que proceda como si la línea de código que contiene el error no existiera. El uso inadecuado de On Error Resume Next puede tener consecuencias no deseadas.

Un buen momento para usar On Error Resume Next es cuando se trabaja con objetos que pueden o no existir. Por ejemplo, quiere escribir un código que borre una forma, pero si ejecuta el código cuando la forma ya está borrada, VBA arrojará un error. En su lugar, puede utilizar On Error Resume Next para indicar a VBA que elimine la forma si existe.

On Error Resume Next
    ActiveSheet.Shapes("Botin_Inicio").Delete
On Error GoTo 0

Observe que hemos añadido On Error GoTo 0 después de la línea de código que contiene el posible error. Esto reinicia el manejo del error.

En la siguiente sección le mostraremos cómo comprobar si se ha producido un error utilizando Err.Number, dándole opciones más avanzadas de manejo de errores.

Err.Number, Err.Clear, y Atrapando Errores

En lugar de simplemente saltar una línea que contenga un error, podemos atrapar el error utilizando On Error Resume Next y Err.Number. Err.Number devuelve un número de error correspondiente al tipo de error detectado. Si no hay error, Err.Number = 0.

Por ejemplo, este procedimiento devolverá «11» porque el error que se produce es el error de ejecución ’11’.

Sub NumeroDeError()
 
    On Error Resume Next
    ActiveCell.Value = 2 / 0
    MsgBox Err.Number
 
End Sub

error 11 division por cero

 

Manejo de errores con Err.Number

El verdadero poder de Err.Number reside en la capacidad de detectar si se ha producido un error(Err.Number <> 0). En el siguiente ejemplo, hemos creado una función que probará si existe una hoja utilizando Err.Number.

Sub probarHoja()
    MsgBox HojaExiste("prueba")
End Sub
 
Function HojaExiste(nombreHoja As String) As Boolean
    Dim hoja As Worksheet
    
    On Error Resume Next
    Set hoja = Sheets(nombreHoja)
    
    'If Error WS Does not exist
    If Err.Number <> 0 Then
        HojaExiste = False
    Else
        HojaExiste = True
    End If
 
    On Error GoTo -1
End Function

Nota: Hemos añadido un On Error GoTo -1 al final que restablece Err.Number a 0 (ver dos secciones más abajo).

Con On Error Resume Next y Err.Number, puede replicar la funcionalidad «Try» & «Catch » de otros lenguajes de programación.

On Error GoTo Line

(ir a la línea) On ErrorGoTo Line le dice a VBA que «vaya a» una línea de código etiquetada cuando se encuentra un error. Usted declara la sentencia GoTo así (donde errHandler es la etiqueta de la línea a la que hay que ir):

On Error GoTo errHandler

y crea una etiqueta de línea como esta

errHandler:

Nota: Esta es la misma etiqueta que usaría con una sentencia GoTo GoTo de VBA normal.

A continuación demostraremos el uso de la línea On Error GoTo para salir de un procedimiento.

On Error Exit Sub

Puede usar On Error GoTo Line para salir de un sub cuando ocurre un error.

Puede hacer esto colocando la etiqueta de la línea del manejador de errores al final de su procedimiento:

Sub ErrGoToEnd()

   On Error GoTo endProc

   'Algún código
    
   endProc:
End Sub

o usando el comando Exit Sub:

Sub ErrGoToEnd()
 
  On Error GoTo endProc
 
  'algún código
  GoTo skipExit
    
endProc:
    Exit Sub
 
skipExit:
 
  'Más código
 
End Sub

Err.Clear, On Error GoTo -1, y reseteando Err.Number

Después de manejar un error, generalmente debería borrar el error para prevenir futuros problemas con el manejo de errores.

Después de que ocurra un error, tanto Err. Clear como On Error GoTo -1 pueden usarse para restablecer Err. Number a 0. Pero hay una diferencia muy importante: Err.Clear no restablece el error en sí, sólo restablece el Err.Number.

¿Qué significa esto? Que usando Err.Clear, no podrá cambiar la configuración del manejo de errores. Para ver la diferencia, pruebe este código y reemplace On Error GoTo -1 con Err.Clear:

Sub ejemplos_de_errores()
 
    On Error GoTo errHandler:
        
    '"Error definido por la aplicación"
    Error (13)
    
    Exit Sub
errHandler:
    ' Borrar Error
    On Error GoTo -1
    
    On Error GoTo errHandler2:
    
    '"Error de tipo"
    Error (1034)
    
    Exit Sub
errHandler2:
    Debug.Print Err.Description
End Sub

Normalmente, recomiendo usar siempre On Error GoTo -1, a menos que tenga una buena razón para usar Err .Clear en su lugar.

VBA On Error MsgBox

También puede querer mostrar un cuadro de mensaje  en caso de error. Este ejemplo mostrará diferentes cuadros de mensaje dependiendo de donde ocurra el error:

Sub MensajesDeError()
 
Dim errMsg As String
On Error GoTo errHandler

    'Etapa 1
    errMsg = "Se ha producido un error durante la etapa de copiar y pegar"
    'Err.Raise (11)
    
    'etapa 2
    errMsg = "Se ha producido un error durante la etapa de Validación de Datos"
    'Err.Raise (11)
     
    'Etapa 3
    errMsg = "Se ha producido un error durante la etapa de creación y copia de la cuenta de resultados"
    'Err.Raise (11)
     
    'Etapa 4
    errMsg = "Se ha producido un error al intentar registrar la importación en la página de configuración"
    'Err.Raise (11)

    GoTo endProc
    
errHandler:
    MsgBox errMsg
   
endProc:
End Sub

Aquí debería reemplazar Err.Raise(11) por su código real.

VBA IsError

Otra forma de manejar los errores es probarlos con la función ISERROR de VBA. La función ISERROR prueba una expresión en busca de errores, devolviendo TRUE o FALSE si ocurre un error.

Sub EsError()
    MsgBox IsError(Range("a7").Value)
End Sub

If Error VBA

También puede manejar errores en VBA con la función IFERROR de Excel. Se debe acceder a la Función IFERROR utilizando la Clase WorksheetFunction:

Sub SiError()

    Dim n As Long
    n = WorksheetFunction.IfError(Range("a10").Value, 0)
    
    MsgBox n
End Sub

Esto mostrará el valor del Rango A10, si el valor es un error, mostrará 0 en su lugar.

Tipos de Error VBA

Errores en tiempo de ejecución

Como se dijo anteriormente: Los errores de tiempo de ejecución deVBA son errores que ocurren durante la ejecución del código. Ejemplos de errores en tiempo de ejecución son:

  • Referencia a un libro, hoja de trabajo u otro objeto inexistente
  • Datos no válidos p. ej. referenciando una celda de Excel que contiene un error
  • Intentar dividir por cero

mensaje error por defecto

Puede «manejar el error» de los errores de tiempo de ejecución utilizando los métodos discutidos anteriormente.

Errores de sintaxis

Los errores de sintaxisde VBA son errores de escritura de código. Ejemplos de errores de sintaxis incluyen:

  • Escribir mal
  • Falta o es incorrecta la puntuación

El Editor de VBA identifica muchos errores de sintaxis con el resaltado en rojo:

error de sintaxis

El Editor de VBA también tiene una opción de «Comprobación automática de sintaxis»:

comprobacion sintaxis opciones del editor

Cuando esta opción está marcada, el Editor VBA generará un cuadro de mensaje alertando de los errores de sintaxis después de introducir una línea de código:

mensaje error de sintaxis

Personalmente encuentro esto extremadamente molesto y deshabilito la característica.

Errores de compilación

Antes de intentar ejecutar un procedimiento, VBA «compila» el procedimiento. La compilación transforma el programa de código fuente (que puedes ver) a forma ejecutable (que no puedes ver).

Los errores de compilación de VBA son errores que impiden la compilación del código.

Un buen ejemplo de un error de compilación es una declaración de variable que falta:

error de compilacion

Otros ejemplos son:

  • For sin Next
  • Select sin End Select
  • If sin End If
  • Llamar a un procedimiento que no existe

Los errores de sintaxis (sección anterior) son un subconjunto de los errores de compilación.

Depuración > Compilación

Los errores de compilación aparecerán cuando intente ejecutar un procedimiento. Pero lo ideal es identificar los errores de compilación antes de intentar ejecutar el procedimiento.

Puede hacerlo compilando el proyecto con antelación. Para ello, vaya a Depuración > Compilar VBAProject.

pantalla depurar compilar

El compilador «irá» al primer error. Una vez que haya corregido ese error, compile el proyecto de nuevo. Repita la operación hasta que todos los errores estén corregidos.

Puede decir que todos los errores se han corregido porque Compilar Proyecto VBA estará en gris:

compilar proyecto completado

Error de desbordamiento

El error de desbordamiento de VBA ocurre cuando se intenta poner un valor en una variable que es demasiado grande. Por ejemplo, las variables enteras sólo pueden contener valores entre -32.768 y 32.768. Si introduce un valor mayor, recibirá un error de desbordamiento:

error de desbordamiento

En su lugar, debes utilizar la Variable Long para almacenar el número mayor.

Otros Términos de Error de VBA

Error VBA Catch

A diferencia de otros lenguajes de programación, en VBA no existe la sentencia Catch. Sin embargo, puede replicar una sentencia Catch utilizando On Error Resume Next y If Err.Number <> 0 Then. Esto está cubierto arriba en Manejo de Errores con Err.Number.

Ignorar errores en VBA

Para ignorar errores en VBA, simplemente use la sentencia En caso de error reanudar Next declaración:

On Error Resume Next

Sin embargo, como se mencionó anteriormente, debe tener cuidado al usar esta sentencia ya que no corrige un error, simplemente ignora la línea de código que contiene el error.

VBA Throw Error / Err.Raise

Para pasar un error en VBA, se utiliza el método Err.Raise. Esta línea de código lanzará el error de ejecución ’13’: Error de tipo:

Err.Raise (13)

mensaje error por defecto

Trampa de Errores VBA

VBA Error Trapping es otro término para el manejo de errores en VBA.

Mensaje de Error VBA

Un Mensaje de Error VBA se ve así:

mensaje error por defecto

Cuando haga clic en «Depurar», verá la línea de código que está arrojando el error:

depurar error 13

Manejo de Errores VBA en un Bucle

La mejor manera de manejar el error dentro de un bucle es usando On Error Resume Next junto con Err.Number para detectar si ha ocurrido un error (Recuerde usar Err.Clear para borrar el error después de cada ocurrencia).

El ejemplo de abajo dividirá dos números (Columna A por Columna B) y mostrará el resultado en la Columna C. Si hay un error, el resultado será 0.

Sub prueba()
    Dim cell As Range
    On Error Resume Next
    For Each cell In Range("a1:a10")

        'Establecer el valor de la celda
        cell.Offset(0, 2).Value = cell.Value / cell.Offset(0, 1).Value
        
        'si el valor de la celda es un error, el valor por defecto es 0
        If Err.Number <> 0 Then
             cell.Offset(0, 2).Value = 0
             Err.Clear
        End If
    Next
End Sub

Manejo de Errores VBA en Access

Todos los ejemplos anteriores funcionan exactamente igual en Access VBA que en Excel VBA.

Function DelRecord(frm As Form)
'esta función se utiliza para eliminar un registro de una tabla desde un formulario
   On Error GoTo ending
   With frm
      If .NewRecord Then
         .Undo
         Exit Function
      End If
   End With
   With frm.RecordsetClone
      .Bookmark = frm.Bookmark
      .Delete
      frm.Requery
   End With
   Exit Function
   ending:
   End
End Function
vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples