关闭userform时使Excel可见

时间:2017-09-05 14:24:30

标签: excel vba excel-vba

我在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

2 个答案:

答案 0 :(得分:2)

摆脱Queryclose事件并将代码更改为:

Sub Button2_Click()
    Application.Visible = False
    frmDataColl.Show
    Application.Visible = True
End Sub

答案 1 :(得分:1)

表单没有了解Application.Visible州的业务。正如this answer所示,Button2将其设置为FalseButton2的工作将其设置回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很难找到...如果您不知道如何具有默认实例的对象。