开发者

Excel: Break on Error doesn't work in user-defined function

开发者 https://www.devze.com 2023-03-19 05:57 出处:网络
It seems that when VBA code is called from a cell formula (ie. a \"User Defined Function\" or UDF), the usual VBA Break On Error doesn\'t work.

It seems that when VBA code is called from a cell formula (ie. a "User Defined Function" or UDF), the usual VBA Break On Error doesn't work.

The only place I can find this behavior documented is a couple of lines in an article called "Developing User-Defined Fu开发者_运维问答nctions for Excel 2007 and Excel Services":

Error handling returns #VALUE errors. All exceptions thrown by the UDF code are returned into the Excel worksheet as #VALUE errors.

Even if you set Error Trapping to "Break on All Errors" and single-step your code**, you will never see the VBA Run-time Error dialog - Excel just quietly abandons execution without telling you what went wrong. Of course this makes debugging more difficult than it needs to be.

There are some potential workarounds involving On Error but I'd rather not clutter up my code just to find out where an error was raised.

Is there some Excel / VBA option I've overlooked which will make Break On Error work normally? I'm using Excel 2003.

** The only way to get into the debugger when called from a cell is to set a breakpoint or use a Stop statement


Best method would be to use the On Error GoTo ErrorHandler with a Stop reference followed by Resume.

Need to be careful not to get into an infinite loop with resume as UDFs run almost continually (if this happens hit Esc repeatedly)

So in your code add: On Error GoTo ErrorHandler near the start of your function and then right at the end before End Function:

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

The Exit Function stops this code running in normal operation. If an error is encountered a messagebox with the details will pop up, the code will break (due to Stop) and you can step through back into your code (hopping back via the resume statement) using the next line command on the debug toolbar.

Of course don't forget to comment out the On Error GoTo ErrorHandler line when you're happy with your UDF.


I'm aware that it isn't any fun hearing this when you specifically asked for something else than On Error, but I'm afraid it's the only option to my knowledge.

You could just use On Error Goto ErrorHandler while debugging (and comment it out to get the default On Error Goto 0 at other times). The ErrorHandler could have just a couple of lines so it doesn't clutter up your code too much:

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

always with a breakpoint on Resume to guide you back to the error-causing statement upon stepping -- and to avoid an infinite error-handling loop.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号