我在Excel工作表中有一个按钮,在单击时打开用户窗体。它还隐藏了工作表,使其只能看到用户表单。这就是我必须做到的事情。这很好。
Sub Button2_Click()
Application.Visible = False
frmDataColl.Show
End Sub
然后我的代码没有按照我想要的方式运行。单击X关闭用户窗体后,我希望关闭用户窗体并再次显示Excel。但这只会关闭用户形式。它没有重新考虑工作簿。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Application.Visible = True
End If
End Sub
答案 0 :(得分:2)
摆脱Queryclose事件并将代码更改为:
Sub Button2_Click()
Application.Visible = False
frmDataColl.Show
Application.Visible = True
End Sub
答案 1 :(得分:1)
表单没有了解Application.Visible
州的业务。正如this answer所示,Button2
将其设置为False
,Button2
的工作将其设置回True
。< / p>
您的代码在这里工作得很好 - 问题可能出现在您尚未发布的代码中。保持程序&#39;责任明确,你不会遇到这些问题。
您遇到的另一个常见陷阱(与其他答案一样)是使用有状态默认实例。表格是对象 - 对待它们就好了!
Application.Visible = False
With New frmDataCol1
.Show
' here you still have access to the form's state!
End With
Application.Visible = True
现在,如果您不处理QueryClose
,那么红色&#34; X&#34;按钮有效销毁对象,通常,你绝对不想要那个。
你想要的是自己控制对象的生命 - 这是With
阻止你拥有的东西!
所以你做处理QueryClose
,但只是说&#34; 隐藏表单实例,不要销毁< / em>它!&#34; - 像这样:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True
Me.Hide
End If
End Sub
这样当对话框关闭时,调用代码仍然可以访问公共状态并相应地执行操作。如果你解决了默认实例,让QueryClose
销毁实例会导致状态丢失。而且由于它是默认实例,一旦您查询该状态就会创建一个全新的实例,这使得该bug很难找到...如果您不知道如何具有默认实例的对象。