当发生未处理的异常时,VBA 弹出的消息框的行为似乎有所不同,具体取决于...某些东西?要明白我的意思,请创建一个新的 .xlsm,然后创建一个标准模块 ,然后粘贴到 Module1
;粘贴到此代码中Sheet1
Worksheet 对象中,输入以下代码:
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.TestErrMsgBoxCall Sheet1.TestErrMsgBox
将显示错误消息自动化错误/无效的 OLEVERB 结构。
现在,如果从“立即”窗口中直接调用 Raise 方法:
Call Err.Raise(Number:=vbObjectError, Source:="VBAProject.Sheet1", Description:="Lorem Ipsum")
它将显示(预期的)错误消息Lorem Ipsum。
从第一种情况到最后一种情况,错误处理或 Err
对象到底发生了什么变化?以及如何操纵它?我发现在第一种情况下,消息仅取决于 Raise
调用中的 Number
参数,但仍然无法解释...
我觉得这有点烦人,因为我希望显示我的消息,而不是其他内容。总是有可用的 Pokemon 方法(捕获所有异常并显示基于 Err
属性的自定义消息框),但我想了解会发生什么。 :-)
稍后编辑:
当“错误捕获”设置为“未处理错误时中断”时,会发生上述行为。一旦我输入“Break on All Errors”,它就会显示正确的消息,并且“调试”按钮可用;然而,这不是一个好主意,在每个错误上都中断执行......
另外,感谢Alex K.的反馈, roryap和 Doug Glancy我发现当从 Worksheet 对象中调用 TestErrMsgBox 子例程时会发生这种情况,而不是像我第一次错误报告的那样从标准模块中调用。发帖是固定的;然而,问题仍然存在。 :-)
最佳答案
当您的 Sub 位于 Sheet 模块中并且您已将 VBE 设置为“因未处理的错误而中断”时,会发生这种情况,这与 Sheet 模块是类模块这一事实有关。在类模块中将错误捕获设置为 Break,它将正常运行。
无论如何,我总是使用此设置,因此我可以在用户窗体和类中进行调试。
搜索“VBA err.raise 类模块中无效的 oleverb 结构中断”似乎支持它与类模块相关的事实。
关于vba - VBA 错误消息框不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23700167/