Usar Try-Catch en VBA

Glen Alfaro 18 abril 2022
  1. Use On Error Resume Next para manejar errores en VBA
  2. Use On Error GoTo 0 para manejar errores en VBA
  3. Use On Error GoTo [Label] para manejar errores en VBA
Usar Try-Catch en VBA

El método Try-Catch evita que el programa se cuelgue cuando se produce un error interno en la programación del ordenador. Es útil para evitar errores del sistema y permitir que la ejecución del código fluya sin problemas.

Sin embargo, a diferencia de otros lenguajes de programación, VBA no tiene el bloque Try-Catch. En el lado bueno, tiene métodos alternativos diseñados explícitamente para los procedimientos de manejo de errores.

En este artículo, se discutirán y demostrarán los procedimientos de manejo de errores en VBA junto con varios ejemplos que lo ayudarán a implementar esquemas de manejo de errores en su proyecto de VBA.

Los controladores de errores son una parte importante de su código. Son nuestro tipo de referencia cuando el compilador de VBA no puede manejar las cosas.

A continuación se enumeran los métodos de manejo de errores de VBA:

  1. On Error Resume Next: ignorará cualquier error encontrado y el código continuará ejecutándose.
  2. On Error GoTo 0: detendrá el código en la línea que causa el error y mostrará un cuadro de mensaje que describe el error.
  3. On Error GoTo [Label]: puede especificar qué desea hacer si su código tiene un error.

Discutiremos todas estas rutinas de manejo de errores en detalle a continuación.

Use On Error Resume Next para manejar errores en VBA

Este controlador de errores permite que el compilador ignore el error y ejecute la siguiente línea de código. Es el controlador de errores de uso frecuente en VBA, ya que no necesita ningún código complicado para implementar.

Sin embargo, cuando utilice este controlador de errores, proceda con precaución ya que ignora los errores. Es posible que la ejecución del código no se ejecute según lo planeado con estos errores no detectados.

On Error Resume Next es mejor para saber qué tipo de errores es probable que encuentre. Y luego, si cree que es seguro ignorar estos errores, puede usar esto.

El bloque de código a continuación generará un error sin rutinas de manejo de errores porque la división por cero no está permitida matemáticamente.

Sub DivideNumbers()

Dim x,y,z as integer

x = 10/4
y = 15/0
z= 2/5

Debug.Print x & vbNewLine & y & vbNewLine & z

End Sub

Salida DivideNumbers:

Error: ! Runtime Error '11':
         Division by Zero

Usando el controlador de error On Error Resume Next:

Sub DivideNumbers()
    On Error Resume Next
 
Dim x, y, z As Integer

x = 10 / 4
y = 15 / 0
z = 2 / 5

Debug.Print x & vbNewLine & y & vbNewLine & z

End Sub

Salida DivideNumbers:

2.5

0

La salida DivideNumbers muestra que la segunda línea se omitió porque ocurrió un error de Division by Zero en esa línea.

Use On Error GoTo 0 para manejar errores en VBA

El controlador de errores On Error GoTo 0 restablece el comportamiento de error predeterminado del compilador.

Entonces, ¿por qué todavía usarlo? El controlador de errores On Error GoTo 0 aborda el riesgo de no detección de errores inducidos por el controlador de errores On Error Resume Next. Por lo tanto, On Error GoTo 0 se usa normalmente junto con On Error Resume Next para habilitar la detección de errores en la sección de código donde no debería ocurrir ningún error.

Para tener una mejor explicación, vea el bloque de código a continuación:

Sub ErrorSub()
    On Error Resume Next

'An error could happen in this area but will not be detected.

    On Error Goto 0

'Once an Error occurs, an error message will appear.

End Sub

Para un mejor ejemplo, vea el siguiente bloque de código.

Sub DivideNumbers()
    On Error Resume Next

Dim x, y, z, a, b, c

x = 3 / 2
y = 0 / 0
z = 2 / 6

Debug.Print x & vbNewLine & y & vbNewLine & z
    On Error GoTo 0

a = 8 / 7
b = 2 / 0
c = 2 / 7

Debug.Print a & vbNewLine & b & vbNewLine & c
End Sub

Salida DivideNumbers:

1.5
0.333333333333333

Entonces se produjo un error ya que el On Error Resume Next fue negado por el On Error GoTo 0 en la segunda parte del código.

Error: ! Runtime Error '11':
         Division by Zero

Use On Error GoTo [Label] para manejar errores en VBA

Los dos controladores de errores anteriores no manejan errores; ya sea que omitieron o ignoraron el error. El tercer controlador de errores, On Error GoTo [Label], le permitirá tratar el error y elegir la acción a tomar cuando ocurra un error.

Existen varias prácticas recomendadas para usar On Error GoTo [Label], una es finalizar la ejecución del código cuando se produce un error y la otra es corregir el error, luego volver a intentarlo y muchas más. El siguiente ejemplo demostrará el uso de On Error GoTo [Label].

El bloque de código a continuación terminará automáticamente el código cuando ocurra un error.

Sub DivideNumbertoNumber()
    On Error GoTo ErrHandler

Dim i As Integer

For i = 5 To -5 Step -1
Debug.Print i / i

Next i

ErrHandler:

End Sub

Salida DivideNumbertoNumber:

 1 
 1 
 1 
 1 
 1 

Como se observa, la ejecución del código se detenía cuando i = 0 ya que i dividido por i significaría 0 dividido por 0, lo que resultaría en un desbordamiento.

En el siguiente ejemplo, demostraremos cómo imprimir en la Ventana inmediata si ocurre un error. También podemos usar la propiedad Err.Description para imprimir el error real.

Sub DivideNumbertoNumber()
    On Error GoTo ErrHandler

Dim i As Integer

For i = 5 To -5 Step -1
Debug.Print i / i

Next i

Exit Sub

ErrHandler:
Debug.Print "An Error occured at i is equal to " & i & vbNewLine & "Error Type: " & Err.Description

End Sub

Salida DivideNumbertoNumber:

 1 
 1 
 1 
 1 
 1 
An Error occured at i is equal to 0
Error Type: Overflow

Tenga en cuenta que Exit Sub se colocó antes de ErrHandler para salir de la subrutina antes de que llegara a ErrHandler para los casos en que no se produjo el error. Si no se inserta el Exit Sub, el compilador ejecutaría el ErrHandler incluso si no hay error.