Tipos de errores de vba: depuración y solución
Como cualquier otro lenguaje de programación, VBA tiene mala suerte cuando se trata de errores y hay que lidiar con ellos pase lo que pase. Pueden provenir de diferentes fuentes, como una mala codificación, operaciones imposibles (como dividir por cero) o errores inesperados.
La mejor manera de manejar esto es tener una buena comprensión de todos los resultados posibles que podría lograr con el código. Mire el ejemplo a continuación donde tenemos un código VBA que calcula la raíz cuadrada del número usando el valor que tiene en la celda seleccionada.
Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub
Pero si la celda activa tiene un valor distinto de un número, obtendrá un error de tiempo de ejecución, como se muestra a continuación.
Parámetros de error en VBA (captura de errores)
En la opción VBA, puede configurar la configuración para manejar errores antes de comenzar a escribir códigos. Para abrir la configuración de VBA, vaya a Herramientas ➤ Opciones ➤ General ➤ Detección de errores. Aquí tienes tres opciones que puedes utilizar.
- Detener en todos los errores : si ha habilitado esta opción, VBA detendrá el código para todo tipo de errores, incluso si ha utilizado todo tipo de técnicas de manejo de errores.
- Módulo de clase de manipulación : con esta opción, VBA detendrá todos sus códigos que no sean manejados por ninguna técnica. Y si usa objetos como formularios de usuario, también dividirá esos objetos y resaltará la línea exacta donde está el error.
- Interrumpir en errores no controlados : esta es la configuración predeterminada que le ayuda a conocer todos los errores para los que no está utilizando ninguna técnica de manejo de errores y detiene el código para todos los errores no controlados. (Pero, si usa objetos como formularios de usuario, esto no resaltará la línea que causa el error en el objeto, sino que solo resaltará la línea que hace referencia a ese objeto).
Tipos de errores de VBA
Para comprender los errores de VBA, puede dividirlos en cuatro categorías y a continuación se encuentra la explicación de este tipo de errores.
1. Errores de sintaxis
Al escribir código VBA, debe seguir una sintaxis particular y, cuando la ignora o no la escribe como debería, puede enfrentar un error de SYNTAX (también conocido como error de idioma). Son como errores tipográficos que cometes al escribir tus códigos.
Bueno, VBA le ayuda informando estos errores mostrando un mensaje de error. Sólo necesita asegurarse de que la «Verificación automática de sintaxis» esté habilitada en su editor VB.
Vaya a Herramienta ➤ Opciones y asegúrese de marcar la casilla «Verificación automática de sintaxis». Con esto, cada vez que comete un error de SINTAXIS, VBA muestra un mensaje de error.
Pero si la «Verificación automática de sintaxis» está deshabilitada, VBA aún resalta la línea de código con el error pero no muestra el mensaje de error.
2. Errores de compilación
Esto sucede cuando escribe código para realizar una actividad, pero esa actividad no es válida o no puede realizarse mediante VBA. El mejor ejemplo es cuando tiene algo de código usando la declaración IF pero no agregó END IF al final de la declaración y ahora, cuando ejecuta este VBA, muestra un mensaje de error de compilación.
Aparte de esto, existen otros ejemplos de errores de compilación:
- Usando For sin Next ( Para Siguiente ).
- Seleccionar sin seleccionar el final ( Seleccionar caso ).
- No declare una variable cuando haya habilitado la » Opción explícita «.
- Llamar a una sub/función que no existe.
3. Errores de tiempo de ejecución
Se produce un error de tiempo de ejecución cuando se ejecuta el código. Recuerde el ejemplo que compartí con usted arriba cuando el código calculó la raíz cuadrada de un número.
Cuando se produce un error de tiempo de ejecución al ejecutar el código, lo detiene y le muestra el cuadro de diálogo de error y este cuadro de error habla sobre la naturaleza del error que tiene. Supongamos que escribió un código que abre un libro de trabajo desde la ubicación que especificó, pero ahora alguien mueve o elimina ese libro de trabajo.
Entonces, cuando ejecute el código, VBA le mostrará un error de tiempo de ejecución porque no puede encontrar este archivo en esta ubicación. El mensaje que recibe en un error de tiempo de ejecución describe el motivo, lo que le ayuda a comprender el motivo del error.
Y cuando ocurre un error de tiempo de ejecución, detiene la ejecución del código. Si hace clic en el botón «Depurar», le muestra la línea de código que contiene este error resaltándola en amarillo. O puede hacer clic en el botón «Finalizar» para detener la ejecución del código y cerrar el mensaje de error.
4. Error lógico
Esto no es un error sino un error al escribir el código. Este tipo de errores a veces pueden causarle problemas para encontrarlos y corregirlos.
Supongamos que está escribiendo algún código y al declarar una variable utiliza el tipo de datos incorrecto o ha utilizado los pasos de cálculo incorrectos. En este caso, su código funcionará bien y no encontrará este error fácilmente. La mejor manera de solucionar este tipo de problemas es ejecutar cada línea de código una por una.
Usando herramientas de depuración en VBA
VBA le proporciona un conjunto de herramientas para depurar su código y eliminar errores de sus códigos.
1. Compile el proyecto VBA.
En el Editor de Visual Basic, hay una opción que puedes usar instantáneamente después de terminar tu código. Estas opciones de compilación analizan cada línea de su código y muestran un cuadro de mensaje si hay un error en su código.
Nota: La opción Compilar VBA solo rastrea errores de sintaxis y compilación, no errores de tiempo de ejecución, porque estos errores solo ocurren cuando se ejecuta un código. Para utilizar Compilar proyecto VBA, vaya a ➤ Depurar ➤ Compilar proyecto VBA.
Una vez que haya ejecutado «Compilar proyecto VBA» y no tenga errores en su código, las opciones aparecerán atenuadas.
2. Ejecute cada línea de código una por una.
Así es como lo hago. Cuando completo un código, simplemente lo ejecuto línea por línea para comprobar si hay algún error. Esto puede llevar tiempo, pero le ayudará a resolver todos los errores (sintaxis, compilación y ejecución).
En la «Barra de herramientas de depuración» hay un botón «Paso a paso» que puede usar para ejecutar el código línea por línea o simplemente puede presionar F8 para ejecutar una sola línea y luego presionarlo nuevamente para ejecutar la siguiente línea del código.
Uso de la declaración «On ERROR» para manejar errores de VBA
Es importante revisar tus códigos y encontrar posibles errores en todos los métodos de depuración que tienes disponibles. Pero la mejor y más eficiente manera es crear instrucciones de manejo de errores que puedan manejar un error y hacer que su código sea perfecto cuando se ejecute. Exploremos estas declaraciones. Cuando ocurre un error en un código VBA, las mejores formas de manejar este error pueden ser:
- Deje que VBA ignore el error y ejecute el código
- Deje que se ejecute un conjunto especial de instrucciones cuando se produzca un error.
En ambas soluciones, puede utilizar declaraciones «En caso de error». A continuación se muestran cuatro declaraciones de «En caso de error» que puede utilizar. Y ahora veamos cada afirmación una por una.
1. Si te equivocas, empieza de nuevo
Esta simple línea de código permite que VBA continúe ejecutando el código a pesar de que ocurra un error. La IDEA es simple: pasar a la siguiente línea de código si se detecta un error en algún lugar durante la ejecución.
En el código siguiente, tiene dos líneas de código:
- La primera línea indica que el valor en la celda A1 es 25 dividido por 0
- Y la segunda línea dice que el valor de la celda A2 es 10 dividido por 5
Ahora hay un problema con el código que tienes en línea. Como sabes, si divides algo entre 0, el resultado será un error. Entonces, cuando ejecuta este código, VBA muestra un mensaje de error «Error de tiempo de ejecución ’11’ Dividir por cero» y detiene la ejecución.
Pero cuando agrega «En caso de error, reanudar a continuación» al principio del código y ejecuta el código, VBA simplemente ignora la línea de código donde ocurre el error y continúa con la segunda línea y agrega ese valor en la celda A2.
Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub
Entonces, siempre que desee que su código se ejecute a pesar de que ocurra un error en cualquier lugar, simplemente use la instrucción «En caso de error, reanudar a continuación» en su código.
Pero aquí hay una cosa más que debes tener en cuenta: sólo ignorará los errores que ocurran después.
Digamos que ocurre un error en la línea 5 y agregó «En caso de error, reanudar a continuación» en la línea 8, no omitirá este error. Entonces, la mejor manera es agregarlo como la primera línea de código del procedimiento.
2. En caso de error GoTo 0
Este es el comportamiento predeterminado de VBA: cuando ocurre un error, detiene la ejecución del código.
Bueno, usar «On Error GoTo 0″ no hace ninguna diferencia en su código. VBA simplemente detendrá el código y mostrará un mensaje con una descripción del error. Entonces, ¿por qué debería molestarme en usarlo? Pregunta inteligente. Usemos el ejemplo que usó anteriormente en » En caso de error, reanudar a continuación «.
En este código, cada vez que ocurre un error, VBA toma la siguiente línea de código y la ejecuta y no verá ningún mensaje de error. Pero digamos que tiene más líneas en su código y no desea exceder esas líneas si hay un error en el código.
Por lo tanto, si ingresa «En caso de error, Ir a 0» después de la segunda línea de código, restaurará el controlador de errores predeterminado de VBA, que muestra mensajes de error cada vez que ocurre un error.
3. En caso de error GoTo [Etiqueta]
Piense en un lugar de un edificio al que pueda acudir en caso de emergencia. De manera similar, al usar «En caso de error, Ir a [Etiqueta]», puede simplemente crear un bloque de código separado en su código principal para manejar un error.
De hecho, «En caso de error, ir a [Etiqueta]» es una forma mucho mejor y más conveniente de manejar los errores. En el código siguiente aparece «En caso de error, Ir a Oh!» Error” ahora en esta línea de declaración, la palabra “¡Oh!” Error” es la etiqueta.
Si observa el final del código, tiene un comienzo específico con el nombre de la etiqueta y luego un código para un cuadro de mensaje con un mensaje en el código.
Ahora, ¿qué sucede si ocurre un error? VBA saltará a la etiqueta “¡Oh! Error” y ejecutará el bloque de código que tienes después de esa etiqueta.
Pero hay una cosa de la que debes cuidar: si no ocurre ningún error, se ejecutará la etiqueta que tienes en tu código. Hay dos cosas que debes hacer:
- Primero, asegúrese de agregar su etiqueta de error al final del código.
- En segundo lugar, agregue un «Subtítulo de salida» antes de la etiqueta de error.
Con esto, te beneficiarás en ambas situaciones. Digamos que si ocurre un error y VBA cambia a la etiqueta que usted especificó, solo habrá código de la propia etiqueta para codificar. Y si no ocurre un error, la instrucción «Salir Sub» que tiene antes de la etiqueta saldrá del procedimiento sin ejecutar la etiqueta de error.
4. En caso de error GoTo -1
Antes de entrar en esto, permítanme compartir algo con ustedes. Cuando ocurre un error en un código, VBA almacena este registro de errores en su memoria y solo lo borra cuando se completa la rutina.
¡Oh VBA! Vive en el presente
Para manejar el segundo error en el código VBA, debe borrar el primer error de la memoria de VBA. En el código siguiente, tiene dos declaraciones «En caso de error, Ir a [Etiqueta]» que manejan errores de dos bloques de código diferentes.
Pero si ejecuta este código, cuando aparezca el segundo error, VBA no saltará a la etiqueta que configuró y, en su lugar, mostrará el mensaje de error «Tipo no coincide».
Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Para resolver este problema, puede utilizar «On Error GoTo -1», que permite a VBA eliminar el error actual de su almacenamiento.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Ahora, cuando ejecuta este código, «On Error GoTo -1» elimina el error de la memoria y VBA maneja el error en la segunda declaración como se desee.
¿Qué más necesito saber para manejar errores en VBA?
Además de utilizar técnicas de manejo de errores, hay algunas otras cosas que puede utilizar para manejar mejor los errores.
error de objeto
Cuando ocurre un error al ejecutar el código, puede usar el objeto Err para obtener detalles sobre el error. Hay algunas propiedades y métodos que puedes usar con el objeto Err. Aprendamos uno por uno.
Propiedades
Estas son las propiedades que puede utilizar con el objeto Err:
- Err.Number : cuando se produce un error, se almacena un número en el objeto Err. En el código siguiente, cuando ocurre, el cuadro de mensaje muestra el número de error.
- Err.Description : esta propiedad muestra la descripción del error que puede ayudarle a comprender el motivo del error.
- Err.Source: esta propiedad le indica en qué proyecto ocurrió el error.
- Err.HelpContext: esta propiedad devuelve el ID del contexto de ayuda para el error en el archivo de ayuda.
- Err.HelpContext: este es un valor de cadena para la ubicación del archivo de ayuda.
Normalmente, cuando tratas errores usando técnicas de manejo de errores, no usas mucho el objeto Err en tus códigos. Pero a continuación se muestra un ejemplo sencillo de cómo usarlo.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1: MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description End Sub
Cuando ejecuta el código anterior, y si se produce un error, mostrará un cuadro de mensaje con el número de error y la descripción del error.
Métodos
Con Err Object también puedes utilizar dos métodos.
- Err.Clear: este método borra el número de error y la descripción del error de la memoria VBA (esto es diferente de «On Error GoTo -1» porque no restablece completamente el error).
- Err.Raise: con este método, puedes generar intencionalmente un error de tiempo de ejecución en tu código, y aquí está la sintaxis a seguir:
Err .Raise [número], [fuente], [descripción], [archivo de ayuda], [contexto de ayuda]
Consejos rápidos sobre el manejo de errores
A continuación se ofrecen algunos consejos rápidos que puede utilizar para manejar mejor los errores de VBA.
- Utilice «En caso de error, reanudar a continuación» solo cuando esté seguro de que se está produciendo un error y sea aceptable omitir la línea de código con un error y sea seguro pasar a la siguiente línea.
- La mejor manera de lidiar con los errores de tiempo de ejecución es usar el «Manejador de errores» con «En caso de error, Ir a [Etiqueta]». Esto garantiza que cada vez que ocurra el error, se le notificará, pero no se mostrará ese desagradable mensaje de error.
- Cada vez que utilice el controlador de errores, asegúrese de utilizar «Salir Sub» primero.