我正在使用Excel宏,在某个时候我需要确定某个用户窗体实例是否已经关闭/卸载。
我只想通过处理userform变量来做到这一点,而不想通过在form_queryclose事件处理程序中添加代码来做到这一点。原因是用户表单是由其他工作簿创建的,而AFAIK我无法知道用户表单的创建时间。
到现在为止,我唯一遇到的是以下错误(使我难以忍受):
Run-time error '13': Type mismatch
重现错误的方法如下(我使用的是MS Excel 2010 Pro Plus 32位):
创建一个模块并粘贴以下行:
Option Explicit
Dim f As UserForm1
Sub proc1()
Set f = New UserForm1
f.Show 0
End Sub
Sub proc2()
If Not IsFormLoaded(f) Then ' <---- Error
MsgBox "form is unloaded already!"
Exit Sub
End If
MsgBox f.Caption
End Sub
Function IsFormLoaded(f As Variant) As Boolean
If f Is Nothing Then Exit Function
If Not TypeOf f Is UserForm Then Err.Raise -1, , "Parameter is not a user form!"
Dim errnum As Long, v
On Error GoTo er
v = f.Caption
er:
errnum = Err.Number
On Error GoTo 0
IsFormLoaded = errnum = 0
End Function
将插入符放在proc1处,然后按F5键执行它。弹出一个表格。立即关闭它。
IsFormLoaded是函数,这是我提出您正在阅读的这个问题的重点。这是为了避免在用户窗体COM对象处于无效状态时访问用户窗体的成员变量。
如果您不愿单步执行代码,则会发现光标会像平常一样愉快地通过IsFormLoaded的行,但是错误点将位于proc2()的第一行(如果不是IsFormLoaded(f),则)。
我只希望IsFormLoaded可以工作,并且如果有解决方法,那会很好,但是使用VBA.Userforms来检查可用性是不可能的,因为该用户窗体属于其他工作簿,并且不会在VBA.Userforms中找到。
将声明更改为 Function IsFormLoaded(ByVal f As Variant) As Boolean
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句