Код VBA для закрытия базы данных доступа, не оставляя оболочку приложения открытой

Я сейчас пользуюсь Application.Quit которая оставляет оболочку приложения MS Access открытой.

После обработки вызывающей функции по отношению к целевому приложению у меня остается каждый экземпляр приложения, оставшийся открытым; даже если конкретный экземпляр базы данных закрыт.

Как сделать так, чтобы окно приложения "shell" базы данных закрывалось программно с помощью VBA?

Вот пример того, как создается переменная и как я ее закрываю:

Dim appAccess As New Access.Application

' Do stuff here...

appAccess.CloseCurrentDatabase

7 ответов

Решение

Вам необходимо выполнить Application.Quit для переменной экземпляра.

Например,

Dim appAccess As New Access.Application

' Do stuff here...

appAccess.Application.Quit

Согласно документации: Application.Quit делает то же самое, что и DoCmd.Quit. а именно

Метод Quit завершает работу Microsoft Access. Вы можете выбрать один из нескольких вариантов сохранения объекта базы данных перед выходом.

Вы можете попробовать вызвать любой из них с параметром acQuitSaveNone или 2, которая "выходит из Microsoft Access без сохранения каких-либо объектов". После дальнейшего просмотра используйте Application.Quit как DoCmd.Quit был добавлен для обеспечения обратной совместимости для Access 95 (см. примечания к методу Quit, поскольку он применяется к объекту DoCmd.) Выполнение любого из этих действий все равно должно выполнять автоматическое сжатие при закрытии, если у вас есть разрешения, которые могут быть причиной вашей оболочки.

Если это не работает для вас, вот несколько крайнее предложение. Сохраните это как файл vbscript и вызовите его, как только вы закончите с Access. Это завершит все процессы MSAccess на вашем компьютере с Windows без сжатия и восстановления.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("SELECT * FROM Win32_Process WHERE Name = 'msaccess.exe'")
For Each objProcess in colProcessList
    objProcess.Terminate()
Next

Чтобы вызвать скрипт, заменив [vbspath] на фактический путь. Если в пути есть пробелы, обязательно используйте двойные кавычки и поместите его в кавычки:

shell "cscript [vbspath]"

Я всегда использую DoCmd.Quit acQuitSaveAll,
Это работает по крайней мере в Access 2000, 2003 и 2010 (вот где я видел это работает).

Access.Quit работает для меня. Может быть, попробовать это вместо Application.Quit?

Если это не помогло, ваша проблема может быть в другом месте, в этом случае, пожалуйста, расскажите нам больше об этом проекте.

DoCmd.Quit acQuitSaveAll, наконец-то сработало. Я пробовал все другие варианты раньше, и оболочка все еще зависала.

Переключите форму в режим конструктора. Установить форму BorderStyle собственность на None, В меню Вид выберите Вид формы. Обратите внимание, что строка заголовка формы полностью удалена.

Вы имеете в виду, что после видимого завершения окно оболочки cmd.exe остается открытым, а процесс MSACCESS.EXE работает в фоновом режиме в TaskList? А оболочка вызывается в фоновом режиме?

Другие вопросы по тегам