vba - VBA 错误消息框不一致?

标签 vba excel error-handling

当发生未处理的异常时,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.TestErrMsgBox
Call 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.的反馈, roryapDoug Glancy我发现当从 Worksheet 对象中调用 TestErrMsgBox 子例程时会发生这种情况,而不是像我第一次错误报告的那样从标准模块中调用。发帖是固定的;然而,问题仍然存在。 :-)

最佳答案

当您的 Sub 位于 Sheet 模块中并且您已将 VBE 设置为“因未处理的错误而中断”时,会发生这种情况,这与 Sheet 模块是类模块这一事实有关。在类模块中将错误捕获设置为 Break,它将正常运行。

无论如何,我总是使用此设置,因此我可以在用户窗体和类中进行调试。

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

关于vba - VBA 错误消息框不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23700167/

相关文章:

excel - 如何在不通过 vba 使用用户名的情况下打开 windows 文件夹?

vba - 覆盖数据透视表中的双击操作以转到筛选的源数据

error-handling - 如何从 Loopback 4 中的 Controller 返回错误?

amazon-web-services - AWS Lambda-如何处理异步(AWS S3)触发器上的错误?

excel - 等待查询完成后再继续

excel - vba 中的预期函数或变量错误

vba - Excel VBA 导入 .txt 文件导致日期格式错误

c - 如何验证枚举元素并最终生成错误?

excel - 我可以仅对特定列使用 worksheet_change 吗?

excel - 将不同范围添加到图表中的同一系列