【问题标题】:Excel VBA application.visible immediately set back to TrueExcel VBA application.visible 立即设置回 True
【发布时间】:2019-04-02 20:37:03
【问题描述】:

我已经设置了一个新的、空的、无模式的用户表单,以用最少的代码解决我的问题。

当打开工作簿时,执行以下代码以隐藏 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

除了“if”子句,Excel 仍然保持可见,当然活动窗口也是如此。

这让我发疯了。 我错过了什么?

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

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

【问题讨论】:

  • 您还有其他工作簿,包括隐藏的工作簿吗?根据帮助,Application.Windows 包括隐藏窗口。
  • 不,没有其他窗口。我从一个新的干净工作簿创建了这个测试文件。没有其他东西是开放的。
  • 你确定没有个人工作簿?
  • 我检查了 ...\AppData\Roaming\Microsoft\Excel\XLSTART 以确保。它和我的银行账户一样空。
  • 哈,我会建议你雇人,但也许不会。尝试剥离所有内容并一次添加一点,然后您应该能够看到它何时损坏。因此,只需从 Workbook Open 代码开始,删除 If 并检查是否有效,等等

标签: excel vba


【解决方案1】:

我发现自己遇到了完全相同的问题 - 使用 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),那么执行将永远不会暂停,并且一旦我们到达 End SubEnd Sub,Excel似乎自己设置了Application.Visible = True

到目前为止,我发现的唯一解决方案是 this one - 基本上,您通过添加无限循环暂停执行,因此 Excel 只有在您摆脱 (Unload/隐藏)之前显示的表单。

我的版本是这样的:

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

    App.Show vbModeless

    While App.Visible
        DoEvents
    Wend
End Sub

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

Private Sub UserForm_Terminate()
    CloseApp
End Sub

Public Sub CloseApp()
    ThisWorkbook.Saved = True

    If Not OtherWorkbooksOpen Then
        Application.Quit
    Else
        ThisWorkbook.Close
    End If
End Sub

Public Function OtherWorkbooksOpen()
    If Application.Workbooks.Count > 1 Then
        OtherWorkbooksOpen = True
    Else
        OtherWorkbooksOpen = False
    End If
End Function

编辑:

Solution without infinite loop - Excel 的计划隐藏:

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

    App.Show
    If Not OtherWorkbooksOpen Then
        Application.OnTime Now + TimeValue("00:00:01"), "HideExcel"
    End If
End Sub

【讨论】:

  • 非常感谢您!这不是解决方案,但我通过您提供的链接找到了它。我只需将我的If Application.Windows.Count &lt;&gt; 1 Then Application.Windows("test.xlsm").Visible = False Else Application.Visible = False End If 放在UserForm_Activate() 下,而不是在工作簿代码中!它现在像我想要的那样工作。再次感谢!也许这也会为您解决问题。使循环变得多余。
【解决方案2】:

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

 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

【讨论】:

  • 感谢您的回答。我更改了订单,但没有解决。 :(
  • 尝试在 showmodal 属性设置为 'True' 的情况下运行上述代码。我猜在您的用户表单中,showmodal 设置为 False。 More info on Show Modal property
  • 如果我将用户表单设置为模态它可以工作,但这对我来说不是一个选项,因为我需要这个工作的项目需要多个用户表单同时打开和编辑。如果我在 modal 上设置任何一个用户窗体,则用户将无法访问其他用户窗体。
【解决方案3】:

不是答案,但我不能将此作为评论发布。这对我有用 - 用户表单出现,应用程序被隐藏。我使用“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

【讨论】:

  • 可悲的是,这对我没有任何帮助。但是,多亏了这一点,我注意到Application.Windows(filename).visible = falseWorkbook_Open 中有效,但Application.Visible = False 无效,或者可能立即回到True
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2018-07-14
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多