我有以下代码打开一个表单,然后做一些事情。
Sub lag_ny_a3()
Dim frm As ufNyA3
Set frm = New ufNyA3
frm.Show
If Not frm Is Nothing Then
MsgBox("Doing stuff")
Unload frm
End If
End Sub
然后我的表单中有以下代码
Private Sub cmdAvbryt_Click()
Unload Me
End Sub
但是,即使在表单中单击了 cmdAvbryt 按钮,第一个代码片段也会进入 if 语句,就像表单未卸载一样。为什么会这样,如果按下 cmdAvbryt 按钮,我如何防止执行 if 语句中的代码?
即使您的frm
变量未Nothing
,表单也会被卸载。在frm.Show
前后添加一点检查:
Debug.Print VBA.UserForms.Count
frm.Show
Debug.Print VBA.UserForms.Count
您将看到它不在加载的表单列表中。如果将对象变量设置为Nothing
则它不会执行"正在执行操作">
实际上,声明为ufNyA3
frm
在用户表单卸载后不会变得Nothing
。尝试使用以下IsUserFormLoaded()
函数来检查用户表单是否已加载:
Sub lag_ny_a3()
Dim frm As ufNyA3
Set frm = New ufNyA3
frm.Show
If IsUserFormLoaded("ufNyA3") Then
MsgBox ("Doing stuff")
Unload frm
Else
MsgBox ("Unloaded")
End If
End Sub
Function IsUserFormLoaded(UserFormName As String) As Boolean
Dim frm
For Each frm In UserForms
IsUserFormLoaded = LCase(frm.Name) = LCase(UserFormName)
If IsUserFormLoaded Then Exit For
Next
End Function