VBA错误消息框不一致?

7 error-handling excel vba excel-vba

看起来,当发生未处理的异常时,VBA弹出的消息框的行为会有所不同,具体取决于...某些东西?要明白我的意思,请创建一个新的.xlsm,然后创建一个标准模块Module1; 粘贴在此代码中然后粘贴到Sheet1Worksheet对象里面这段代码:

Public Sub TestErrMsgBox()
    Debug.Print "Hello!"
    Call Err.Raise(Number:=vbObjectError, Source:="VBAProject.Sheet1",  Description:="Lorem Ipsum")
End Sub
Run Code Online (Sandbox Code Playgroud)

在我的Excel 2010 Professional Plus上,在VBE的"立即"(Ctrl + G)窗口中调用子例程:

调用Module1.TestErrMsgBox
Call Sheet1.TestErrMsgBox
Run Code Online (Sandbox Code Playgroud)

将显示错误消息自动化错误/无效的OLEVERB结构.

现在,如果在"立即"窗口中直接调用Raise方法:

Call Err.Raise(Number:=vbObjectError, Source:="VBAProject.Sheet1",  Description:="Lorem Ipsum")
Run Code Online (Sandbox Code Playgroud)

它将显示(预期的)错误消息Lorem Ipsum.

Err从第一种情况到最后一种情况,错误处理或对象的确切变化是什么?以及如何操纵它?我发现在第一种情况下,消息仅取决于调用中的Number参数Raise,但它仍然没有解释......

我发现这有点烦人,因为我希望我的消息显示,而不是其他.总是有可用的口袋妖怪方法(捕获所有异常并根据Err属性显示自定义MessageBoxes ),但我想了解会发生什么.:-)

稍后编辑:

当"错误陷阱"设置为"未处理的错误中断"时,会发生上述行为.一旦我输入"Break on All Errors",它会显示正确的消息,并显示"Debug"按钮; 但是,打破每个错误的执行都不是一个好主意...

另外,感谢Alex K.,roryapDoug Glancy的反馈,我发现当从JobheetTestErrMsgBox对象中调用子例程时,会发生这种情况,而不是第一次错误报告的标准模块.发布是固定的; 但问题仍然存在.:-)

Dou*_*ncy 5

当您的Sub在Sheet模块中并且您已将VBE设置为Break on Unhandled Errors时,它发生的原因与Sheet模块是类模块的事实有关.在类模块中将错误陷阱设置为中断,它将正常运行.

我总是使用这个设置,所以我可以调试UserForms和类.

搜索"类模块中的VBA err.raise无效的oleverb结构中断"似乎支持它与类模块相关的事实.