Implementar controlador de errores en Excel vba
La instrucción On Error nos va a permitir implementar un manejador de errores en nuestras macros de Excel. Existen 3 maneras de utilizar la instrucción On Error.
Descripción
Instrucción | |
On Error GoTo línea | Lo usamos para que al momento de que se detecte algún error, pase el control a una línea o a una etiqueta. |
On Error Resume Next | Si se detecta un error, se pasará el control a la siguiente línea, omitiendo el anterior. |
On Error GoTo 0 | La usamos para desactivar cualquier manejador de error. Regularmente se una cuando utilizamos On Error Resume Next. |
Ver video Manejador de errores en macros de Excel
Suscríbete a mi canal de YouTube para aprender más de Excel y macros en videos.
En casos de que no utilicemos un manejador de error, lo que veremos es un mensaje propio de vba y se detendrá nuestra macro. Aquí el inconveniente es que los mensajes de error por default no siempre son tan descriptivos.
Figura 1. Un mensaje de error de vba detiene nuestra macros y debe volver a correrse.
Lo bueno del mensaje de error de vba es que podemos presionar el botón Depurar y nos dirige a la línea donde la ejecución de la macro se detuvo.
Caso práctico
Como ejemplo, tenemos una macro que le asigna un color rojo a 5 etiquetas de un archivo. Usamos un constructor For Next que va completando el nombre de las hojas, comenzando con Hoja1, Hoja2, y así sucesivamente.
La macro funciona perfectamente cuando tenemos las 5 hojas con los nombre del 1 al 5, pero cualquier cambio de nombre de alguna hoja o si protegemos el archivo, indudablemente nos marcará un error y macro se detendrá.
Figura 2. Las macro se ejemplo cambian el color de 5 hojas de un archivo.
Entendiendo On Error
Antes de compartirles el código completo de la macro debemos tener en cuenta que la instrucción On Error debe de ir antes de la líneas o las líneas que comiencen a ejecutar alguna acción de la macro.Yo siempre la pongo después de la declaración de variables.
Al terminar las líneas de nuestra macro, será necesario usar Exit Sub, Exit Function o Exit Property, ya que se supone que después de estas líneas seguirá la etiqueta que hemos definido para el manejo de error.
A continuación vemos la estructura de una macro con una manejador de error:
Sub MacroPrueba() On Error GoTo Errores 'Aquí va el código 'de nuestra macro 'Damos por terminada nuestra macro Exit Sub 'Esta etiqueta es la que nos permitirá 'asignar otro código para manera el error. Errores: 'Podemos usar un MsgBox para mostrar un mensaje End Sub
Los errores se almacenan en el objeto Err, por lo que podemos obtener el número de error con Err.Number o la descripción con Err.Description.
Ejemplos de código
Sin manejo de errores. Al encontrar un error detendrá la macro.
Sub SinManejo() ' Dim i As Integer Dim Nombre As String ' For i = 1 To 5 Nombre = "Hoja" & i Sheets(Nombre).Tab.Color = vbRed Next i ' End Sub
Con la instrucción On Error Goto. Al detectar un error mandará el control de la macro a la etiqueta Handler y podemos asignar un mensaje personalizado de error.
Sub OnErrorGoto() ' Dim i As Integer Dim Nombre As String ' On Error GoTo Handler ' For i = 1 To 5 Nombre = "Hoja" & i Sheets(Nombre).Tab.Color = vbRed Next i ' Exit Sub ' 'Etiqueta Handler: ' 'Usamos un Select Case para identificar los números de error Select Case Err.Number ' Case Is = 9 MsgBox Err.Number & " " & Err.Description MsgBox Nombre & " no existe" Case Is = 1004 MsgBox Err.Number & " " & Err.Description Case Else MsgBox Err.Number & " " & Err.Description End Select ' End Sub
Con la instrucción On Error Resume Next, al detectar un error, o que el nombre de una hoja no existe, se pasará a la siguiente y la macro no se detendrá.
Sub OnErrorResume() ' Dim i As Integer Dim Nombre As String ' On Error Resume Next ' For i = 1 To 5 Nombre = "Hoja" & i Sheets(Nombre).Tab.Color = vbRed Next i End Sub