我有一个包含多个用户表单的工作簿,可以打开/关闭其他用户表单。以前我是这样硬编码的:
UserForm1.Hide
这就像一个魅力,毫无问题。但现在我尝试使用用户窗体的名称关闭它们。为此,我使用这个函数:
Public Function Close_UserForm(ByVal UserForm_Name As String) As Boolean
PrintSearchHistory "CLOSE", "Close_UserForm()", UserForm_Name
If IsOpen_UserForm(UserForm_Name) = False Then
Close_UserForm = True
PrintSearchHistory "SUCCESS", "Close_UserForm()", UserForm_Name
Exit Function
End If
Dim obj As Object
On Error Resume Next
Set obj = VBA.UserForms.Add(UserForm_Name)
On Error GoTo 0
If obj Is Nothing Then
ErrorShow 0, 10, UserForm_Name
Exit Function
End If
obj.Hide
Close_UserForm = True
PrintSearchHistory "SUCCESS", "Close_UserForm()", UserForm_Name
End Function
PrintSearchHistory 是一个自定义的 Errorhandler,ErrorShow 也是如此 IsOpen_Workbook 检查工作簿是否已关闭,如果是则跳过该函数。
我的问题是 Obj.Hide。
它执行时没有问题,但用户窗体没有任何反应。
我对 Open_UserForm 有相同的函数,唯一的区别是 Obj.Show 而不是 Obj.Hide。该功能有效。
所有用户窗体都是无模式的,并且所有用户窗体都有几个不同的按钮来关闭用户窗体:始终至少有 1 个 X 按钮和 1 个命令按钮。 对于每个用户窗体,我有 1 个函数,所有关闭按钮都会调用该函数。 例如:Booking_UserForm有X-Button和Close_Button,它们调用Close_Booking。 Close_Booking 有用于用户表单处理的特殊函数,作为最后一个函数,它有 Close_UserForm“Booking_UserForm”
Private Sub CloseBooking()
Set_UserFormSettings ConstBooking
ClearBundleArray
Activate_Workbook RMS_Name, Interface_Sheet
Close_UserForm ConstBooking
End Sub
使用 X 按钮可以,但只是因为它在功能完成后关闭 我尝试过的其他事情是:
将 Obj.Hide 移至函数的最后一行。
将 Obj.Hide 替换为:
卸载我
卸载 Obj(使用此方法会通过调用 UserForm_QueryClose->Close_Workbook->UserForm_QueryClose 等导致堆栈溢出)
不确定您想要什么,但为了隐藏所有打开的用户,您可以使用以下代码
Function hideAllUserforms()
Dim frm
' Loop through all open Userforms
For Each frm In VBA.UserForms
frm.Hide
Next frm
End Function