Como de costumbre, creo un manejador de errores usando la sentencia On Error Goto
, allí pongo unas pocas líneas de códigos de limpieza y muestro el mensaje de error, pero ahora no quiero perder la comodidad del manejador por defecto que además me apunta a la línea exacta donde se ha producido el error. ¿Cómo puedo hacerlo?
Gracias de antemano.
Primero las buenas noticias. Este código hace lo que quieres (por favor nota los "números de línea")
Sub a()
10: On Error GoTo ErrorHandler
20: DivisionByZero = 1 / 0
30: Exit Sub
ErrorHandler:
41: If Err.Number <> 0 Then
42: Msg = "Error # " & Str(Err.Number) & " was generated by " _
& Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
43: MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
44: End If
50: Resume Next
60: End Sub
Cuando se ejecuta, se muestra el MsgBox esperado:
Y ahora las malas noticias: Los números de línea son un residuo de las versiones antiguas de Basic. El entorno de programación solía encargarse de insertarlos y actualizarlos. En VBA y otras versiones "modernas", esta funcionalidad se ha perdido.
Sin embargo, Aquí existen varias alternativas para "añadir automáticamente" los números de línea, ahorrándote la tediosa tarea de teclearlos... pero todas parecen más o menos engorrosas... o comerciales.
¡HTH!
Hay una manera más simple simplemente deshabilite el manejador de errores en su manejador de errores si no coincide con los tipos de error que está haciendo y reanudar.
El controlador de abajo comprueba agains cada tipo de error y si ninguno es un partido que devuelve reanudar error a VBA normal, es decir, GoTo 0 y reanuda el código que luego intenta volver a ejecutar el código y el bloque de error normal aparece.
On Error GoTo ErrorHandler
x = 1/0
ErrorHandler:
if Err.Number = 13 then ' 13 is Type mismatch (only used as an example)
'error handling code for this
end if
If err.Number = 1004 then ' 1004 is Too Large (only used as an example)
'error handling code for this
end if
On Error GoTo 0
Resume
Esta respuesta no aborda el botón Depurar (tendría que diseñar un formulario y utilizar los botones en él para hacer algo como el método en su siguiente pregunta). Pero sí aborda esta parte:
Ahora no quiero perder la comodidad del manejador por defecto que también me apunta a la línea exacta donde se ha producido el error.
En primer lugar, voy a suponer que usted don't quiere esto en el código de producción - usted lo quiere ya sea para la depuración o para el código que usted personalmente va a utilizar. Yo uso una bandera del compilador para indicar depuración; entonces, si estoy solucionando un programa, puedo encontrar fácilmente la línea que está causando el problema.
# Const IsDebug = True
Sub ProcA()
On Error Goto ErrorHandler
' Main code of proc
ExitHere:
On Error Resume Next
' Close objects and stuff here
Exit Sub
ErrorHandler:
MsgBox Err.Number & ": " & Err.Description, , ThisWorkbook.Name & ": ProcA"
#If IsDebug Then
Stop ' Used for troubleshooting - Then press F8 to step thru code
Resume ' Resume will take you to the line that errored out
#Else
Resume ExitHere ' Exit procedure during normal running
#End If
End Sub
Nota: la excepción a Resume
es si el error ocurre en un sub-procedimiento sin una rutina de manejo de errores, entonces Resume
le llevará a la línea en este proc que llamó al sub-procedimiento con el error. Pero aún puede entrar y atravesar el sub-procedimiento, usando F8 hasta que vuelva a fallar. Si el sub-procedimiento'es demasiado largo para hacer incluso eso tedioso, entonces su sub-procedimiento probablemente debería tener su propia rutina de manejo de errores.
Hay múltiples maneras de hacer esto. A veces, para programas más pequeños en los que sé que voy a pasar por ellos de todos modos para solucionar problemas, simplemente pongo estas líneas justo después de la sentencia MsgBox:
Resume ExitHere ' Normally exits during production
Resume ' Never will get here
Exit Sub
Nunca llegará a la sentencia Resume, a menos que usted'esté avanzando y la establezca como la siguiente línea a ejecutar, ya sea arrastrando el puntero de la siguiente sentencia a esa línea, o pulsando CtrlF9 con el cursor en esa línea.
Aquí'hay un artículo que amplía estos conceptos: Cinco consejos para manejar errores en VBA. Por último, si utiliza VBA y aún no ha descubierto el impresionante sitio de Chip Pearson, tiene una página que explica Error Handling In VBA.