VBA Application.Quit命令未关闭整个Excel应用程序

时间:2013-09-11 10:26:08

标签: excel vba excel-vba

我在botton下面有以下代码。当我点击它时,它只关闭当前的Excel工作表,但不关闭整个Excel应用程序。

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

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

通过上面的VBA代码关闭后,仍然会出现以下窗口。 enter image description here

12 个答案:

答案 0 :(得分:4)

我遇到了这个问题,我通过加入Workbook_BeforeClose()

解决了这个问题
ThisWorkbook.saved = true

答案 1 :(得分:1)

从例程中删除Application.DisplayAlerts = True

来自Application.Quit Method的帮助:

  

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

在Excel 2016上运行“ Application.Quit”后,“ ThisWorkbook.Saved = True”

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Application.Quit
    ThisWorkbook.Saved = True

End Sub

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

使用以下代码将Excel完全关闭,我也遇到了同样的问题:

Application.DisplayAlerts = False
ThisWorkbook.Save
Application.Quit

这将使excel完全关闭,而无需保持打开“幽灵”窗口。

答案 7 :(得分:0)

这对我有用:(Office 365)

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Application.DisplayAlerts = False
Application.EnableEvents = False

ThisWorkbook.Save

Application.Quit
ThisWorkbook.Saved = True

End Sub

答案 8 :(得分:0)

当在子程序中遇到 Application.Quit 时, 它只会留在内存中并继续在其下运行行 并且实际上会退出,直到遇到“退出子”。 当遇到普通的初级“End Sub”时, 然后它也会关闭 Excel。但是说如果工作簿以某种方式 在到达“Exit Sub”、“End”或“End Sub”线之前关闭,然后 Excel 不会关闭。

解决方案是创建一个名为 ToQuitNow 的公共变量 初始值为 False 并将其更改为 True 您希望 Excel 退出的位置。 并在之后立即测试以查看是否为真,然后返回上一个子级别 通过“退出子”或“结束”立即退出, 并在每个子程序级别执行相同的操作 预计从更深的子程序返回。 当它回到初级水平时, 那么最终的“退出子”实际上将终止 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

答案 9 :(得分:-1)

这是一个奇怪的,希望有人会发现这个答案很有用。我使用Excel 2010(14.0)遇到了类似的东西。我通过实验偶然发现了我的答案。这是一般用途的坏答案。

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

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

AccessVBOM

由于我们都喜欢代码,在本例中我们从C#interop运行Excel并调用quit函数。

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);

答案 10 :(得分:-1)

已从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

答案 11 :(得分:-1)

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

我在这个问题上挣扎了一个多星期,重写并评论了大量代码以试图找出问题所在。我今天早上在工作簿中最终对所有表格和外部工作表的引用进行了审核。我删除了所有不必要的链接和破坏的引用,现在关闭工作簿而不会挂起内存。