在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非常难以发现……如果你不知道具有默认实例的对象是如何工作的。