【问题标题】:Application.Quit command not closing the entire Excel ApplicationApplication.Quit 命令未关闭整个 Excel 应用程序
【发布时间】:2021-01-26 12:24:48
【问题描述】:

我在一个按钮下有以下代码。单击它时,它只会关闭当前的 Excel 工作表,而不是整个 Excel 应用程序。

Application.DisplayAlerts = False
ThisWorkbook.Save
Application.DisplayAlerts = True
Application.Quit

注意:我没有打开任何其他工作表。

以下窗口仍然出现。

【问题讨论】:

  • 能否同时打开多个 Excel 应用程序?
  • 不,我没有打开任何其他工作表
  • 您可以在后台打开工作簿(不可见)。
  • Workbook_BeforeClose() 事件中的任何内容?
  • 检查任务管理器中是否有其他 excel 实例。

标签: excel vba


【解决方案1】:

我遇到了这个问题,我通过输入 Workbook_BeforeClose() 解决了它:

ThisWorkbook.saved = true

【讨论】:

  • 这很可能是答案,因为听起来您有一个未处理的对话框,因此阻止了应用程序退出。这将防止在工作簿关闭期间出现保存对话框。
【解决方案2】:

从例程中删除Application.DisplayAlerts = True

来自Application.Quit Method的帮助:

如果在您使用此方法时打开了未保存的工作簿,Microsoft Excel 会显示一个对话框,询问您是否要保存更改。您可以通过在使用 Quit 方法之前保存所有工作簿或将 DisplayAlerts 属性设置为 False 来防止这种情况发生。当此属性为 False 时,当您退出未保存的工作簿时,Microsoft Excel 不会显示对话框;它退出而不保存它们。

这将避免任何(可能是隐藏的)提示阻止 excel 完全关闭

【讨论】:

  • 我的 Excel 将以只读方式打开,因为它是公共文件。所以我不想要任何提示!我有你的建议,但结果相同。可能这不是我的答案
【解决方案3】:

我遇到了同样的问题,并且能够通过查看多个工作簿是否打开的代码来解决问题...

Application.EnableEvents = False
Application.DisplayAlerts = False
If Application.Workbooks.Count = 1 Then  'Close Excel application
    ThisWorkbook.Save
    Application.Quit
Else                                     'Close the active workbook
    With ActiveWorkbook
        .Close Savechanges:=True
    End With
End If

【讨论】:

  • 谢谢,我遇到了同样的问题,用这段代码解决了
【解决方案4】:

当在子例程中遇到 Application.Quit 时, 它只会留在内存中并继续在它下面运行行 并且实际上会退出,直到遇到“退出子”。 当遇到初级级别的正常“End Sub”时, 然后它也会关闭 Excel。但是说如果工作簿不知何故 在到达“Exit Sub”、“End”或“End Sub”线之前关闭,然后 Excel 不会关闭。

解决方案是创建一个名为 ToQuitNow 的公共变量 具有初始 False 值 并将其更改为 True 您希望 Excel 退出的位置。 并立即测试是否为真,然后返回之前的子级别 按“Exit Sub”或“End”立即退出, 并在每个子程序级别执行相同的操作 预计会从更深的子程序返回。 当它回到初级水平时, 那么最终的“Exit Sub”实际上会终止 Excel。 如果您不希望 Excel 要求保存所做的更改, 在 Application.Quit 之后添加行“ThisWorkbook.Saved = True”, 或在小学级别的最终“退出子”之前 Excel 将退出而不保存。

尝试下面的测试,只需运行“测试”

Public ToQuitNow As Boolean

Sub Test()

ToQuitNow = False ' initialize with False value
Call SecondSub
MsgBox ("Primary level here. Back from SecondSub")
If ToQuitNow = True Then
    Exit Sub 'will actually quit Excel now if True
End If
MsgBox ("This line will not run if ToQuitNow is True")
End Sub

Sub SecondSub()

MsgBox ("SecondSub here")
Call ThirdSub
MsgBox ("SecondSub here. Back from ThirdSub")
If ToQuitNow = True Then
    Exit Sub ' will return to Main level if True
End If
MsgBox ("This line from SecondSub will not run if ToQuitNow is True")
End Sub

Sub ThirdSub()

MsgBox ("ThirdSub here")
Call FourthSub
MsgBox ("ThirdSub here. Back from FourthSub")
If ToQuitNow = True Then
    Exit Sub ' will return to SecondSub if True
End If
MsgBox ("This line from ThirdSub will not run if ToQuitNow is True")
End Sub

Sub FourthSub()

MsgBox ("FourthSub here")
Application.Quit
ThisWorkbook.Saved = True ' Excel will think changes already saved _
and will quit without saving
ToQuitNow = True ' activate Quit
If ToQuitNow = True Then
    MsgBox ("Quit command executed in FourthSub")
    Exit Sub ' will return to ThirdSub if True
    'Can also put in End in above line to quit right away

