看起来,当发生未处理的异常时,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.,roryap和Doug Glancy的反馈,我发现当从Workheet对象中调用TestErrMsgBox
子例程时会发生这种情况,而不是从我第一次错误报告的标准模块。发布是固定的;但问题仍然存在。 : - )
答案 0 :(得分:5)
当您的Sub在Sheet模块中并且您已将VBE设置为Break on Unhandled Errors时,它发生的原因与Sheet模块是类模块的事实有关。在类模块中将错误陷阱设置为中断,它将正常运行。
我总是使用这个设置,所以我可以调试UserForms和类。
在类模块中搜索&#34; VBA err.raise无效的oleverb结构中断&#34;似乎支持它与类模块有关的事实。
答案 1 :(得分:0)
在类模块中声明sub为friend而不是public