VBA – On Error Resume Next or Goto 0 – Manejo de Errores
In this Article
Este tutorial le mostrará cómo utilizar los comandos de VBA On Error Resume Next y On Error Goto 0.
Lea nuestro Tutorial de Manejo de Errores para obtener más información sobre el manejo de errores en VBA.
On Error Resume Next
On Error Resume Next le dice a VBA que salte las líneas de código que contienen errores y continúe con la siguiente línea. Funciona de la siguiente manera:
Sub OnErrorResumeNextDemo()
On Error Resume Next
MsgBox 5 / 0
MsgBox "Hecho"
End Sub
La línea MsgBox 5 / 0 arrojaría un error (no se puede dividir por cero). Añadiendo On Error Resume Next, VBA se saltará esa línea y ejecutará el resto del procedimiento. Puede probar esto por su cuenta copiando y pegando el código y comentando On Error Resume Next.
On Error GoTo 0
On Error GoTo 0 es la configuración por defecto de VBA. Cuando ocurre un error con On Error GoTo 0, VBA detendrá la ejecución del código y mostrará su cuadro de mensaje de error estándar, por ejemplo:
No hay necesidad de declarar On Error GoTo 0 a menos que haya declarado algún otro manejo de errores anteriormente en su procedimiento. Si ha agregado una trampa de error como On Error Resume Next en su código, puede insertar On Error Goto 0 para restaurar el manejo de errores predeterminado de VBA.
Sub OnErrorResumeNextDemo()
On Error Resume Next
MsgBox 5 / 0
On Error GoTo 0
MsgBox "Hecho"
End Sub
Esto es importante On Error Resume Next debe usarse con precaución y sólo cuando sea absolutamente necesario.
Ejemplo – On Error Resume Next
Veamos un ejemplo para mostrar cómo puede utilizar On Error Resume Next en la práctica. Este código ocultará cada hoja de trabajo del libro:
Sub OcultarTodasLasHojas()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
End Sub
Si ejecutamos este código, obtendremos un error ya que no podemos ocultar todas las hojas de un libro de trabajo – al menos un libro de trabajo debe permanecer visible.
Sin embargo, si añadimos On Error Resume Next al procedimiento como se muestra a continuación, el código continuará más allá del error y dejará visible la última hoja del libro de trabajo.
Sub OcultarTodasLasHojas()
On Error Resume Next
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
End Sub
Ahora digamos que queremos agregar algo más de código a nuestro procedimiento. A continuación agreguemos On Error GoTo 0 para restaurar el manejo de errores por defecto de VBA.
Sub ErrorGoTo0()
On Error Resume Next
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
On Error GoTo 0
'Ejecute más código aquí, por ejemplo:
ActiveSheet.Name = "Hoja1"
End Sub
Ahora si ocurre un error después de On Error Goto 0 line aparecerá el mensaje de error por defecto de Excel. En este ejemplo, ya tenemos una hoja llamada Hoja1 en el ActiveWorkbook ya que el código anterior al On Error Goto 0 oculta la hoja, pero no la elimina. Aparecería entonces el mensaje de error por defecto de Excel indicando que el nombre de la hoja ya ha sido tomado.
On Error Goto To Line
También podemos forzar a nuestro código a moverse a una línea de código diferente utilizando On Error Goto Line (Más información) que indica a VBA que vaya a una línea de código específica si se produce un error.
Sub ErrorGoToLine()
On Error Resume Next
Dim ws As Worksheet, resp As Variant
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
On Error GoTo errhandler
ActiveSheet.Name = "Hoja1"
Exit Sub
errhandler:
resp = MsgBox("Ya existe una hoja llamada hoja1!", vbCritical)
End Sub
En el ejemplo anterior, cuando el código encuentra la hoja «Hoja1», se desplaza a la línea de código situada debajo de la etiqueta del controlador de errores (errhandler:) – en este caso llama a un cuadro de mensaje personalizado que informa a los usuarios de que la hoja ya ha salido. La etiqueta del manejador de errores tiene que tener dos puntos después de ella para mostrar a VBA que es una etiqueta.
errhandler:
El código saltará a la línea inferior a la etiqueta y devolverá el cuadro de mensaje personalizado.
Esto es útil cuando no desea que su usuario pueda hacer clic en Depurar para entrar en su código, ya que el mensaje estándar de Excel siempre da una opción para Depurar el código.
También necesitamos un Exit Sub en el procedimiento. Si NO hay una hoja llamada Hoja1, entonces esa línea de código se ejecutaría y renombraría la hoja activa a Hoja1. Entonces queremos que el código termine – no queremos que continúe con el manejador de errores y muestre el cuadro de mensaje. La línea Exit Sub sale del procedimiento y detiene el código.