- Tipos de errores de VBA en Excel
- Uso de depuración para encontrar errores de compilación / sintaxis
- Configurar los ajustes de error (errores manejados frente a errores no manejados)
- Manejo de errores de VBA con declaraciones "en caso de error"
- El objeto Err
- Prácticas recomendadas para el manejo de errores de VBA
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.
En este tutorial, le mostraré varias formas que puede usar para manejar errores de manera efectiva en Excel VBA.
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 sugiere el nombre, ocurre cuando VBA encuentra algo incorrecto en la sintaxis del código.
Por ejemplo, si olvida una parte de la declaración / sintaxis necesaria, verá el error de compilación.
En el siguiente código, tan pronto como presiono enter después de la segunda línea, veo un error de compilación. Esto se debe a que Declaración IF necesita tener el "Luego"Comando, que falta en el siguiente código.
Nota: Cuando está escribiendo un código en Excel VBA, verifica cada oración tan pronto como presiona Enter. Si VBA encuentra algo que falta en la sintaxis, muestra instantáneamente un mensaje con un texto que puede ayudarlo a comprender la parte que falta.Para asegurarse de ver el error de sintaxis cada vez que falta algo, debe asegurarse de que la comprobación de autosintaxis esté habilitada. Para hacer esto, haga clic en "Herramientas" y luego haga clic en "Opciones". En el cuadro de diálogo de opciones, asegúrese de que la opción "Verificación automática de sintaxis" esté habilitada.
Si la opción "Verificación automática de sintaxis" está deshabilitada, VBA aún resaltará la línea con el error de sintaxis en rojo, pero no mostrará el cuadro de diálogo de error.
Error de compilación
Los errores de compilación ocurren cuando falta algo que es necesario para que se ejecute el código.
Por ejemplo, en el siguiente código, tan pronto como intente ejecutar el código, se mostrará el siguiente error. Esto sucede porque he usado la instrucción IF Then sin cerrarla con el "End If" obligatorio.
Un error de sintaxis también es un tipo de error de compilación. Se produce un error de sintaxis tan pronto como presiona enter y VBA identifica que falta algo. También puede ocurrir un error de compilación cuando VBA no encuentra nada faltante mientras escribe el código, pero lo hace cuando el código se compila o ejecuta.VBA verifica cada línea a medida que 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 muestran algunos escenarios en los que encontrará el error de compilación:
- Usar una instrucción IF sin el IF final
- Usando la instrucción For con el siguiente
- Uso de la instrucción Select sin usar End Select
- No declarar la variable (esto solo funciona cuando Option Explicit está habilitada)
- Llamar a una sub / función que no existe (o con parámetros incorrectos)
Errores de tiempo de ejecución
Los errores en tiempo de ejecución son aquellos que ocurren cuando el código se está ejecutando.
Los errores de tiempo de ejecución se producirán solo cuando se hayan resuelto todos los errores de sintaxis y compilación.
Por ejemplo, si ejecuta un código que se supone que debe abrir un libro de Excel, pero ese libro no está disponible (ya sea eliminado o cambiado de nombre), su código le dará un error de tiempo de ejecución.
Cuando ocurre un error en tiempo de ejecución, detendrá el código y le mostrará el cuadro de diálogo de error.
El mensaje del cuadro de diálogo Error en 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 lo dejó.
O también puede hacer clic en el botón Finalizar para salir del código.
Importante: En caso de que haga clic en el botón Finalizar en el cuadro de diálogo, detendrá el código en la línea en la que se encuentra. Sin embargo, todas las líneas de código anteriores se habrían ejecutado.Errores lógicos
Los errores lógicos no harán que su código se detenga, pero pueden dar lugar a resultados incorrectos. Estos también podrían ser los tipos de errores más difíciles de solucionar.
El compilador no destaca estos errores y es necesario abordarlos manualmente.
Un ejemplo de error lógico (con el que a menudo me encuentro atrapado) es ejecutar un bucle sin fin.
Otro ejemplo podría ser cuando da un resultado incorrecto. Por ejemplo, puede terminar usando una variable incorrecta en el código o agregar dos variables donde una es incorrecta.
Hay algunas formas que utilizo 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 va 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 revisar el código una línea a la vez e identificar los errores lógicos.
Uso de depuración para encontrar errores de compilación / sintaxis
Una vez que haya terminado con el código, es una buena práctica compilarlo antes de ejecutarlo.
Para compilar un código, haga clic en la opción Depurar en la barra de herramientas y haga clic en Compilar VBAProject.
Cuando compila un proyecto de VBA, pasa por el código e identifica errores (si los hay).
En caso de que encuentre un error, le mostrará un cuadro de diálogo con el error. Encuentra errores uno por uno. Por lo tanto, si encuentra un error y lo ha corregido, debe ejecutar la compilación nuevamente para encontrar otros errores (si los hay).
Cuando su código esté libre de errores, la opción Compilar VBAProject estará atenuada.
Tenga en cuenta que la compilación solo encontrará errores de "sintaxis" y errores de "compilación". NO encontrará los errores de tiempo de ejecución.
Cuando escribe código VBA, no quiere que aparezcan los errores. Para evitar esto, existen muchos métodos de manejo de errores que puede utilizar.
En las siguientes secciones de este artículo, cubriré los métodos que puede usar para el manejo de errores de VBA en Excel.
Configurar los ajustes de error (errores manejados frente a errores no manejados)
Antes de comenzar a trabajar con su código, debe verificar una configuración en Excel VBA.
Vaya a la barra de herramientas de VBA y haga clic en Herramientas y luego haga clic en Opciones.
En el cuadro de diálogo Opciones, haga clic en la pestaña General y asegúrese de que dentro del grupo "Detección de errores", esté marcada la casilla "Interrumpir en errores no controlados".
Déjame explicarte las tres opciones:
- Romper con todos los errores: Esto detendrá su código en todo tipo de errores, incluso cuando haya utilizado las técnicas para manejar estos errores.
- Módulo Break in Class: Esto detendrá su código en todos los errores no manejados y, al mismo tiempo, si está utilizando objetos como formularios de usuario, también se romperá dentro de esos objetos y resaltará la línea exacta que causa el error.
- Romper con los errores no manejados: Esto detendrá su código solo para aquellos errores que no se manejan. Esta es la configuración predeterminada, ya que garantiza que se le notifique cualquier error no manejado. Si está utilizando 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 se refiere a ese objeto.
En pocas palabras: si recién está comenzando con Excel VBA, asegúrese de que esté marcado "Romper en errores no manejados".
Manejo de errores de VBA con declaraciones "en caso de error"
Cuando su código encuentra un error, hay algunas cosas que puede hacer:
- Ignore el error y deje que el código continúe
- Tenga un código de manejo de errores en su lugar y ejecútelo cuando ocurra un error
Ambos métodos de manejo de errores aseguran que el usuario final no verá un error.
Hay algunas declaraciones "en caso de error" que puede utilizar para realizarlas.
En caso de error, reanudar siguiente
Cuando utiliza "En caso de error, reanudar a continuación" 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. Dado que 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.
Sub AssignValues () x = 20/4 y = 30/0 End Sub
Esto sucede porque no se puede dividir un número por cero.
Pero si utilizo la declaración "En caso de error, reanudar a continuación" en este código (como se muestra a continuación), ignorará el error y no sabré que hay un problema que debe corregirse.
Sub AssignValues () En caso de error Reanudar Siguiente x = 20/4 y = 30/0 End Sub
On Error Resume Next debe usarse solo cuando sepa 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 de 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).
Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Formato (Ahora, "dd-mmm-aaaa hh: mm: ss") End Sub
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. Dado que una hoja de gráfico no tiene celdas, el código arrojaría un error.
Por lo tanto, si utilizo la instrucción "En caso de error, reanude el siguiente" en este código, funcionará como se esperaba con las hojas de trabajo y no hará nada con las hojas de gráficos.
Private Sub Workbook_NewSheet (ByVal Sh As Object) En caso de error Reanudar siguiente Sh.Range ("A1") = Formato (ahora, "dd-mmm-aaaa hh: mm: ss") End Sub
Nota: En caso de error, la declaración siguiente se utiliza mejor cuando se sabe qué tipo de errores es probable que se produzcan. 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 él.
El siguiente código mostraría un cuadro de mensaje que informaría al usuario que no se ha insertado una hoja de trabajo.
Private Sub Workbook_NewSheet (ByVal Sh As Object) En caso de error Reanudar Siguiente Sh.Range ("A1") = Formato (Ahora, "dd-mmm-aaaa hh: mm: ss") Si Err.Number 0 Then MsgBox "Parece usted insertó una hoja de gráfico "& vbCrLf &" Error - "& Err.Description End If End Sub
"Err.Number" se usa para obtener el número de error y "Err.Description" se usa para obtener la descripción del error. Estos se tratarán más adelante en este tutorial.
En caso de error, vaya a 0
"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.
En términos simples, habilita el comportamiento de comprobación de errores predeterminado y muestra el mensaje de error predeterminado.
Entonces, ¿por qué usarlo?
Normalmente, no es necesario utilizar "En caso de error, pasar a 0", pero puede resultar útil cuando se utiliza junto con "En caso de error, reanudar el siguiente".
¡Dejame explicar!
El siguiente código seleccionaría todas las celdas en blanco en la selección.
Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks) .Select End Sub
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:
Sub SelectFormulaCells () En caso de error, reanude la siguiente selección.SpecialCells (xlCellTypeBlanks) .Seleccione End Sub
¡Hasta ahora tan bueno!
El problema surge cuando hay una parte del código en la que puede ocurrir un error, y dado que está utilizando "En caso de error, reanudar a continuación", el código simplemente lo ignoraría y pasaría a la siguiente línea.
Por ejemplo, en el código a continuación, no aparecerá ningún mensaje de error:
Sub SelectFormulaCells () En caso de error Reanudar la siguiente selección.SpecialCells (xlCellTypeBlanks) .Select '… más código que puede contener el error End Sub
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 al rescate.
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 hubiera celdas en blanco, pero habría un mensaje de error debido a '10 / 0 '
Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks) .Select On Error GoTo 0 '… más código que puede contener el error End Sub
En caso de error, vaya a [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 reanude 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:
Subprueba () en caso de error Ir a etiqueta: X = 10/0 'esta línea provoca un error'… .su código restante va aquí Salir de la etiqueta secundaria: 'código para manejar el error End Sub
Tenga en cuenta que antes de la "Etiqueta" de manejo de errores, hay un Sub de salida. Esto asegura que, en caso de que no haya errores, se sale del sub y no se ejecuta el código "Etiqueta". En caso de que no utilice Exit Sub, siempre ejecutará el código de "Etiqueta".
En el código de ejemplo a continuación, cuando ocurre un error, el código salta y ejecuta el código en la sección del controlador (y muestra un cuadro de mensaje).
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Salir Sub ErrMsg: MsgBox "Parece haber un error" & vbCrLf & Err.Description End Sub
Tenga en cuenta que cuando ocurre un error, el código ya se ha ejecutado y ha 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 como el error ocurre en la siguiente línea, no establece los valores de 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.
En caso de 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 (no dude en ignorarlo y pasar a la siguiente sección si solo busca lo básico).
Antes de entrar en la mecánica del mismo, permítanme intentar explicar dónde puede ser útil.
Suponga 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 parecido a la película de inicio)?
En tal caso, no puede utilizar el segundo controlador, ya que el primer error no se ha eliminado. Entonces, aunque ha 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 utilizar On Error Goto -1.
Borra el error y libera memoria VBA para manejar el siguiente error.
¡Basta de hablar!
Permítame explicarlo ahora con ejemplos.
Supongamos que tengo el siguiente código. Esto arrojará un error ya que hay una división por cero.
Manejador de errores secundario () X = 12 Y = 20/0 Z = 30 Finalizar secundario
Entonces, para manejarlo, uso un código de controlador de errores (con el nombre ErrMsg) como se muestra a continuación:
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Salir Sub ErrMsg: MsgBox "Parece haber un error" & vbCrLf & Err.Description End Sub
Todo está bien ahora de nuevo. Tan pronto como ocurre el error, se utiliza el controlador de errores y muestra un cuadro de mensaje como se muestra a continuación.
Ahora, amplío el código para tener más código en o después del controlador de errores.
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Salir Sub ErrMsg: MsgBox "Parece haber un error" & vbCrLf & Err.Description A = 10/2 B = 35/0 End Sub
Dado que se ha manejado el primer error pero no se ha manejado el segundo, veo de nuevo un error como se muestra a continuación.
Todo bien. El código se está comportando de la manera que esperábamos.
Entonces, para manejar el segundo error, utilizo otro controlador de errores (ErrMsg2).
Sub Errorhandler () En caso de error Ir a ErrMsg X = 12 Y = 20/0 Z = 30 Salir de Sub ErrMsg: MsgBox "Parece haber un error" & vbCrLf & Err.Descripción del error Ir a ErrMsg2 A = 10/2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Parece haber un error nuevamente" & vbCrLf & Err.Description End Sub
Y aqui es donde esta no funciona como se esperaba.
Si ejecuta el código anterior, todavía le dará un error en 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 provocó 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 siguiente código y la ejecuta, funcionará como se esperaba.
Sub Errorhandler () En caso de error Ir a ErrMsg X = 12 Y = 20/0 Z = 30 Salir de Sub ErrMsg: MsgBox "Parece haber un error" & vbCrLf & Err.Descripción de error Ir a -1 En caso de error Ir a ErrMsg2 A = 10 / 2 B = 35/0 Exit Sub ErrMsg2: MsgBox "Parece haber un error nuevamente" & vbCrLf & Err.Description End SubNota: El error se borra automáticamente cuando finaliza una subrutina.Por lo tanto, "On Error Goto -1" puede ser útil cuando obtiene dos o más de dos errores en la misma subrutina.
El objeto Err
Siempre que ocurre un error con un código, es el objeto Err el que se utiliza para obtener los detalles sobre el error (como el número de error o la descripción).
Propiedades del objeto Err
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 |
HelpContext | El ID de 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 es necesario utilizar 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 como hay una cadena de texto en la celda A5, muestra un error tan pronto como esto ocurre.
Sub FindSqrRoot () Dim rng As Range Set rng = Selección para cada celda En rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Siguiente celda End Sub
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 utilizar el objeto Err para que estos mensajes de error sean más significativos.
Por ejemplo, si ahora uso el siguiente código VBA, detendrá el código tan pronto como se produzca el error y mostrará un cuadro de mensaje con la dirección de la celda donde hay un problema.
Sub FindSqrRoot () Dim rng As Range Set rng = Selección para cada celda In rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Siguiente celda ErrHandler: MsgBox "Número de error:" & Err .Number & vbCrLf & _ "Descripción del error:" & Err.Description & vbCrLf & _ "Error en:" & celda.Address End Sub
El código anterior le proporcionaría mucha más información que el simple "Tipo no coincidente", 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 proporcione una lista de direcciones de celda donde ocurre el error.
El siguiente código haría esto:
Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection For Each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Error en las siguientes celdas" & ErrorCells Exit Sub End Sub
El código anterior se ejecuta hasta el final y da 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):
Métodos de Err Object
Si bien las propiedades Err son útiles para mostrar información útil sobre los errores, también existen dos métodos Err que pueden ayudarlo con el manejo de errores.
Método | Descripción |
Claro | Borra todas las configuraciones de propiedad del objeto Err |
Aumentar | Genera un error en tiempo de ejecución. |
Aprendamos rápidamente qué son y cómo / por qué usarlos con VBA en Excel.
Método Err Clear
Suponga que tiene un conjunto de datos como se muestra a continuación y desea obtener la raíz cuadrada de todos estos números en la columna adyacente.
El siguiente código obtendrá las raíces cuadradas de todos los números en la columna adyacente y mostrará un mensaje de que ocurrió un error para las celdas A5 y A9 (ya que estas tienen texto).
Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection For Each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Error en las siguientes celdas" & ErrorCells End Sub
Tenga en cuenta que he utilizado el método Err.Clear dentro de la declaración If Then.
Una vez que ha ocurrido un error y atrapado por la condición If, el método Err.Clear restablece el número de error de nuevo a 0. Esto asegura que la condición IF solo captura los errores de las celdas donde se genera.
Si no hubiera utilizado el método Err.Clear, una vez que se produce el error, siempre sería cierto en la condición IF y el número de error no se ha restablecido.
Otra forma de hacer que esto funcione es utilizando On Error Goto -1, que restablece el error por completo.
Nota: Err.Clear es diferente de On Error Goto -1. Err.Clear solo borra la descripción del error y el número de error. no lo restablece por completo. Esto significa que si hay otra instancia de error en el mismo código, no podrá manejarlo antes de restablecerlo (lo que se puede hacer con "On Error Goto -1" y no con "Err.Clear").Método Err Raise
El método Err.Raise le permite generar un error en tiempo de ejecución.
A continuación se muestra la sintaxis del uso del método Err.Raise:
Err.Raise [número], [fuente], [descripción], [archivo de ayuda], [contexto de ayuda]
Todos estos argumentos son opcionales y puede usarlos para hacer que su mensaje de error sea más significativo.
Pero, ¿por qué querrías cometer un error tú mismo?
¡Buena pregunta!
Puede usar este método cuando hay una instancia de un error (lo que significa que va a haber un error de todos modos) y luego usa este método para decirle al usuario más sobre el error (en lugar del mensaje de error menos útil que muestra VBA por defecto).
Por ejemplo, suponga que tiene un conjunto de datos como se muestra a continuación y desea que todas las celdas solo tengan valores numéricos.
Sub RaiseError () Dim rng As Range Set rng = Selection On Error GoTo ErrHandler para cada celda en rng Si no (IsNumeric (Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "No es un número", " Test.html "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub
El código anterior mostraría un mensaje de error que tiene la descripción especificada y el archivo de contexto.
Personalmente, nunca he usado Err.Raise ya que principalmente trabajo solo con Excel. Pero para alguien que usa VBA para trabajar con Excel junto con otras aplicaciones como Outlook, Word o PowerPoint, esto puede ser útil.
Aquí hay un artículo detallado sobre el método Err.Raise en caso de que desee obtener más información.
Prácticas recomendadas para el manejo de errores de VBA
No importa qué tan hábil sea para escribir un código VBA, los errores siempre serán parte de él. Los mejores programadores son aquellos que tienen las habilidades para manejar estos errores correctamente.
Estas son algunas de las mejores prácticas que puede utilizar cuando se trata del manejo de errores en Excel VBA.
- Utilice "On Error Go [Label]" al principio del código. Esto asegurará que se maneje cualquier error que pueda ocurrir desde allí.
- Utilice "En caso de error, reanudar siguiente" SÓLO 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 seguirá adelante. Puede usar "En caso de error, reanudar a continuación" con "Err.Raise" si desea ignorar un cierto tipo de error y detectar el resto.
- Cuando utilice controladores de errores, asegúrese de utilizar Exit Sub antes que los controladores. Esto garantizará que el código del controlador de errores se ejecute solo cuando haya un error (de lo contrario, siempre se ejecutará).
- Utilice varios controladores de errores para atrapar diferentes tipos de errores. Tener varios manejadores de errores garantiza que un error se aborde correctamente. Por ejemplo, querrá manejar un error de "falta de coincidencia de tipo" de manera diferente a un error de tiempo de ejecución de "División por 0".
¡Espero que haya encontrado útil este artículo de Excel!
Aquí hay algunos tutoriales más de Excel VBA que le pueden gustar:
- Tipos de datos de Excel VBA: una guía completa
- Bucles de Excel VBA: para el siguiente, hacer mientras, hacer hasta, para cada uno
- Eventos de Excel VBA: una guía fácil (y completa)
- Editor de Visual Basic de Excel: cómo abrirlo y usarlo en Excel