End If
MsgBox ("This line from FourthSub will not run if ToQuitNow is True.")
End Sub

【讨论】:

    【解决方案5】:

    窗口没有关闭,因为您使用的是personal.xlsb。剪切 Personal.xlsb 并粘贴到另一个位置。

    代替 Personal.xlsb 创建和处理模块。这是一个更好的选择。

    【讨论】:

      【解决方案6】:

      “Application.Quit”之后的“ThisWorkbook.Saved = True”适用于 Excel 2016

      Private Sub Workbook_BeforeClose(Cancel As Boolean)
      
          Application.Quit
          ThisWorkbook.Saved = True
      
      End Sub
      

      【讨论】:

        【解决方案7】:

        我没有尝试过,但也许这会有所帮助:

        https://www.mrexcel.com/forum/excel-questions/606195-vba-application-quit-not-working-me-completly-why.html

        根据 Norie 的说法,您可能不再打开工作簿,因此 Application.Quit 永远不会被执行。

        因此,AlphaFrog 建议这样做:

        Application.DisplayAlerts = False
        
        If Application.Workbooks.Count = 1 Then
        
            Application.Quit
        
        Else
        
            ActiveWorkbook.Close
        
        End If
        

        【讨论】:

          【解决方案8】:

          我使用以下代码干净地关闭了 excel 时遇到了同样的问题:

          Application.DisplayAlerts = False
          ThisWorkbook.Save
          Application.Quit
          

          这将允许 excel 干净地关闭而不保持“幽灵”窗口打开。

          【讨论】:

            【解决方案9】:

            这对我有用:(Office 365)

            Private Sub Workbook_BeforeClose(Cancel As Boolean)
            
            Application.DisplayAlerts = False
            Application.EnableEvents = False
            
            ThisWorkbook.Save
            
            Application.Quit
            ThisWorkbook.Saved = True
            
            End Sub
            

            【讨论】:

              【解决方案10】:

              这是一个奇怪的问题,希望有人会发现这个答案有用。我使用 Excel 2010 (14.0) 遇到了非常相似的问题。我通过实验偶然发现了我的答案。对于一般用途,这是一个不好的答案。

              无论出于何种原因,如果 AccessVBOM 选项未启用,Application.Quit 会静默失败。它不是开箱即用的,可以由您的网络管理员通过 Windows 策略设置/取消设置。

              您可以通过遍历“Excel选项”->“信任中心”->“信任中心设置”->“宏设置”->“信任访问VBA项目对象模型”在GUI中找到该选项。或programmatically

              .

              由于我们都喜欢代码,因此在本示例中,我们从 C# 互操作运行 Excel 并调用退出函数。

              using Excel = Microsoft.Office.Interop.Excel;
              using Marshal = System.Runtime.InteropServices.Marshal;
              
              Excel.Application app = new Excel.Application();
              app.Visible = false;
              app.DisplayAlerts = false;
              
              // this will hang if AccessVBOM is not enabled
              app.Quit();
              Marshal.ReleaseComObject(app);
              

              【讨论】:

              • 此设置与 VBA 中的Application.Quit() 方法无关,它纯粹是为了启用对 VBIDE 和 VBProject 对象模型的访问。 如果无缘无故启用,这可能会很危险,这就是它故意隐藏在设置对话框中的原因。此外,这个问题与 C#.NET 和/或 Office 互操作无关
              【解决方案11】:

              已从 bat 文件中传递了 MacroName 并尝试了以下代码其工作。但我观察到的一件事是,如果我们在 Application.Quit 之前关闭工作簿(ActiveWorkbook.Close),那么它就不起作用了。

              Private Sub Auto_Open()
              Dim strMacroName As String
              strMacroName = 
              VBA.CreateObject("WScript.Shell").Environment("process").Item("MacroName")
              If strMacroName <> "" Then Run strMacroName
              Application.DisplayAlerts = False
              ThisWorkbook.Save
              Application.DisplayAlerts = True
              If strMacroName <> "" Then Application.Quit
              End Sub
              
              Sub Button1_Click()
              MsgBox ("done")
              End Sub
              

              【讨论】:

                【解决方案12】:

                确保您的工作表没有任何外部链接引用,尤其是损坏的链接。

                我为这个问题苦苦挣扎了一个多星期,重写并注释掉了很多代码,试图找出问题所在。今天早上,我终于对工作簿中的所有表格和外部工作表引用进行了审查。我删除了所有不必要的链接和损坏的引用,工作簿现在关闭而不会挂在内存中。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-03-24
                  • 2011-08-06
                  • 1970-01-01
                  • 2016-07-20
                  相关资源
                  最近更新 更多