如何检查对象是否是用户窗体?

How to check if an Object is a Userform?

我正在编写可以侦听用户窗体中发生的所有事件的代码,包括用户窗体本身。

main 方法采用MSForms.ControlMSForms.UserForm作为主要参数。为了适应任一选项,参数作为对象传入(见下文)。

Public Sub AddEventListner(ByRef ControlOrForm As Object)
  'Do next steps for adding listeners...
End Sub

如何检查用户窗体是否是传入的对象?

我想出的解决方案是在 VBA.UserForms 中循环每个用户窗体并检查名称是否与传入的对象匹配。这目前可以满足我的需要;但是,我想看看有没有比依赖名字匹配更可靠的解决方案

'CHECK TO SEE IF OBJ IS A USERFORM
Private Function IsUserform(ByRef Obj As Object) As Boolean

    Dim Form As Object
    For Each Form In VBA.UserForms

      'IF NAME MATCHES THEN IT MUST BE A USERFORM
      On Error GoTo NotUserform
      If Form.Name = Obj.Name Then
        IsUserform = True
        Exit Function
      End If

    Next

NotUserform:

End Function

还没有测试过,但可能是这样的:

Private Function IsUserform(ByRef Obj As Object) As Boolean

      If TypeOf Obj Is MSForms.UserForm Then
        IsUserform = True
      Else 
        IsUserform = False
      End If

End Function

至少避免了循环。

编辑: 为了使语法更简洁,下面的函数考虑了@ADJ 的建议。

Private Function IsUserform(ByRef Obj As Object) As Boolean

      IsUserform = TypeOf Obj Is MSForms.UserForm

End Function

问题似乎是 MsForms.Frame 也是 MsForms.UserForm。所以结果不是很可靠。因此,我使用的解决方案是:

Private Function IsForm(ByVal if_object As Object) As Boolean
    Dim o As Object
    On Error Resume Next
    Set o = if_object.Parent
    IsForm = Err.Number <> 0
End Function

虽然不那么优雅,但很管用。 MsForms.Frame 对象 returns False 和 MsForms.UserForm 对象 returns True。