VBA错误消息框不一致?

VBA错误消息框不一致?,vba,excel,error-handling,Vba,Excel,Error Handling,似乎VBA在发生未经处理的异常时弹出的消息框的行为因。。。某物要理解我的意思,请创建一个新的.xlsm,然后创建一个标准模块Module1;粘贴在此代码内,然后粘贴在此代码内Sheet1工作表对象: Public Sub TestErrMsgBox() Debug.Print "Hello!" Call Err.Raise(Number:=vbObjectError, Source:="VBAProject.Sheet1", Description:="Lorem Ipsum"

似乎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 将显示错误消息Automation error/Invalid OLEVERB结构

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

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

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

我觉得这有点烦人,因为我希望我的消息显示出来,而不是其他东西。Pokemon方法总是可用的(捕获所有异常并根据
Err
properties显示自定义MessageBox),但我想了解发生了什么。:-)

稍后编辑:

当“错误捕获”设置为“未处理错误中断”时,就会发生上述行为。一旦我设置了“所有错误中断”,它就会显示正确的消息,“调试”按钮可用;然而,这不是一个好主意,在每个错误上中断执行


另外,由于来自的反馈,我发现当从工作表对象中调用
TestErrMsgBox
子例程时会发生这种情况,而不是从标准模块,因为我第一次错误地报告了这一点。张贴是固定的;然而,问题仍然存在。:-)

当您的子模块位于图纸模块中且您已将VBE设置为在未处理错误时中断时发生这种情况的原因与图纸模块是类模块这一事实有关。将错误捕获设置为在类模块中中断,它将正常工作

我总是使用这个设置,所以我可以在用户窗体和类内部进行调试


搜索“VBA err.raise invalid oleverb structure break in class module”(VBA err.raise invalid oleverb structure break in class module)似乎支持它与类模块相关的事实。

将sub声明为类模块中的好友,而不是public

奇数,在2k7中对我有效,但是您应该向基代码添加一个值:
Number:=vbObjectError+1234
,这样试试?当出现“Invalid OLEVERB structure”错误消息时,如果点击“Debug”按钮会发生什么情况?密码在哪里断的?奇怪。我不能把你的问题复制到我的问题上。这两种情况对我来说都是一样的。Excel 2010 Pro,赢得7分,突破未处理的错误。@Douglancy--嘿,伙计,如果可以的话,我会接受你的回答。我想你成功了。1)再次感谢你寻找解决方案;然而,我想知道这种行为的原因。我会让这个问题再开放一天,以防万一有人能解释;如果这不发生,我当然会接受你的回答。我不想显得忘恩负义,只想有机会发现一些我想知道的事情2) (这一点是关于一般原则的,而不是对你的答案的批评)对于为个人使用而编写的代码来说,“中断类模块”是可以的;xlsm的普通用户不应该关心跟踪其他人的代码。3)此外,“类模块中断”可能会使某些代码无法执行某些错误处理。例如,一个文件可能有两种格式,但基本上包含相同的信息。这两种格式由两个类
C1
C2
解析,当无法识别特定格式时,这些类会产生错误。使用“中断类模块”时,不可能像处理非
C1
的情况那样处理,然后尝试
C2
,如果不是
C2
,则停止执行。4)给定第2)点和第3)点,我认为最好避免将函数的
公共子例程添加到Excel对象,如果这些可能抛出异常(就像我做的那样)。只需覆盖对象的钩子(例如
工作表_Activate
)就可以了,最终会添加
Private
方法来处理所有可能的错误。非常好的一点。关于其他用户必须将其设置为在类模块上中断,这对我来说从来都不是问题,因为我有处理它的错误处理。然而,对于调试来说,它是非常有用的。为什么会这样呢?我的假设是,异常的不同结果是因为能够实例化Sheet/ThisWorkbook,而不是模块。根据这个答案
Call Sheet1.TestErrMsgBox
Call Err.Raise(Number:=vbObjectError, Source:="VBAProject.Sheet1",  Description:="Lorem Ipsum")