Usar Try-Catch en VBA
-
Use
On Error Resume Next
para manejar errores en VBA -
Use
On Error GoTo 0
para manejar errores en VBA -
Use
On Error GoTo [Label]
para manejar errores 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:
On Error Resume Next
: ignorará cualquier error encontrado y el código continuará ejecutándose.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.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.