Excel VBA application.visible立即设置回True

时间:2019-03-22 14:45:20

标签: excel vba

我建立了一个新的,空的,无模式的用户窗体,以最少的代码来解决我的问题。

对于打开工作簿时,将执行以下代码以隐藏Excel并显示用户窗体。这是工作簿的唯一代码。

Private Sub Workbook_Open()
    UserForm1.Show
    If Application.Windows.Count <> 1 Then
        Application.Windows("test.xlsm").Visible = False
    Else
        Application.Visible = False
    End If
End Sub

我有一个只有一个按钮的空用户表单。此用户表单的唯一代码是:

Private Sub CommandButton1_Click()
    Application.Windows("test.xlsm").Visible = True
    Application.Visible = True
Unload Me
End Sub

最后一件事情是第一个工作表上的按钮,以启动与打开工作簿时相同的过程。其代码:

Sub Button1_Click()
    UserForm1.Show
    If Application.Windows.Count <> 1 Then
        Application.Windows("test.xlsm").Visible = False
    Else
        Application.Visible = False
    End If
End Sub

现在我的问题是: 当我打开工作簿时,会显示用户窗体,但是excel和活动窗口也保持可见。但是,如果我单击工作表上的按钮,Excel或窗口将被隐藏。此外,加载所有内容后,Excel(而不是用户窗体)将具有焦点。

我第一次运行此程序,效果很好。我怀疑在编辑器中更改ShowModal设置会以某种方式使它搞砸,但这只是我的猜测。无论如何,无论现在的模式设置如何,它都无法按预期工作。

如果我刚跑步

Application.Visible = False

Excel仍然保持可见状态,而不是“ if”子句,活动窗口当然也保持可见状态。

这真让我发疯。 我想念什么?

编辑:链接到我的测试文件:Test File on my Dropbox 可能必须启动两次,因为当宏在启动时被阻止并且仅在excel完全加载后才被激活时,代码才能按预期工作。

编辑:我能够在excel 2010电脑上对此进行测试,并且该问题不存在。因此,这可能与更新的Office Apps处理内容的方式有关。

4 个答案:

答案 0 :(得分:0)

我认为在执行if语句后需要调用userform1.show。

 Private Sub Workbook_Open()
    If Application.Windows.Count <> 1 Then
        Application.Windows("test.xlsm").Visible = False
    Else
        Application.Visible = False
    End If
    UserForm1.Show
End Sub

答案 1 :(得分:0)

不是答案,但是我不能发表评论。这对我有用-用户表单出现,应用程序被隐藏。我有个人工作簿,因此使用了“ <> 2”。你能确认会发生什么吗?

 Private Sub Workbook_Open()
    If Application.Windows.Count <> 2 Then
        Application.Windows("test.xlsm").Visible = False
    Else
        Application.Visible = False
    End If
    UserForm1.Show False
End Sub

答案 2 :(得分:0)

我遇到了同样的问题,但是我注意到在excel文件之前加载了表单。因此,我将冗余形式称为application.visible = false。 基本上,在单击表单中的任何内容后,它将调用application.visible = false,并且excel窗口将隐藏。

答案 3 :(得分:0)

我发现自己也遇到了同样的问题-使用Workbook_Open()事件打开的无模式表单也应该隐藏excel应用程序(在Excel 2016上运行,32位)。

使用 UserForm 属性 ShowModal 设置为 True 的原因是:the execution is suspended - it's waiting for user to interact with the UserForm that was shown.

如果我们将 ShowModal 更改为 False (或调用UserForm.Show vbModeless),则执行将永远不会暂停,并且一旦我们到达{ {1}},Excel似乎自行设置了End Sub

到目前为止,我发现的唯一解决方案是this one-基本上,您通过添加无限循环来暂停执行,因此,一旦您摆脱(卸载/隐藏)以前显示的表格。

我的版本如下:

Workbook_Open()

然后只是要确保在关闭无模式 UserForm 后关闭Excel,我添加了以下内容:

Application.Visible = True

编辑:

Solution without infinite loop-计划隐藏Excel:

Private Sub Workbook_Open()
    Dim App As Object
    Set App = startMenu

    App.Show vbModeless

    While App.Visible
        DoEvents
    Wend
End Sub