Я ищу способ в Python закрыть форму без выполнения кода в Form_Unload или способ щелкнуть OK на MsgBox, выданном с использованием Access VBA.
Я пытаюсь выполнить некоторую автоматизациюи создание сценариев для большого количества БД Access с использованием Python, однако я столкнулся с проблемой с нашей конкретной настройкой Access.В наших базах данных (как и в большинстве клиентских приложений Access) AllowSpecialKeys и AllowBypassKeys отключены.Однако, если вы являетесь членом нашей группы администраторов, форма загружается с использованием макроса AutoExec при входе в базу данных.Когда эта форма закрывается, она спрашивает, хотите ли вы снова включить эти свойства или не использовать VB Yes / No MsgBox.Это позволяет нам разблокировать базы данных и выполнить обслуживание, а затем снова заблокировать их для развертывания.
Я могу войти в базу данных с помощью Python, собрать всю необходимую информацию и затем вернуться из базы данных.Проблема заключается в том, что когда я выхожу из базы данных с помощью Python, при вызове CloseCurrentDatabase форма выгружается, и появляется всплывающее окно.Я тогда не могу обращаться с MsgBox.Кто-нибудь знает, как закрыть MsgBox или закрыть форму, не выполняя событие unload формы?Если нет, мы могли бы изменить форму безопасности, чтобы в ней были кнопки блокировки и разблокировки, а не закрывать, но нам пришлось бы выталкивать изменения в большое количество баз данных, так что это было бы сложно.
Чтобы воспроизвести среду, в которой я работаю, создайте форму в базе данных Access.Под событием Form_Unload добавьте вызов MsgBox в VBA.Затем создайте макрос Access с именем AutoExec и откройте форму.Это приведет к открытию формы при открытии базы данных и при закрытии БД, эта форма закроется, вызывая всплывающее окно.
Ниже приведен мой код Python.Заранее благодарим за любую помощь.
#libraries
import win32com.client
#set the DB
db = r'FILE PATH REMOVED - REPLACE THIS STRING WITH FILE PATH'
#use Access com object
objAccess = win32com.client.Dispatch(r'Access.Application')
#open Access DB
objAccess.OpenCurrentDatabase(db, False)
#error handler
try:
#loop through forms and print them
for form in objAccess.CurrentProject.AllForms:
print(form.name)
del form
#loop through reports and print them
for report in objAccess.CurrentProject.AllReports:
print(report.name)
del report
#loop through macros and print them
for macro in objAccess.CurrentProject.AllMacros:
print(macro.name)
del macro
#loop through modules and print them
for module in objAccess.CurrentProject.AllModules:
print(module.name)
del module
#cleanup
finally:
#close database and access
objAccess.CloseCurrentDatabase
objAccess.Quit(2)
del objAccess
#note cleanup completion for testing
print('Cleanup completed.')
#note code completion for testing
print('All done.')