VBA en caso de error: mejores prácticas para el manejo de errores

Hoja de referencia de errores de VBA

Errores

DescripciónCódigo VBAEn caso de error: código de detención y error de visualizaciónEn caso de error Goto 0En caso de error: omita el error y continúe ejecutándoseEn caso de error, reanudar siguienteEn caso de error: vaya a una línea de código [Etiqueta]En caso de error, vaya a [Etiqueta]Borra (restablece) el errorEn caso de error, vaya a -1Mostrar número de errorMsgBox Err.NumberMostrar descripción del errorMsgBox Err. DescripciónFunción para generar error propioErr.Raise

Vea más "Cheat Sheets" de VBA y descargas gratuitas de PDF

Manejo de errores de VBA

Manejo de errores de VBA se refiere al proceso de anticipar, detectar y resolver errores en tiempo de ejecución de VBA. El proceso de manejo de errores de VBA ocurre al escribir código, antes de que ocurra realmente cualquier error.

Errores en tiempo de ejecución de VBA son errores que ocurren durante la ejecución del código. Ejemplos de errores en tiempo de ejecución incluyen:

  • Hacer referencia a un libro, una hoja de trabajo u otro objeto que no existe
  • Datos no válidos ej. hacer referencia a una celda de Excel que contiene un error
  • Intentando dividir por cero

Declaración de error de VBA

La mayor parte del manejo de errores de VBA se realiza con el En declaración de error. La declaración On Error le dice a VBA qué hacer si encuentra un error. Hay tres Sobre declaraciones de error:

  • En caso de error, vaya a 0
  • En caso de error, reanudar siguiente
  • En caso de error Ir a Línea

En caso de error, vaya a 0

En caso de error, vaya a 0 es la configuración predeterminada de VBA. Puede restaurar esta configuración predeterminada agregando la siguiente línea de código:

1 En caso de error, vaya a 0

Cuando ocurre un error con En caso de error, vaya a 0, VBA dejará de ejecutar código y mostrará su cuadro de mensaje de error estándar.

A menudo agregará un En caso de error, vaya a 0 después de agregar En caso de error, reanudar siguiente manejo de errores (siguiente sección):

123456789 Sub ErrorGoTo0 ()En caso de error, reanudar siguienteActiveSheet.Shapes ("Start_Button"). EliminarEn caso de error, vaya a 0'Ejecutar más códigoEnd Sub

En caso de error, reanudar siguiente

En caso de error, reanudar siguiente le dice a VBA que omita cualquier línea de código que contenga errores y continúe con la siguiente línea.

1 En caso de error, reanudar siguiente

Nota: En caso de error, reanudar siguiente no corrige un error ni lo resuelve de ninguna otra manera. Simplemente le dice a VBA que proceda como si la línea de código que contiene el error no existiera. Uso indebido de En caso de error, reanudar siguiente puede tener consecuencias no deseadas.

Un buen momento para usar En caso de error, reanudar siguiente es cuando se trabaja con objetos que pueden existir o no. Por ejemplo, desea escribir algún código que elimine una forma, pero si ejecuta el código cuando la forma ya está eliminada, VBA arrojará un error. En su lugar, puedes usar En caso de error, reanudar siguiente para decirle a VBA que elimine la forma si existe.

123 En caso de error, reanudar siguienteActiveSheet.Shapes ("Start_Button"). EliminarEn caso de error, vaya a 0

Observe que agregamos En caso de error, vaya a 0 después de la línea de código que contiene el error potencial. Esto restablece el manejo de errores.

En la siguiente sección, le mostraremos cómo probar si ocurrió un error usando Err.Number, brindándole opciones de manejo de errores más avanzadas …

Err.Number, Err.Clear y captura de errores

En lugar de simplemente omitir una línea que contiene un error, podemos detectar el error usando En caso de error, reanudar siguiente y Err.Number.

Err.Number devuelve un número de error correspondiente al tipo de error detectado. Si no hay error, Err.Number = 0.

Por ejemplo, este procedimiento devolverá "11" porque el error que se produce es Error en tiempo de ejecución "11".

1234567 Sub ErrorNumber_ex ()En caso de error, reanudar siguienteActiveCell.Value = 2/0MsgBox Err.NumberEnd Sub

Manejo de errores con Err.Number

El verdadero poder de Err.Number radica en la capacidad de detectar si ocurrió un error (Err.Number 0). En el siguiente ejemplo, creamos una función que probará si existe una hoja usando Err.Number.

12345678910111213141516171819 Prueba secundariaWS ()MsgBox DoesWSExist ("prueba")End SubFunción DoesWSExist (wsName como cadena) como booleanoDim ws como hoja de trabajoEn caso de error, reanudar siguienteEstablecer ws = Hojas (wsName)'Si el error WS no existeSi Err.Number 0 EntoncesDoesWSExist = FalsoDemásDoesWSExist = TrueTerminara siEn caso de error, vaya a -1Función final

