VBA On Error – Mejores Prácticas de Manejo de Errores
In this Article
Hoja de trucos de errores VBA
Errores
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:
- Referencia a un libro de trabajo, hoja de trabajo u otro objeto inexistente(Error de ejecución 1004)
- Datos no válidos, por ejemplo, referencia a una celda de Excel que contiene un error (Error de tipo – Error de ejecución 13)
- Intentar dividir por cero
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.
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
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
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:
El Editor de VBA también tiene una opción de «Comprobación automática de sintaxis»:
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:
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:
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.
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:
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:
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)
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í:
Cuando haga clic en «Depurar», verá la línea de código que está arrojando el error:
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