Contenido
No importa la experiencia que tenga con la codificación VBA, los errores siempre serán parte de ella.
La diferencia entre un programador de VBA novato y un experto es que los programadores expertos saben cómo manejar y usar los errores de manera efectiva.
Antes de entrar en el manejo de errores de VBA, primero comprendamos los diferentes tipos de errores que es probable que encuentre al programar en Excel VBA.
Tipos de errores de VBA en Excel
Hay cuatro tipos de errores en Excel VBA:
- Errores de sintaxis
- Errores de compilación
- Errores de tiempo de ejecución
- Errores lógicos
Comprendamos rápidamente cuáles son estos errores y cuándo es probable que los encuentre.
Error de sintaxis
Un error de sintaxis, como su nombre lo indica, ocurre cuando VBA encuentra algo mal con la sintaxis en el código.
Por ejemplo, si olvida una parte de la declaración / sintaxis que se necesita, verá el error de compilación.
Error de compilación
Los errores de compilación se producen cuando falta algo que se necesita para que se ejecute el código.
Por ejemplo, en el siguiente código, tan pronto como intente ejecutar el código, mostrará el siguiente error. Esto sucede porque he usado la instrucción IF Then sin cerrarla con el obligatorio End If.
VBA verifica cada línea mientras escribe el código y resalta el error de sintaxis tan pronto como la línea es incorrecta y presiona enter. Los errores de compilación, por otro lado, solo se identifican cuando VBA analiza todo el código.
A continuación se presentan algunos escenarios en los que encontrará el error de compilación:
- Usar una instrucción IF sin el IF final
- Uso de la declaración For con Next
- Usar la instrucción Select sin usar End Select
- No declarar la variable (esto funciona solo cuando la Opción explícita está habilitada)
- Llamar a una Sub / Función que no existe (o con parámetros incorrectos)
Errores de tiempo de ejecución
Los errores de tiempo de ejecución son los que ocurren cuando se ejecuta el código.
Los errores de tiempo de ejecución solo se producirán cuando se resuelvan todos los errores de sintaxis y compilación.
Por ejemplo, si ejecuta un código que se supone que abre un libro de Excel, pero ese libro no está disponible (ya sea eliminado o cambiado de nombre), su código le daría un error de tiempo de ejecución
Cuando se produce un error de tiempo de ejecución, detendrá el código y le mostrará el cuadro de diálogo de error.
El mensaje en el cuadro de diálogo Error de tiempo de ejecución es un poco más útil. Intenta explicar el problema que puede ayudarlo a corregirlo.
Si hace clic en el botón Depurar, resaltará la parte del código que conduce al error.
Si ha corregido el error, puede hacer clic en el botón Ejecutar en la barra de herramientas (o presionar F5) para continuar ejecutando el código desde donde se fue.
O también puede hacer clic en el botón Finalizar para salir del código.
Errores lógicos
Los errores lógicos no harán que su código se detenga, pero pueden conducir a resultados incorrectos. Estos también podrían ser los tipos de errores más difíciles de solucionar.
Estos errores no están resaltados por el compilador y deben abordarse manualmente.
Un ejemplo de error lógico (con el que a menudo me encuentro atrapado) se encuentra con un bucle sin fin.
Otro ejemplo podría ser cuando da un resultado que está mal. Por ejemplo, puede terminar usando una variable incorrecta en el código o agregar dos variables donde una es incorrecta.
Hay algunas formas que uso para abordar los errores lógicos:
- Inserte el cuadro de mensaje en algún lugar del código y resalte los valores / datos que pueden ayudar a comprender si todo está yendo como se esperaba.
- En lugar de ejecutar el código de una vez, revise cada línea una por una. Para hacer esto, haga clic en cualquier parte del código y presione F8. notará que cada vez que presiona F8, se ejecuta una línea. Esto le permite recorrer el código línea por línea e identificar los errores lógicos.
Tipo de Controles
Descripción | Código VBA |
---|---|
Deshabilita cualquier controlador de errores habilitado en el procedimiento actual. | On Error Goto 0 |
En caso de Error continua ejecutándose en la siguiente linea donde ocurrió el Error | On Error Resume Next |
En caso de Error se dirige a la (Etiqueta) | On Error Goto (Etiqueta) |
Hace un Reset a los códigos «On Errror» ejecutados en el mismo modulo. | On Error GoTo –1 |
Muestra el número del Error. | MsgBox Err.Number |
Muestra la descripción del Error. | MsgBox Err.Description |
Función para generar un error propio. | Err.Raise |
On Error Resume Next
Cuando use ‘On Error Resume Nex’ en su código, cualquier error encontrado será ignorado y el código continuará ejecutándose.
Este método de manejo de errores se usa con bastante frecuencia, pero debe tener cuidado al usarlo. Como ignora por completo cualquier error que pueda ocurrir, es posible que no pueda identificar los errores que deben corregirse.
Por ejemplo, si se ejecuta el siguiente código, devolverá un error.
Esto sucede porque no puedes dividir un número por cero.
Pero si utilizo la declaración ‘On Error Resume Next’ en este código (como se muestra a continuación), ignorará el error y no sabré que hay un problema que debe corregirse.
On Error Resume Next debe usarse solo cuando conoce claramente el tipo de errores que se espera que arroje su código VBA y está bien ignorarlo.
Por ejemplo, a continuación se muestra el código de evento VBA que agregaría instantáneamente el valor de fecha y hora en la celda A1 de una hoja recién insertada (este código se agrega en la hoja de trabajo y no en un módulo).
Si bien esto funciona muy bien en la mayoría de los casos, mostraría un error si agrego una hoja de gráfico en lugar de una hoja de trabajo. Como una hoja de gráfico no tiene celdas, el código arrojaría un error.
Por lo tanto, si utilizo la instrucción ‘On Error Resume Next’ en este código, funcionará como se espera con las hojas de trabajo y no hará nada con las hojas de gráficos.
Nota: ‘On Error Resume Next, la siguiente declaración se utiliza mejor cuando sabe qué tipo de errores puede encontrar. Y luego, si cree que es seguro ignorar estos errores, puede usarlo.
Puede llevar este código al siguiente nivel analizando si hubo un error y mostrando un mensaje relevante para ello.
El siguiente código mostrará un cuadro de mensaje que informará al usuario que no se ha insertado una hoja de trabajo.
‘Err.Number’ se usa para obtener el número de error y ‘Err.Description’ se usa para obtener la descripción del error. Estos serán cubiertos más adelante en este tutorial.
On Error GoTo 0
‘On Error GoTo 0’ detendrá el código en la línea que causa el error y muestra un cuadro de mensaje que describe el error.
En términos simples, habilita el comportamiento predeterminado de comprobación de errores y muestra el mensaje de error predeterminado.
Entonces, ¿por qué usarlo?
Normalmente, no necesita usar ‘On Error Goto 0’, pero puede ser útil cuando lo usa junto con ‘On Error Resume Next’
¡Dejame explicar!
El siguiente código seleccionaría todas las celdas en blanco en la selección.
Pero mostraría un error cuando no hay celdas en blanco en las celdas seleccionadas.
Entonces, para evitar mostrar el error, puede usar On Error Resume next ‘
Ahora, también mostrará cualquier error cuando ejecute el siguiente código:
¡Hasta aquí todo bien!
El problema surge cuando hay una parte del código donde puede producirse un error, y dado que está usando ‘On Error Resume next’, el código simplemente lo ignorará y pasará a la siguiente línea.
Por ejemplo, en el código a continuación, no habría mensaje de error:
En el código anterior, hay dos lugares donde puede ocurrir un error. El primer lugar es donde estamos seleccionando todas las celdas en blanco (usando Selection.SpecialCells) y el segundo está en el código restante.
Si bien se espera el primer error, cualquier error posterior no lo es.
Aquí es donde On Error Goto 0 viene a rescatar.
Cuando lo usa, restablece la configuración de error a la predeterminada, donde comenzará a mostrar errores cuando lo encuentre.
Por ejemplo, en el siguiente código, no habría ningún error en caso de que no haya celdas en blanco, pero habría un mensaje de error debido a ’10 / 0 ‘
On Error Goto [Etiqueta]
Los dos métodos anteriores, ‘En caso de error, reanudar a continuación’ y ‘En caso de error, pasar a 0’, no nos permiten manejar realmente el error. Uno hace que el código ignore el error y el segundo reanuda la comprobación de errores.
On Error Go [Label] es una forma con la que puede especificar lo que desea hacer en caso de que su código tenga un error.
A continuación se muestra la estructura del código que utiliza este controlador de errores:
Tenga en cuenta que antes de la ‘Etiqueta’ de manejo de errores, hay un Exit Sub. Esto garantiza que, en caso de que no haya errores, se salga del sub y no se ejecute el código ‘Etiqueta’. En caso de que no use Exit Sub, siempre ejecutará el código ‘Etiqueta’.
En el siguiente código de ejemplo, cuando se produce un error, el código salta y ejecuta el código en la sección del controlador (y muestra un cuadro de mensaje).
Tenga en cuenta que cuando ocurre un error, el código ya se ha ejecutado y ejecutado las líneas antes de la línea que causa el error. En el ejemplo anterior, el código establece el valor de X como 12, pero dado que el error ocurre en la siguiente línea, no establece los valores para Y y Z.
Una vez que el código salta al código del controlador de errores (ErrMsg en este ejemplo), continuará ejecutando todas las líneas dentro y debajo del código del controlador de errores y saldrá del sub.
On Error Goto -1
Este es un poco complicado, y en la mayoría de los casos, es poco probable que lo uses.
Pero aún cubriré esto ya que me he enfrentado a una situación en la que esto era necesario (siéntase libre de ignorar y pasar a la siguiente sección si solo está buscando lo básico).
Antes de entrar en la mecánica, permítanme intentar explicar dónde puede ser útil.
Supongamos que tiene un código donde se encuentra un error. Pero todo está bien, ya que tiene un controlador de errores en su lugar. Pero qué sucede cuando hay otro error en el código del controlador de errores (sí … algo así como la película de inicio).
En tal caso, no puede usar el segundo controlador ya que el primer error no se ha borrado. Entonces, aunque haya manejado el primer error, en la memoria de VBA todavía existe. Y la memoria VBA solo tiene lugar para un error, no dos o más que eso.
En este escenario, puede usar On Error Goto -1.
Borra el error y libera memoria VBA para manejar el siguiente error.
¡Basta de hablar!
Permítanme explicarlo ahora usando ejemplos.
Supongamos que tengo el siguiente código. Esto arrojará un error ya que hay división por cero.
Entonces, para manejarlo, uso un código de controlador de errores (con el nombre ErrMsg) como se muestra a continuación:
Todo está bien ahora otra vez. Tan pronto como se produce el error, se utiliza el controlador de errores y muestra un cuadro de mensaje como se muestra a continuación.
Ahora, expando el código para tener más código en el controlador de errores o después.
Como el primer error ha sido manejado pero el segundo no, nuevamente veo un error como se muestra a continuación.
Todavía todo bien. El código se comporta de la manera que esperábamos.
Entonces, para manejar el segundo error, uso otro controlador de errores (ErrMsg2).
Y aquí es donde no funciona como se esperaba.
Si ejecuta el código anterior, aún le dará un error de tiempo de ejecución, incluso después de tener el segundo controlador de errores en su lugar.
Esto sucede porque no borramos el primer error de la memoria de VBA.
Sí, lo manejamos! Pero aún permanece en la memoria.
Y cuando VBA encuentra otro error, todavía está atascado con el primer error y, por lo tanto, no se usa el segundo controlador de errores. El código se detiene en la línea que causó el error y muestra el mensaje de error.
Para borrar la memoria de VBA y borrar el error anterior, debe usar ‘On Error Goto -1’.
Entonces, si agrega esta línea en el código a continuación y la ejecuta, funcionará como se esperaba.
Nota: El error se borra automáticamente cuando finaliza una subrutina. Entonces, ‘On Error Goto -1’ puede ser útil cuando obtiene dos o más de dos errores en la misma subrutina.
El objeto «Err»
Cada vez que se produce un error con un código, se utiliza el objeto Err para obtener los detalles sobre el error (como el número de error o la descripción).
«Err» Propiedades del objeto
El objeto Err tiene las siguientes propiedades:
Propiedad | Descripción |
Número | Un número que representa el tipo de error. Cuando no hay error, este valor es 0 |
Descripción | Una breve descripción del error. |
Fuente | Nombre del proyecto en el que se produjo el error |
Contexto de Ayuda | La identificación del contexto de ayuda para el error en el archivo de ayuda |
Archivo de Ayuda | Una cadena que representa la ubicación de la carpeta y el nombre del archivo de ayuda |
Si bien en la mayoría de los casos no necesita usar el objeto Err, a veces puede ser útil al manejar errores en Excel.
Por ejemplo, suponga que tiene un conjunto de datos como se muestra a continuación y para cada número, en la selección, desea calcular la raíz cuadrada en la celda adyacente.
El siguiente código puede hacerlo, pero dado que hay una cadena de texto en la celda A5, muestra un error tan pronto como esto ocurre.
El problema con este tipo de mensaje de error es que no le da nada sobre lo que salió mal y dónde ocurrió el problema.
Puede usar el objeto Err para hacer que estos mensajes de error sean más significativos.
Por ejemplo, si ahora uso el siguiente código de VBA, detendrá el código tan pronto como ocurra el error y mostrará un cuadro de mensaje con la dirección de la celda donde hay un problema.
El código anterior le daría mucha más información que el simple ‘Type Mismatch’, especialmente la dirección de la celda para que sepa dónde ocurrió el error.
Puede refinar aún más este código para asegurarse de que su código se ejecute hasta el final (en lugar de romperse en cada error) y luego le da una lista de la dirección de la celda donde se produce el error.
El siguiente código haría esto:
El código anterior se ejecuta hasta el final y proporciona la raíz cuadrada de todas las celdas que tienen números (en la columna adyacente). Luego muestra un mensaje que enumera todas las celdas donde hubo un error (como se muestra a continuación):
Error de VBA al manejar las mejores prácticas
No importa qué tan hábil sea un código VBA escrito, los errores siempre serán parte de él. Los mejores codificadores son aquellos que tienen las habilidades para manejar estos errores correctamente.
Estas son algunas de las mejores prácticas que puede usar cuando se trata de manejo de errores en Excel VBA.
- Use ‘On Error Go Etiqueta’ al comienzo del código. Esto asegurará que cualquier error que pueda ocurrir desde allí sea manejado.
- Utilice ‘On Error Resume Next’ SOLAMENTE cuando esté seguro de los errores que pueden ocurrir. Úselo solo con el error esperado. En caso de que lo use con errores inesperados, simplemente lo ignorará y avanzará. Puede usar ‘On Error Resume Next’ con ‘Err.Raise’ si quiere ignorar un cierto tipo de error y atrapar el resto.
- Cuando use manejadores de errores, asegúrese de estar usando Exit Sub antes que los manejadores. Esto garantizará que el código del controlador de errores se ejecute solo cuando haya un error (de lo contrario, siempre se ejecutará).
- Utilice múltiples manejadores de errores para atrapar diferentes tipos de errores. Tener múltiples manejadores de errores asegura que un error se aborde correctamente. Por ejemplo, desearía manejar un error de ‘falta de coincidencia de tipos’ de manera diferente que un error de tiempo de ejecución ‘División por 0’.
One Response
«On Error Goto -1
Este es un poco complicado, y en la mayoría de los casos, es poco probable que lo uses.
Pero aún cubriré esto ya que me he enfrentado a una situación en la que esto era necesario (siéntase libre de ignorar y pasar a la siguiente sección si solo está buscando lo básico).»
Muchass gracias por hacer la explicacion a pesar de pensar que era poco probable de utilizar. No sabes cuanto me sirvió la explicación