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.

Manejar errores en Excel vba

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á.

Manejo de errores en Excel vba

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

You may also like...

1 Response

  1. lerh says:

    muchas gracias, navegando en está gran página encuentro la solución a casi todos mis problemas, gracias, saludos desde México

Leave a Reply

Your email address will not be published.

%d bloggers like this: