2011-07-08 12 views
6

Parece que cuando se llama al código VBA desde una fórmula de celda (es decir, una "Función definida por el usuario" o UDF), el VBA Break On Error doesn ' t trabajo.Excel: Break on Error no funciona en la función definida por el usuario

El único lugar donde puedo encontrar este comportamiento documentado es un par de líneas en un artículo llamado "Developing User-Defined Functions for Excel 2007 and Excel Services": la gestión de devoluciones

de error # errores. Todas las excepciones generadas por el código UDF se devuelven a la hoja de cálculo de Excel como errores #VALOR.

Aunque ajuste captura de errores de "romper en todos los errores" y de un solo paso el código **, que nunca se verá el cuadro de diálogo de error en tiempo de ejecución de VBA - Excel simplemente abandona tranquilamente ejecución sin que le dice lo que salió incorrecto. Por supuesto, esto hace que la depuración sea más difícil de lo que necesita ser.

Existen algunas soluciones posibles que implican On Error pero prefiero no complicar mi código solo para descubrir dónde se produjo un error.

¿Hay alguna opción de Excel/VBA que haya pasado por alto que hará que Break On Error funcione normalmente? Estoy utilizando Excel 2003.

** La única manera de entrar en el depurador cuando se llama desde una célula es establecer un punto de interrupción o utilizar una declaración Stop

Respuesta

2

Soy consciente de que no es ningún Es divertido escuchar esto cuando específicamente pediste algo más que On Error, pero me temo que es la única opción que yo sepa.

Puede usar On Error Goto ErrorHandler mientras realiza la depuración (y coméntelo para obtener el valor predeterminado On Error Goto 0 en otros momentos). El ErrorHandler podría tener sólo un par de líneas para que no saturar su código demasiado:

ErrorHandler: 
    MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description 
    Resume 

siempre con un punto de interrupción en Resume para guiarle de vuelta a la cuenta de errores que causan al poner un pie - y evitar un bucle infinito de manejo de errores.

2

El mejor método sería usar el On Error GoTo ErrorHandler con una referencia Stop seguido de Resume.

hay que tener cuidado de no entrar en un bucle infinito con resume como UDF corren casi continuamente (si esto sucede golpeó Esc repetidamente)

Así que en su código de complemento: On Error GoTo ErrorHandler cerca del comienzo de su función y luego a la derecha al final antes de End Function:

Exit Function 
ErrorHandler: 
MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description 
Stop 
Resume 

los Exit Function paradas este código que se ejecuta en la operación normal. Si se produce un error, aparecerá un cuadro de mensaje con los detalles, el código se romperá (debido a Stop) y puede regresar al código (retrocediendo a través de la declaración resume) usando el siguiente comando de línea en la barra de herramientas de depuración .

Por supuesto, no se olvide de comentar la línea On Error GoTo ErrorHandler cuando esté satisfecho con su UDF.

Cuestiones relacionadas