Nota: hemos agregado un En caso de error, vaya a -1 hasta el final que restablece Err.Number a 0 (ver dos secciones más abajo).

Con En caso de error, reanudar siguiente y Err.Number, puedes replicar el "Trata de atraparlo" funcionalidad de otros lenguajes de programación.

En caso de error Ir a Línea

En caso de error Ir a Línea le dice a VBA que "vaya a" una línea de código etiquetada cuando se encuentre un error. Declara la instrucción Ir a así (donde errHandler es la etiqueta de línea a la que debe ir):

1 En caso de error, vaya a errHandler

y crea una etiqueta de línea como esta:

1 errHandler:

Nota: Esta es la misma etiqueta que usaría con una declaración GoTo de VBA normal.

A continuación demostraremos el uso En caso de error Ir a Línea para salir de un procedimiento.

En caso de error Salir de Sub

Puede utilizar On Error GoTo Line para salir de un sub cuando se produce un error.

Puede hacer esto colocando la etiqueta de la línea del controlador de errores al final de su procedimiento:

12345678 Sub ErrGoToEnd ()En caso de error GoTo endProc'Algún códigoendProc:End Sub

o usando el comando Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()En caso de error GoTo endProc'Algún códigoIr a saltar SalirendProc:Salir de Subsaltar Salir:'Un poco más de códigoEnd Sub

Err.Clear, On Error GoTo -1 y Restableciendo Err.Number

Después de que se maneja un error, generalmente debe borrar el error para evitar problemas futuros con el manejo de errores.

Después de que ocurre un error, ambos Err.Clear y En caso de error, vaya a -1 se puede utilizar para restablecer Err.Number a 0. Pero hay una diferencia muy importante: Err.Clear no restablece el error real en sí, solo restablece el Err.Number.

¿Qué significa eso? UtilizandoErr.Clear, no podrá cambiar la configuración de manejo de errores. Para ver la diferencia, pruebe este código y reemplace En caso de error, vaya a -1 con Err.Clear:

123456789101112131415161718192021 Sub ErrExamples ()En caso de error, vaya a errHandler:"Error" definido por la aplicación "Error (13)Salir de SuberrHandler:'Borrar errorEn caso de error, vaya a -1En caso de error, vaya a errHandler2:Error "" No coinciden los tipos "Error (1034)Salir de SuberrHandler2:Debug.Print Err.DescriptionEnd Sub

Normalmente, recomiendo usar siempre En caso de error, vaya a -1, a menos que tenga una buena razón para usar Err.Clear en lugar de.

VBA en error MsgBox

También es posible que desee mostrar un cuadro de mensaje en caso de error. Este ejemplo mostrará diferentes cuadros de mensaje dependiendo de dónde ocurra el error:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg como cadenaEn caso de error, vaya a errHandler'Nivel 1errMsg = "Ocurrió un error durante la etapa de Copiar y Pegar".'Err.Raise (11)'Etapa 2errMsg = "Se produjo un error durante la etapa de Validación de datos".'Err.Raise (11)'Etapa 3errMsg = "Ocurrió un error durante la etapa de creación de P & L y copia."Err.Raise (11)'Etapa 4errMsg = "Se produjo un error al intentar registrar la importación en la página de configuración"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:End Sub

Aquí reemplazaría Err.Raise (11) con su código real.

VBA IsError

Otra forma de manejar los errores es probarlos con la función VBA IsError. La función IsError prueba una expresión en busca de errores y devuelve VERDADERO o FALSO si se produce un error.

123 Sub IsErrorEx ()MsgBox IsError (Rango ("a7"). Valor)End Sub

Si error VBA

También puede manejar errores en VBA con la función IfError de Excel. Se debe acceder a la función IfError mediante el Clase WorksheetFunction:

1234567 Sub IfErrorEx ()Dim n tan largon = WorksheetFunction.IfError (Rango ("a10"). Valor, 0)MsgBox nEnd Sub

Esto generará el valor de Rango A10, si el valor es un error, en su lugar generará 0.

Tipos de error de VBA

Errores en tiempo de ejecución

Como se indicó anteriormente:

Errores en tiempo de ejecución de VBA son errores que ocurren durante la ejecución del código. Ejemplos de errores en tiempo de ejecución incluyen:

  • Hacer referencia a un libro, una hoja de trabajo u otro objeto que no existe
  • Datos no válidos ej. hacer referencia a una celda de Excel que contiene un error
  • Intentando dividir por cero

Puede “manejar errores” en tiempo de ejecución utilizando los métodos descritos anteriormente.

