Sobre declaración de error en Microsoft Excel VBA

Bilal Shahid 15 febrero 2024
  1. ¿Qué es la declaración On Error en VBA?
  2. En caso de error Ir a 0
  3. En caso de error Ir a <etiqueta>
  4. En caso de error, reanudar siguiente
  5. Conclusión
Sobre declaración de error en Microsoft Excel VBA

Excel VBA proporciona a los desarrolladores una variedad de funciones y características diferentes. Este artículo aprenderá sobre la declaración On Error en VBA.

¿Qué es la declaración On Error en VBA?

La declaración On Error en VBA se utiliza para indicar al compilador qué hacer a continuación en caso de error. Es una forma de realizar el manejo de errores en el código VBA.

El manejo de errores es el proceso de anticipar y resolver errores antes de que ocurran. Esto generalmente se hace para los errores de tiempo de ejecución que ocurren mientras se ejecuta el código, por ejemplo, al hacer referencia a un libro de Excel que no existe.

Dichos errores generan excepciones, que detienen la ejecución del código. Por lo tanto, para evitar esto, debemos anticipar la pieza de código que puede producir errores y realizar un manejo de errores adecuado en ellos.

Una forma fácil de manejar las excepciones en Excel VBA es usar la declaración On Error. Hay tres tipos de declaraciones On Error en VBA que tienen la siguiente sintaxis:

  1. En caso de error Ir a 0
  2. En caso de error Ir a <etiqueta>
  3. En caso de error, reanudar siguiente

Vamos a explicarlos uno por uno.

En caso de error Ir a 0

La declaración On Error Goto 0 es como no tener un manejo de errores porque usa la acción predeterminada de VBA para mostrar un mensaje de error estándar cuando encuentra una excepción. El mensaje de error mostrará el tipo y el nombre del error de tiempo de ejecución y el número asociado.

También proporcionará algunas opciones al usuario sobre qué hacer a continuación con el código. Estas opciones son:

  1. Continuar: Al pulsar esta opción se continuará con el código, ignorando el error. Sin embargo, es imposible hacerlo siempre, y la opción aparece atenuada y no es interactiva cuando la ejecución no puede continuar.
  2. Terminar: esta opción finaliza el programa y finaliza la ejecución.
  3. Depurar: esta opción te ayudará a depurar el código para encontrar el origen del error y solucionarlo. Al presionar esto, el programa pasa al modo de depuración, comenzando desde la línea donde se encontró la excepción.
  4. Ayuda: esta opción llevará al usuario a las páginas de ayuda oficiales de Microsoft, brindando información sobre la excepción.

Ejecutemos el siguiente código, que producirá un error si Book1.xlsx no existe en la lista de libros activos.

Sub ExampleGoto0()

On Error GoTo 0
Workbooks("Book1.xlsx").SaveAs

End Sub

En caso de error, se mostrará el siguiente cuadro de mensaje:

Mensaje de error

En caso de error Ir a <etiqueta>

La declaración On Error Goto <label> combina el manejo de errores con la declaración Goto al indicarle al compilador que vaya a una línea específica en el código cuando ocurre una excepción.

La línea se especifica mediante un número de línea o una etiqueta. Cuando ocurre un error, el control del programa se lleva a la línea seguida de la etiqueta, omitiendo cualquier código escrito en el medio.

Una etiqueta se declara en VBA usando la siguiente sintaxis:

labelname:

Nota: La línea o etiqueta especificada en la sentencia Goto debe estar en el mismo procedimiento que la sentencia On Error Goto, o se generará un error en tiempo de compilación.

Veamos cómo podemos usar una etiqueta para movernos a una línea en particular en caso de error.

Sub ExampleGotoLabel()

On Error GoTo errorhandler
Workbooks("Book1.xlsm").SaveAs
MsgBox "This line will not be executed"

Exit Sub

errorhandler:
Range("A1") = "Error handled"

End Sub

Nota: Debemos usar el comando Exit Sub justo antes de la etiqueta para evitar que las líneas después de la etiqueta se ejecuten cada vez, incluso cuando no hay error.

En caso de error, reanudar siguiente

La declaración On Error Resume Next omite la línea donde ocurrió el error y continúa la ejecución desde la línea siguiente. Es importante tener en cuenta que esta declaración no maneja los errores ni los resuelve; más bien, ignora la declaración errónea como si no existiera en el código.

Por lo tanto, la declaración On Error Resume Next puede ser muy complicada si no se implementa correctamente. Esto se debe a que podríamos omitir algunas líneas esenciales para el código que se ejecutará, como las inicializaciones de variables.

Para manejar tales situaciones, usamos la propiedad Err.Number del objeto Err, que realiza un seguimiento de todas las excepciones.

Cuando ocurre una excepción, se le asigna algún valor al Err.Number; en caso contrario, se establece como 0. Esta información puede rastrear cualquier excepción y realizar el manejo de errores en consecuencia.

Nota: Se recomienda utilizar la instrucción On Error Resume Next en lugar de On Error Goto cuando se trabaja con objetos.

Veamos el siguiente código, que generará una excepción si intentamos guardar un libro de trabajo que no existe. Debido a la declaración On Error Resume Next, la declaración errónea será ignorada.

Sub ExampleResumeNext1()

On Error Resume Next
Workbooks("Book1.xlsx").Save
Range("A1") = "Error skipped"

End Sub

Ahora, veamos otro ejemplo que demuestra el uso de la propiedad Err.Number para manejar situaciones en las que omitir una línea de código puede ser perjudicial.

Sub ExampleResumeNext2()

On Error Resume Next
N = 1 / 0  ' This line will cause an exception because of division by zero

If Err.Number <> 0 Then
N = 1  ' Some default value of N, so that it is not used uninitialized in the following lines
End If

For i = 1 To N
Range("A1") = i
Next i

End Sub

Conclusión

Esto resume nuestra discusión sobre la declaración On Error en VBA, que es un lenguaje de programación útil que ahorra un tiempo valioso a los usuarios de Microsoft Office. Esperamos que haya aprendido las diversas formas en que se utiliza la declaración On Error para el manejo de errores.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Artículo relacionado - VBA Error