Код 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? А оболочка вызывается в фоновом режиме?