7

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

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

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

仍会出现以下窗口。

在此处输入图像描述

4

12 回答 12

7

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

ThisWorkbook.saved = true
于 2014-09-11T14:41:36.197 回答
2

Application.DisplayAlerts = True从例程中删除。

从帮助Application.Quit Method

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

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

于 2013-09-11T17:50:44.557 回答
2

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

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
于 2020-01-24T16:38:24.337 回答
1

当在子程序中遇到 Application.Quit 时,它只会留在内存中并继续运行它下面的行,并且实际上会退出,直到遇到“Exit Sub”。当遇到初级级别的正常“结束子”时,它也会关闭 Excel。但是如果工作簿在到达“Exit Sub”、“End”或“End Sub”行之前以某种方式关闭,那么 Excel 将不会关闭。

解决方案是创建一个名为 ToQuitNow 的公共变量,其初始值为 False,并将其更改为 True,您希望 Excel 退出。并在之后测试是否为真,然后通过“Exit Sub”或“End”返回到先前的Sub 级别立即退出,并在预期从更深的子程序返回的每个子程序级别执行相同操作。当它回到主要级别时,最终的“退出子”实际上将终止 Excel。如果您不希望 Excel 要求保存所做的更改,请在 Application.Quit 之后或 Primary 级别的最终“Exit Sub”之前添加行“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
于 2021-01-24T18:21:44.540 回答
0

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

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Application.Quit
    ThisWorkbook.Saved = True

End Sub
于 2019-03-25T21:15:13.780 回答
0

由于您使用的是personal.xlsb,该窗口不会关闭。剪切 Personal.xlsb 并粘贴到另一个位置。

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

于 2017-12-04T23:38:59.743 回答
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
于 2020-06-23T21:08:18.153 回答
0

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

Application.DisplayAlerts = False
ThisWorkbook.Save
Application.Quit

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

于 2019-10-21T16:49:14.983 回答
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
于 2019-08-12T07:37:05.423 回答
-1

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

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

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

访问VBOM .

由于我们都喜欢代码,因此在此示例中,我们从 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);
于 2016-02-05T22:59:45.507 回答
-1

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

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

于 2017-09-14T13:37:48.963 回答
-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
于 2017-05-12T10:13:29.360 回答