VBA错误消息框不一致?

时间:2014-05-16 16:23:12

标签: vba excel-vba error-handling excel

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

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

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

<德尔>     调用Module1.TestErrMsgBox
Call Sheet1.TestErrMsgBox

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

现在,如果直接调用&#34;立即&#34;中的Raise方法。窗口:

Call Err.Raise(Number:=vbObjectError, Source:="VBAProject.Sheet1",  Description:="Lorem Ipsum")

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

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

我发现这有点烦人,因为我希望我的消息显示出来,而不是别的。可以随时使用Pokemon方法(捕获所有异常并显示基于Err属性的自定义MessageBox),但我想了解会发生什么。 : - )

稍后编辑:

上述行为发生在&#34;错误陷阱&#34;设置为&#34;打破未处理的错误。&#34;一旦我把&#34;打破所有错误&#34;它显示正确的消息,使用&#34; Debug&#34;按钮可用;但是,打破每个错误的执行都不是一个好主意...

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

2 个答案:

答案 0 :(得分:5)

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

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

在类模块中搜索&#34; VBA err.raise无效的oleverb结构中断&#34;似乎支持它与类模块有关的事实。

答案 1 :(得分:0)

在类模块中声明sub为friend而不是public