Tabla de contenido:
Video: Los 10 tipos de errores comunes en macros en Excel VBA que muy pocos saben, Runtime errors - Parte 2 2024
Cuando necesite tratar los errores en Excel VBA, puede usar la instrucción OnError. Sin embargo, hay algunas cosas que debes saber primero. Puede usar la declaración On Error de tres maneras.
Sintaxis | Qué hace |
---|---|
En caso de error Ir a la etiqueta | Después de ejecutar esta declaración, VBA reanuda la ejecución en la instrucción
siguiendo la etiqueta especificada. Debe incluir dos puntos después de la etiqueta para que VBA lo reconozca como una etiqueta. |
En caso de error GoTo 0 | Después de ejecutar esta declaración, VBA reanuda su comportamiento de comprobación de errores
normal. Utilice esta declaración después de usar una de las otras declaraciones de error o cuando desee eliminar la gestión de errores en su procedimiento. |
En reanudación de error Siguiente | Después de ejecutar esta instrucción, VBA simplemente ignora todos los errores
y reanuda la ejecución con la siguiente instrucción. |
Reanudar después de un error
En algunos casos, simplemente desea que la rutina termine correctamente cuando se produce un error. Por ejemplo, puede mostrar un mensaje que describa el error y luego salir del procedimiento. (El ejemplo de EnterSquareRoot5 que se muestra anteriormente usa esta técnica). En otros casos, desea recuperarse del error, si es posible.
Para recuperarse de un error, debe usar una instrucción de resumen. Esto borra la condición de error y le permite continuar la ejecución en alguna ubicación. Puede usar la declaración de currículum de tres maneras.
Sintaxis | Lo que hace |
---|---|
Reanudar | La ejecución se reanuda con la declaración que provocó el error. Use
esto si su código de manejo de errores corrige el problema y está bien continuar. |
Reanudar Siguiente | La ejecución se reanuda con la instrucción inmediatamente posterior a la declaración
que provocó el error. Esto esencialmente ignora el error . |
Reanudar etiqueta | La ejecución se reanuda en la etiqueta que especifique. |
El siguiente ejemplo utiliza una instrucción de reanudación después de que ocurra un error:
Sub EnterSquareRoot6 () Dim Num como Variant Dim Msg As String Dim Ans As Integer TryAgain: 'Configurar el manejo de errores On Error GoTo BadEntry 'Solicitud de un valor Num = InputBox ("Enter a value") Si Num = "" Then Exit Sub' Inserta la raíz cuadrada ActiveCell. Valor = Sqr (Num) Salir Sub BadEntry: Msg = Err. Número & ":" & Error (Número Err) Msg = Msg & vbNewLine & vbNewLine Msg = Msg & "Asegúrese de que se selecciona un rango," Msg = Msg & "la hoja no está protegida," Msg = Msg & "y ingresas un valor no negativo "Msg = Msg & vbNewLine & vbNewLine &" ¿Intenta nuevamente? "Ans = MsgBox (Msg, vbYesNo + vbCritical) Si Ans = vbSi Entonces, reanudar TryAgain End Sub
Este procedimiento tiene otra etiqueta: TryAgain.Si se produce un error, la ejecución continúa en la etiqueta BadEntry y el código muestra el mensaje a continuación. Si el usuario responde haciendo clic en Sí, la instrucción de reanálisis se activa y la ejecución vuelve a la etiqueta TryAgain. Si el usuario hace clic en No, el procedimiento finaliza.
Si se produce un error, el usuario puede decidir si volver a intentarlo.Observe que el mensaje de error también incluye el número de error, junto con la descripción del error "oficial".
La instrucción de resumen borra la condición de error antes de continuar. Para ver esto, intente sustituir la siguiente instrucción por la penúltima declaración en el ejemplo anterior:
Si Ans = vbYes Then GoTo TryAgain
El código no funciona correctamente si usa GoTo en lugar de Resume. Para demostrar, ingrese un número negativo. Obtiene el mensaje de error. Haga clic en Sí para intentar nuevamente y luego ingrese otro número negativo . Este segundo error no está atrapado porque la condición de error original no se borró.
Manejo de errores en pocas palabras
Para ayudarlo a mantener todo este asunto de manejo de errores, aquí hay un resumen rápido y sucio. Un bloque de código de manejo de errores tiene las siguientes características:
-
Comienza inmediatamente después de la etiqueta especificada en la sentencia On Error.
-
Debería ser alcanzado por su macro solo si ocurre un error. Esto significa que debe usar una declaración como Salir Sub o Salir de la Función inmediatamente antes de la etiqueta.
-
Puede requerir una declaración de resumen. Si decide no abortar el procedimiento cuando se produce un error, debe ejecutar una instrucción de resumen antes de volver al código principal.
Saber cuándo ignorar los errores
En algunos casos, está perfectamente bien ignorar los errores. Es entonces cuando entra en juego la declaración On Error Resume Next.
El siguiente ejemplo recorre cada celda en el rango seleccionado y convierte el valor en su raíz cuadrada. Este procedimiento genera un mensaje de error si alguna celda en la selección contiene un número o texto negativo:
SubSeleccionSqrt () Dim celda Como rango If TipoNombre (Selección) <> "rango" Luego Salir Sub Por Cada celda En Selección celda. Valor = Sqr (valor de celda) Celda siguiente End Sub
En este caso, es posible que desee omitir cualquier celda que contenga un valor que no pueda convertir en una raíz cuadrada. Puede crear todo tipo de capacidades de comprobación de errores mediante el uso de estructuras If-Then, pero puede idear una solución mejor (y más simple) simplemente ignorando los errores que se producen.
La siguiente rutina logra esto usando la instrucción On Error Resume Next:
Sub SelectionSqrt () Dim cell As Range If TypeName (Selection) <> "range" Then Exit Sub On On Error Resume Next para cada celda en Selection celda. Valor = Sqr (valor de celda) Celda siguiente End Sub
En general, puede usar una instrucción On Error Resume Next si considera que los errores son inofensivos o sin consecuencias para su tarea.