Errores de sintaxis

Errores de sintaxis de VBA son errores con la escritura de código. Ejemplos de errores de sintaxis incluyen:

  • Errores ortográficos
  • Puntuación faltante o incorrecta

El Editor de VBA identifica muchos errores de sintaxis con resaltado en rojo:

El editor de VBA también tiene una opción para "Verificación automática de sintaxis":

Cuando esto está marcado, el Editor de VBA generará un cuadro de mensaje que le alertará sobre los errores de sintaxis después de que ingrese una línea de código:

Personalmente, encuentro esto extremadamente molesto y deshabilito la función.

Compilar errores

Antes de intentar ejecutar un procedimiento, VBA "compilará" el procedimiento. La compilación transforma el programa del código fuente (que puede ver) a un formato ejecutable (que no puede ver).

Errores de compilación de VBA son errores que impiden la compilación del código.

Un buen ejemplo de un error de compilación es una declaración de variable faltante:

Otros ejemplos incluyen:

  • Para sin próximo
  • Seleccione sin Finalizar Seleccionar
  • Si sin Terminara si
  • Llamando a un procedimiento eso no existe

Los errores de sintaxis (sección anterior) son un subconjunto de los errores de compilación.

Depurar> Compilar

Aparecerán errores de compilación cuando intente ejecutar un procedimiento. Pero idealmente, identificaría los errores de compilación antes de intentar ejecutar el procedimiento.

Puede hacer esto compilando el proyecto con anticipación. Para hacerlo, ve a Depurar> Compilar proyecto VBA.

El compilador "irá" al primer error. Una vez que solucione ese error, vuelva a compilar el proyecto. Repita hasta que se corrijan todos los errores.

Puede decir que todos los errores están corregidos porque Compilar el proyecto VBA aparecerá en gris:

Error de sobreflujo

los Error de sobreflujo de VBA ocurre cuando intenta poner un valor en una variable que es demasiado grande. Por ejemplo, Variables enteras solo puede contener valores entre -32.768 y 32.768. Si ingresa un valor mayor, recibirá un error de desbordamiento:

En su lugar, debe utilizar el Variable larga para almacenar el número mayor.

Otros términos de error de VBA

Error de captura de VBA

A diferencia de otros lenguajes de programación, en VBA no hay Declaración de captura. Sin embargo, puede replicar una declaración de captura utilizando En caso de error, reanudar siguiente y Si Err.Number 0 Entonces. Esto se trata más arriba en Manejo de errores con Err.Number.

Error de ignorar VBA

Para ignorar errores en VBA, simplemente use el En caso de error, reanudar siguiente declaración:

1 En caso de error, reanudar siguiente

Sin embargo, como se mencionó anteriormente, debe tener cuidado al usar esta declaración, ya que no corrige un error, simplemente ignora la línea de código que contiene el error.

Error de lanzamiento de VBA / Err.Raise

Para a través de un error en VBA, usa el Err.Raise método.

Esta línea de código generará un error en tiempo de ejecución "13": no coinciden los tipos:

1 Err.Raise (13)

Captura de errores de VBA

Captura de errores de VBA es solo otro término para el manejo de errores de VBA.

Mensaje de error de VBA

A Mensaje de error de VBA Se ve como esto:

Al hacer clic en "Depurar", verá la línea de código que genera el error:

Manejo de errores de VBA en un bucle

La mejor manera de manejar errores dentro de un bucle es usando En caso de error, reanudar siguiente junto con Err.Number para detectar si ha ocurrido un error (recuerde usar Err.Clear para borrar el error después de cada aparición).

El siguiente ejemplo dividirá dos números (Columna A por Columna B) y mostrará el resultado en la Columna C. Si hay un error, el resultado será 0.

12345678910111213141516 Subprueba ()Atenuar celda como rangoEn caso de error, reanudar siguientePara cada celda del rango ("a1: a10")'Establecer valor de celdacell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Si Cell.Value es Error, el valor predeterminado es 0Si Err.Number 0 Entoncescell.Offset (0, 2) .Value = 0Err.ClearTerminara sipróximoEnd Sub

Manejo de errores de VBA en Access

Todos los ejemplos anteriores funcionan exactamente igual en Access VBA que en Excel VBA.

123456789101112131415161718 Función DelRecord (frm As Form)'esta función se usa para eliminar un registro en una tabla de un formularioEn caso de error, ir al finalCon frmSi .NewRecord Entonces.DeshacerFunción de salidaTerminara siTerminar conCon frm.RecordsetClone.Bookmark = frm.Bookmark.Borrarfrm.RequeryTerminar conFunción de salidafinalizando:FinFunción final

Va a ayudar al desarrollo del sitio, compartir la página con sus amigos

wave wave wave wave wave