VBA Excel 用户表单,显示,隐藏

VBA Excel Userforms, Show, Hide

我有一个关于用户表单实例的问题。

当通过模块中的对象构造用户窗体时(例如 set frm = new Userform2),我可以隐藏它并通过 show 方法恢复它,即使 sub 是 运行 直到结束吗?

假设:

  1. 用户表单由 sub1 创建
  2. 正在向用户表单输入值
  3. 使用 sub2 隐藏用户表单
  4. 通过 sub3 使用 show 方法恢复用户表单的所有值

在模块级别或用户窗体代码上使用显示和隐藏方法测试代码时,我遇到了非常奇怪的行为,但我最终开始工作的是在标准模块中使用全局变量和以下代码:

Global frm As UserForm2
Option Explicit

Sub sub1()
Set frm = New UserForm2
    With frm
        .Show vbModeless
    End With
End Sub

Sub sub2()
    With frm
        .Hide
    End With
End Sub

Sub sub3()
    With frm
        .Show vbModeless
    End With
End Sub

人们常说应该避免使用全局变量。在这里甚至可能吗?我错过了什么吗?

我真正想要的是隐藏用户窗体,但保持实例具有之前设置的所有值。这是我的原始代码,我现在意识到我把事情搞混了,犯了错误。我有一个 "end" 的情况,这迫使 UF 不显示 resp。杀死所有实例。 @Chronocidal: 事实上,我隐藏在用户窗体中的代码中。这是将设置数据从 UF 传输到 sheet 的按钮的一部分。但我认为躲在哪里并不重要? 现在它正在按我的预期工作。感谢大家

Global myfrm As FormFillInformation
Option Explicit

Sub InitUserFormGeneralInformation()
Dim chkfrm As Boolean
chkfrm = CheckFrmIsHidden
If chkfrm = True Then
    myfrm.Show vbModeless
    End '<<<<<========== completely wrong but overseen
Else
    Set myfrm = New FormFillInformation
    myfrm.Show vbModeless

End If

End Sub


Function CheckFrmIsHidden() As Boolean
Dim frm As Object
CheckFrmIsHidden = False
For Each frm In VBA.UserForms
 If frm.Name = "FormFillInformation" Then
    CheckFrmIsHidden = True
 End If
Next
End Function