在closures用户窗体时使Excel可见
我有一个Excel工作表中的button,单击时打开一个用户窗体。 它也隐藏了工作表,所以你只能看到用户表单。 这是我必须做到的。 这工作正常。
Sub Button2_Click() Application.Visible = False frmDataColl.Show End Sub
然后我有这个代码不是我想要的方式。 点击Xclosures用户窗体,我想让用户窗体closures,并使Excel再次可见。 但是这只能closures用户窗体。 它不会将工作簿带回到视图中。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Application.Visible = True End If End Sub
摆脱Queryclose事件并将您的代码更改为:
Sub Button2_Click() Application.Visible = False frmDataColl.Show Application.Visible = True End Sub
表单没有关于Application.Visible
状态的业务知识。 正如这个答案所示, Button2
将其设置为False
,这是Button2
的工作,将其设置为True
。
你的代码在这里工作得非常好 – 问题可能在你没有发布的代码中。 保持程序的责任明确,你不会有这些问题。
另一个陷入陷阱的常见陷阱(就像其他答案一样)是使用有状态的默认实例 。 forms是对象 – 就这样对待它们!
Application.Visible = False With New frmDataCol1 .Show ' here you still have access to the form's state! End With Application.Visible = True
现在,如果你不处理QueryClose
,那个红色的“X”button有效地破坏了对象 ,通常你绝对不想这样做。
你想要的是自己控制对象的一生 – 这就是你所拥有的With
块!
所以你处理QueryClose
,但只是说“ 隐藏表单实例,不要摧毁它! – 喜欢这个:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True Me.Hide End If End Sub
这样,当你的对话closures时,调用代码仍然可以访问公共状态并相应地执行。 如果您使用默认实例 ,让QueryClose
销毁实例会导致状态丢失。 而且由于这是一个默认实例 ,所以一旦你查询到这个状态就会创build一个全新的实例 ,使得这个bug非常难以发现……如果你不知道具有默认实例的对象是如何工作的。