Обход Form_Unload или взаимодействие с MsgBox в Access с использованием Python - PullRequest
0 голосов
/ 03 декабря 2018

Я ищу способ в 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.')

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете переключить обходной ключ перед открытием базы данных.

objDBE = win32com.client.Dispatch(r'DAO.DBEngine')
objDB = ojbDBE.OpenDatabase(db)
objDB.Properties[r'AllowBypassKey'] = false
objDB.Close

Затем вы можете открыть его, удерживая нажатой клавишу shift, как и Рене, и затем снова включить обходной ключ.

Открытие через DAO не вызывает макросов или кода VBA.

Обратите внимание, что если ваша единственная цель - перебирать объекты, я рекомендую использовать только DAO и запрашивать объекты MSysObject вместо автоматизации объекта приложения Access.,Это позволяет избежать проблем с запуском кода VBA или макросов AutoExec.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...