Curso Excel VBA y Macros – Cap. 25 – Implementar un Manejador de errores
Como desarrolladores de macros, realizamos aplicaciones de todo tipo, y tenemos la obligación tanto técnica como moral de desarrollar aplicaciones que funcionen de manera correcta. Y una manera de que nuestras aplicaciones funcionen bien, es manejar adecuadamente los errores que puedan suceder durante la ejecución.
En VBA podemos implementar un controlador de errores usando la instrucción ON ERROR GOTO, y lo podemos hacer de dos maneras:
- En case de que suceda un error, mostramos un mensaje o ejecutamos instrucciones.
- En caso de que suceda un error, seguimos con la ejecución de la macro.
Ver video Capítulo 25 Excel VBA & Macros
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Sintaxis de la instrucción On Error
On Error GoTo línea (etiqueta)
[On Error Resume Next]**Instrucciones
**[ On Error GoTo 0 ]
Exit Sub
Línea (etiqueta)
Instrucciones
Donde:
INSTRUCCIÓN | DESCRIPCIÓ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 restablecer el objeto Error. Regularmente se una cuando utilizamos On Error Resume Next. |
línea (etiqueta) | Es la línea de nuestra macro que será llamada al suceder un error |
Instrucciones | En caso de que suceda un error, ejecutamos estas instrucciones |
Exit Sub | Si usamos una etiqueta usamos Exit Sub para terminar la macr en caso de que no haya errores |
Ejemplo básico de una manejador de errores
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.
Macros de ejemplo
En esta macro cambiaremos el color de las etiquetas del archivo de ejemplo. Usaremos el bucle For Next para recorrer todas las hojas del archivo. En el momento en que no encuentre el nombre de la Hoja5, la macro deberá lanzar un error de Visual Basic.
El error que se lanzará es:
Se ha producido el error ‘9’ en tiempo de ejecución: Subíndice fuera del intervalo.
El error 9 nos indica que algún elemento de una matriz o una colección no existe o lo estamos llamando de manera incorrecta.
Option Explicit 'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'http://blogs.itpro.es/exceleinfo Sub SinManejadorDeErrores() Dim i As Byte Dim CantidadHojas As Byte Dim Nombre As String CantidadHojas = Application.ThisWorkbook.Sheets.Count For i = 1 To CantidadHojas Nombre = "Hoja" & i Sheets(Nombre).Tab.Color = VBA.vbRed Next End Sub
En la siguiente macro usaremos la instrucción On Error y en caso de que suceda un error, nos iremos a la etiqueta ManejadorErrores, la cual se escribirá con los puntos después de la etiqueta. En su defecto, en lugar de un nombre de etiqueta, podemos utilizar un número de línea.
Evaluaremos el número de error usando el objeto Err con la propiedad Number:
- Si es error 9, subíndice fuera del intervalo, quiere decir que la hoja no existe.
- Si es error 1004, error definido por la aplicación, puede ser que el archivo esté protegido (Revisar > Proteger libro).
Sub ConManejadorDeErrores() Dim i As Byte Dim CantidadHojas As Byte Dim Nombre As String On Error GoTo ManejadorErrores CantidadHojas = Application.ThisWorkbook.Sheets.Count For i = 1 To CantidadHojas Nombre = "Hoja" & i Sheets(Nombre).Tab.Color = VBA.vbBlue Next Exit Sub ManejadorErrores: If Err.Number = 9 Then MsgBox Err.Number & " " & Err.Description MsgBox Nombre & " no existe" ElseIf Err.Number = 1004 Then MsgBox Err.Number & " " & Err.Description MsgBox "Revise que el archivo no esté protegido." Else MsgBox Err.Number & " " & Err.Description End If End Sub
Ahora bien, en caso de que suceda un error, podemos indicarle a la macro que siga con la ejecución de la siguiente instrucción. Esto se logra usando On Error Resume Next.
Sub ContinuarEnCasoDeError() Dim i As Byte Dim CantidadHojas As Byte Dim Nombre As String On Error Resume Next CantidadHojas = Application.ThisWorkbook.Sheets.Count For i = 1 To CantidadHojas Nombre = "Hoja" & i Sheets(Nombre).Tab.Color = VBA.vbRed Next On Error GoTo 0 End Sub
Descarga el archivo de ejemplo
025 – Implementar un Manejador de errores.zip
Si te gustó este tutorial por favor regístrate en nuestra Lista de correo y Suscríbete a nuestro canal de YouTube para que estés siempre enterado de lo nuevo que publicamos.