如何检查对象是否是用户窗体?
How to check if an Object is a Userform?
我正在编写可以侦听用户窗体中发生的所有事件的代码,包括用户窗体本身。
main 方法采用MSForms.Control
或MSForms.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。
我正在编写可以侦听用户窗体中发生的所有事件的代码,包括用户窗体本身。
main 方法采用MSForms.Control
或MSForms.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。