Команда VBA Application.Quit не закрывает все приложение Excel

У меня есть следующий код под дном. Когда я щелкнул по нему, он просто закрывает текущий лист Excel, но не закрывает все приложение Excel.

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

Примечание: у меня нет других открытых листов

следующее окно по-прежнему появляется после закрытия вышеуказанного кода VBA.

13 ответов

У меня была эта проблема, и я решил ее, поместив в Workbook_BeforeClose():

ThisWorkbook.saved = true

У меня возникла та же проблема, и я смог решить ее с помощью кода, который проверяет, открыты ли несколько книг или нет...

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

Когда Application.Quit встречается в подпрограмме, он остается только в памяти и продолжает выполнять строки под ним и фактически завершает работу до тех пор, пока не встретит «Exit Sub». Когда встречается обычный «End Sub» на основном уровне, он также закрывает Excel. Но скажем, если рабочая книга каким-то образом закрывается до достижения строки «Exit Sub», «End» или «End Sub», Excel не закроется.

Решение состоит в том, чтобы создать общедоступную переменную с именем ToQuitNow с начальным значением False и изменить ее на True там, где вы хотите закрыть Excel. и проверьте сразу после этого, чтобы убедиться, что это правда, затем вернитесь на предыдущий подуровень с помощью «Exit Sub» или «End», чтобы выйти сразу, и сделайте то же самое на каждом уровне подпрограммы, где ожидается возврат из более глубокой подпрограммы. Когда он вернется на основной уровень, последний «Exit Sub» фактически закроет Excel. Если вы не хотите, чтобы Excel запрашивал сохранение внесенных изменений, добавьте строку «ThisWorkbook.Saved = True» сразу после Application.Quit или перед последним «Exit Sub» на начальном уровне, и 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

Удалить Application.DisplayAlerts = True от рутины.

от помощи для Application.Quit Method:

Если при использовании этого метода открыты несохраненные книги, Microsoft Excel отображает диалоговое окно с вопросом, хотите ли вы сохранить изменения. Это можно предотвратить, сохранив все книги перед использованием метода Quit или установив для свойства DisplayAlerts значение False. Если это свойство имеет значение False, Microsoft Excel не отображает диалоговое окно при выходе из несохраненных книг; он выходит без сохранения их.

Это предотвратит любые (возможно скрытые) запросы от остановки полного закрытия Excel

Я не пробовал, но, возможно, это поможет:

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

Согласно Нори, у вас могут не быть открытых книг, поэтому Application.Quit никогда не будет выполнен.

Поэтому AlphaFrog предлагает следующее:

Application.DisplayAlerts = False

If Application.Workbooks.Count = 1 Then

    Application.Quit

Else

    ActiveWorkbook.Close

End If

Окно не закрывается, потому что вы используете personal.xlsb. Вырежьте Personal.xlsb и вставьте в другое место.

Вместо Personal.xlsb создайте и работайте над модулями. Это лучший вариант.

У меня была такая же проблема, используя следующий код, закрытый Excel чисто:

Application.DisplayAlerts = False
ThisWorkbook.Save
Application.Quit

Это позволит excel аккуратно закрыть, не оставляя открытым "призрачное" окно.

Это сработало для меня: (Office 365)

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Application.DisplayAlerts = False
Application.EnableEvents = False

ThisWorkbook.Save

Application.Quit
ThisWorkbook.Saved = True

End Sub

"ThisWorkbook.Saved = True" after "Application.Quit" works on Excel 2016

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Application.Quit
    ThisWorkbook.Saved = True

End Sub

Вы можете использовать это

      Application.DisplayAlerts = False     
Application.Quit

Но для этого слова не используйте это

      ActiveWorkbook.Close
ThisWorkbook.Close

Убедитесь, что на ваших листах нет ссылок на внешние ссылки, особенно на неработающие ссылки.

Я боролся с этой проблемой более недели, переписывая и комментируя много кода, чтобы попытаться изолировать проблему. Сегодня утром я наконец-то сделал обзор всех ссылок на таблицы и внешние листы в своей рабочей тетради. Я удалил все ненужные ссылки и неработающие ссылки, и рабочая тетрадь теперь закрывается без зависания в памяти.

Это странно, надеюсь, кто-то найдет этот ответ полезным. Я столкнулся с чем-то очень похожим, используя Excel 2010 (14.0). Я наткнулся на свой ответ через эксперименты. Это плохой ответ для общего назначения.

По какой-либо причине Application.Quit молча завершается сбоем, если опция AccessVBOM не включена. Он не включен "из коробки" и может быть установлен / отменен вашим сетевым администратором с помощью политики Windows.

Вы можете найти эту опцию в графическом интерфейсе, пройдя "Параметры Excel" -> "Центр управления безопасностью" -> "Настройки центра управления безопасностью" -> "Настройки макроса" -> "Доверительный доступ к объектной модели проекта VBA". Или программно.

AccessVBOM,

Поскольку мы все любим код, в этом примере мы запускаем Excel из взаимодействия C# и вызываем функцию выхода.

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

Перешли MacroName из bat-файла и попробовали приведенный ниже код. Но я заметил одну вещь: если мы закрываем книгу (ActiveWorkbook.Close) перед Application.Quit, то она не работает.

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
Другие вопросы по тегам