2010-10-12 22 views
16

Como de costumbre, creo un controlador de errores usando la instrucción On Error Goto, allí puse algunas líneas de códigos de limpieza y visualizo el mensaje de error, pero ahora no quiero perder la comodidad del controlador predeterminado que también me indica la línea exacta donde ocurrió el error ¿Cómo puedo hacer eso?VBA: ¿Cómo mostrar un mensaje de error como el mensaje de error estándar que tiene un botón "Depurar"?

Gracias de antemano.

+0

Sólo para mantener la enlaces apropiados ... esta pregunta continúa aquí: http://stackoverflow.com/questions/3929997/vba-how-to-make-the-current-cursor-in-vbe-jump-to-the-line-where- el último error/3930626 # 3930626 –

Respuesta

37

Primero las buenas noticias. Este código hace lo que quiere (por favor, tenga en cuenta 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 esperada:

alt text

Y ahora las malas noticias:
Los números de línea son un residuo de las versiones anteriores de Basic. El entorno de programación generalmente se encargó de insertarlos y actualizarlos. En VBA y otras versiones "modernas", esta funcionalidad se pierde.

Sin embargo, Here hay varias alternativas para agregar números de línea "automáticamente", ahorrándole la tediosa tarea de tipearlos ... pero todos parecen más o menos engorrosos ... o comerciales.

HTH!

+0

MZTools puede agregar/eliminar números de línea y es –

+0

@Charles sí gratis. Esa es una de las referencias en la página que he citado. Tnx! –

+0

@belisarius, muchas gracias por el código, información valiosa y referencias externas útiles. Solo curiosidad, ¿hay alguna manera de llevar la línea al foco del lector, incluso destacarlos e ingresar al modo de depuración? ¿Es eso realmente una funcionalidad interna? – Vantomex

1

Hay una forma más simple simplemente deshabilite el controlador de errores en su controlador de errores si no coincide con los tipos de error que está realizando y reinicie.

El controlador siguiente verifica cada tipo de error y si ninguno coincide, devuelve el error al VBA normal, es decir, a Ir 0 y reanuda el código que luego intenta volver a ejecutar el código y aparece el bloque de error normal.

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 
0

Esta respuesta no aborda el botón de depuración (que tendría que diseñar un formulario y utilizar los botones en que para hacer algo como el método en su next question). Pero soluciona esta parte:

ahora No quiero perder la comodidad del controlador predeterminado que también me indica la línea exacta donde ocurrió el error.

En primer lugar, supongo que no quiere esto en el código de producción; lo quiere para la depuración o para el código que usará personalmente. Uso un indicador de compilación para indicar la depuración; entonces, si estoy solucionando un problema de 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 se produce en un sub-procedimiento sin una rutina de tratamiento de errores, entonces Resume le llevará a la línea en este proc que llamó a la sub-procedimiento con el error. Pero aún puede entrar y salir del subprocedimiento, usando F8 hasta que se repita el error. Si el subprocedimiento es demasiado largo para hacer incluso eso tedioso, entonces su sub-procedimiento probablemente debería tener su propia rutina de manejo de errores.

Existen varias formas de hacerlo.A veces los programas más pequeños donde sé que voy a estar pasando a través de él de todos modos, cuando la solución de problemas, acabo de poner estas líneas justo después de la instrucción MsgBox:

Resume ExitHere   ' Normally exits during production 
    Resume     ' Never will get here 
Exit Sub 

Nunca se llega a la instrucción Resume, a menos que esté pisando y configurándolo como la próxima línea que se ejecutará, arrastrando el siguiente puntero a esa línea, o presionando CtrlF9 con el cursor en esa línea.

Aquí hay un artículo que amplía estos conceptos: Five tips for handling errors in VBA. Finalmente, si está usando VBA y aún no ha descubierto el sitio impresionante de Chip Pearson, tiene una página que explica Error Handling In VBA.

0

para mí sólo quería ver el error en mi aplicación de VBA por lo que en la función creé el código de abajo ..

Función Database_FileRpt '-------------- ----------- En caso de error vaya a CleanFail '------------------------- ' 'Create_DailyReport_Action y código

CleanFail:

'*************************************

MsgBox "********************" _

& vbCrLf & "Err.Number:" & Err.Number _

& vbCrLf & "Err.Description:" & Err.Description _

& vbCrLf & "Err.Source:" & Err.Source _

& vbCrLf & "********************" _

& vbCrLf & "... Salir de VBA Función: Database_FileRpt" _

& vbCrLf & "... Reinicio del programa Excel VBA". _

,, "Excepción de error VBA planteado!"


'Tenga en cuenta que la siguiente línea se restablecerá el objeto de error a 0, las variables anteriormente se utilizan para recordar los valores ' de modo que el mismo error puede ser re-raise

Err.Clear

'*************************************

Reanudar CleanExit

CleanExit:

'código de limpieza, si lo hay, va aquí. se ejecuta independientemente del estado de error.

Salir la función 'SUB o Función

End Function' final de Database_FileRpt

'------------------

Cuestiones relacionadas