如何将VBA用户表单中的错误传递给调用方法

lfr*_*dom 9 vba userform

VBA用户表单中的错误(在initialize事件中发生的错误之外)似乎没有冒泡到调用方法.有没有办法强迫错误冒出来?

VBA用户表单包含名为userform_error的事件,该事件定义为

Private Sub UserForm_Error(
    ByVal Number As Integer, 
    ByVal Description As MSForms.ReturnString, 
    ByVal SCode As Long, 
    ByVal Source As String, 
    ByVal HelpFile As String, 
    ByVal HelpContext As Long, 
    ByVal CancelDisplay As MSForms.ReturnBoolean
)
Run Code Online (Sandbox Code Playgroud)

在用户表单中发生错误时调用事件UserForm_Error似乎是合乎逻辑的,但似乎并非如此.实际上,我找不到Userform_Error的任何文档.

我搜索过MSDN,Bing,Google,StackOverflow,DuckDuckGo,但我还没有找到一个好的方法,或者有关UserForm_error实际做什么的任何文档.

Han*_*ant 5

很难为你提供准确的信息,这个组件很古老.只是一些背景.

UserForm对象由Microsoft Forms 2.0(一个ActiveX组件库)实现.它是一个将表单添加到任何应用程序的通用库,它不仅限于Office应用程序.您可以在c:\ windows\syswow64\fm20.dll(32位计算机的system32)上找到它.此组件的文档过去由fm20.chm提供.Microsoft不再提供此帮助文件,您仍然可以使用Google查询找回它.但是,大多数提供它的网站看起来都很阴暗. 这个看起来最不粘糊糊.实际上查看此文件非常麻烦,我可以浏览内容表,但不再显示任何页面文本.

我找到的一个解决方法是使用HTML Workshop实用程序对文件进行反编译.这产生了一个名为f3evtError.htm的文件,它看起来像这样(为内容编辑):


错误事件

在控件检测到错误并且无法将错误信息返回给调用程序时发生.

句法

Private Sub object_Error( ByVal Number As Integer, ByVal Description As MSForms.ReturnString, _
    ByVal SCode As SCode, ByVal Source As String, ByVal HelpFile As String, _
    ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean)
Run Code Online (Sandbox Code Playgroud)

Error事件语法包含以下部分:

  • 所需对象.有效的对象名称.
  • index:必需.与此事件关联的MultiPage中的页面索引.
  • 编号:必填.指定控件用于标识错误的唯一值.
  • 描述:必填.错误的文字描述.
  • SCode:必需.指定错误的OLE状态代码.低16位指定一个与Number参数相同的值.
  • 来源:必填.标识启动事件的控件的字符串.
  • HelpFile:必填.指定描述错误的帮助文件的标准路径名.
  • HelpContext:必需.指定包含错误描述的帮助文件主题的上下文ID.
  • CancelDisplay:必需.指定是否在消息框中显示错误字符串.

备注

为Error事件编写的代码确定控件如何响应错误条件.

处理错误条件的能力因应用程序而异.当发生应用程序无法处理的错误时,将启动Error事件.


不幸的是,这就是全部.它很模糊,因为该组件可以在许多不同类型的ActiveX主机中使用,错误捕获是主机实现细节.我认为最后一段是你真正要问的.我认为可以相当安全地假设,因为Office文档没有提到它,Office应用程序实际上并不触发此事件.事件在VBA编辑器中仍然可见这一事实只是对象模型工作方式的副作用.编辑器没有简单的方法可以过滤掉它,它只显示对象的所有已发布事件.


Mon*_*ild 1

您可以在 UserForm 代码(它是一个类)中捕获错误,然后在错误捕获代码中通过调用模块中的过程将错误详细信息传递到主代码。

或者,您可以在其调用代码中声明 UserForm 变量WithEvents,并在出现错误时引发您自己的错误事件。