Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 第二次启动表单后,UserForm关闭按钮失败_Excel_Excel 2010_Userform_Vba - Fatal编程技术网

Excel 第二次启动表单后,UserForm关闭按钮失败

Excel 第二次启动表单后,UserForm关闭按钮失败,excel,excel-2010,userform,vba,Excel,Excel 2010,Userform,Vba,我有一个UserForm,a,带有一个命令按钮,使用以下代码打开UserFormB: 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上的关闭按钮停止工作 UserFormA是一个菜单表单,它会导致

我有一个
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链接的每种形式,以及从A打开的第三种形式,这种行为都是可复制的

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


有人知道这方面的信息吗?也许是我的谷歌fu不够,但我似乎找不到有同样问题的人。非常感谢在此阶段的任何意见

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

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

在用户窗体关闭之前发生

在释放表单之前,您需要能够控制重新激活
UserForm1

Terminate
事件略有不同:

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

在下面的示例代码中,我通过引用
UserForm2
和处理
QueryClose
获得了正确的行为

在这个示例代码中,我使用的是
UserForm1
UserForm2
,但您可以在应用程序中替换
A
B

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

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

在用户窗体关闭之前发生

在释放表单之前,您需要能够控制重新激活
UserForm1

Terminate
事件略有不同:

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

在下面的示例代码中,我通过引用
UserForm2
和处理
QueryClose
获得了正确的行为

在这个示例代码中,我使用的是
UserForm1
UserForm2
,但您可以在应用程序中替换
A
B

UserForm1中的代码: UserForm2中的代码:
谢谢你,罗宾,我现在就开始实施。奇怪的是,在提问之后的这段时间里,我关闭了每个表单中的所有queryclose事件,转而使用按钮——仍然体验着同样的行为!在显示下一个表单之前,我一直在使用“Unload Me”,因为似乎只要我“.Show”一个表单,该过程就会停止执行,而控件就会屈服于显示的表单。显示新表单后,它将从“.Show”(或“Unload Me”)继续执行。我注意到您在“卸载”之前调用了“.Show”-这对您来说是否同样有效?谢谢Robin,现在将尝试实现它。奇怪的是,在提问之后的这段时间里,我关闭了每个表单中的所有queryclose事件,转而使用按钮——仍然体验着同样的行为!在显示下一个表单之前,我一直在使用“Unload Me”,因为似乎只要我“.Show”一个表单,该过程就会停止执行,而控件就会屈服于显示的表单。显示新表单后,它将从“.Show”(或“Unload Me”)继续执行。我注意到你在“卸载”之前先调用“.Show”-这对你来说也一样吗?
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
Option Explicit

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