【问题标题】:UserForm Close button fails after form launched for second time表单第二次启动后用户表单关闭按钮失败
【发布时间】:2017-05-26 05:06:12
【问题描述】:

我有一个UserForm,A,带有一个命令按钮,使用以下代码打开UserForm B:

Private Sub cmd_click()
    Me.Hide
    B.Show
End Sub

B,当通过 X 按钮关闭时,运行以下内容:

Private Sub UserForm_Terminate()
    Unload Me
    A.Show
End Sub

之后:

  • 打开 B(从 A)
  • 关闭B并返回A
  • 然后再次打开 B

B 上的关闭按钮停止工作。

UserForm A 是一种菜单形式,可以通向其他几种形式,因此在菜单之间来回导航是一项非常基本的要求。对于从 A 链接的每个表单以及从这些表单打开的三级表单,此行为都是可重现的。

鉴于我的目标人群是老一代,我希望我的 UserForms 使用起来直观,这意味着保留常规的关闭按钮功能。

有人知道这方面的信息吗?可能是缺少我的 google-fu,但我似乎找不到遇到同样问题的人。非常感谢此阶段的任何输入!

【问题讨论】:

    标签: excel excel-2010 userform vba


    【解决方案1】:

    在第一个表单中使用变量来引用第二个Userform,因为这可以让您更好地控制第二个表单状态 - 您可以在关闭第二个表单并返回到实例化它的事件处理程序后取消设置变量首先。这保证了每次您单击按钮启动 UserForm2 时,您都在使用“新副本”。

    您还应该使用QueryClose 事件 - 请参阅MSDN。本次活动:

    在用户窗体关闭之前发生

    您需要能够在处理表单之前控制UserForm1 的重新激活。

    Terminate 事件略有不同:

    当通过将引用对象的所有变量设置为 Nothing 来从内存中删除对对象实例的所有引用时或当对该对象的最后一个引用超出范围时发生。

    在下面的示例代码中,我使用对UserForm2 的引用和处理QueryClose 得到了正确的行为。

    在此示例代码中,我使用的是 UserForm1UserForm2,但您可以在您的应用中替换 AB

    UserForm1中的代码:

    Option Explicit
    
    Private m_frm2 As UserForm2
    
    Private Sub CommandButton1_Click()
    
        Me.Hide
        Set m_frm2 = New UserForm2
        m_frm2.Show
        Set m_frm2 = Nothing
    
    End Sub
    

    UserForm2中的代码:

    Option Explicit
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        UserForm1.Show
        Unload Me
    End Sub
    

    【讨论】:

    • 感谢 Robin,现在将尝试实现此功能。奇怪的是,在问我的问题之后,我已经关闭了每个表单中的所有 queryclose 事件并切换到使用按钮 - 仍然遇到相同的行为!在显示我的下一个表单之前,我一直在使用“卸载我”,因为似乎只要我“.Show”一个表单,该过程就会停止执行,而是控制让给显示的表单。显示新表单后,它会从“.Show”(或“Unload Me”)继续执行。我注意到您在“卸载”之前调用了“.Show” - 这对您来说是否同样有效?
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多