Как пропустить макрос Autoexec при открытии MSAccess из MSAccess?
Итак, у меня есть MSAccess MDB, который должен открывать другие MDB и запускать набор кода, который будет сравнивать два Access MDB, чтобы найти различия в коде, различия в запросах и т. Д. Цель состоит в том, чтобы проверить любой производственный MDB, который не был изменен по сравнению с первоначальным развертыванием.
Моя проблема в том, что многие из этих приложений Access имеют макросы Autoexec, и нет простого способа вызвать.OpenCurrentDatabase без запуска макроса autoexec.
Как я могу просто пропустить макрос, используя CODE?
Я знаю, что могу удерживать клавишу Shift. Я знаю, что могу включить и выключить эту опцию тоже.
5 ответов
Это хитрое решение, но оно работает для меня.
Я делаю DoCmd.DatabaseTransfer acImport Autoexec макроса. Затем я заменяю autoexec на пустой, используя DoCmd.DatabaseTransfer acExport.
Хитрость в том, что экспорт перезапишет
DoCmd.TransferDatabase acImport, "Microsoft Access", sSourcePath, acMacro, "autoexec", "autoexecSource"
DoCmd.TransferDatabase acExport, "Microsoft Access", sSourcePath, acMacro, "autoexecblank", "autoexec"
Я делаю это снова для второго MDB
DoCmd.TransferDatabase acImport, "Microsoft Access", sDestPath, acMacro, "autoexec", "autoexecDest"
DoCmd.TransferDatabase acExport, "Microsoft Access", sDestPath, acMacro, "autoexecblank", "autoexec"
Затем я могу сделать все сравнения для нахождения различий между двумя MDB без запуска макросов autoexec, так как я импортировал их и заменил их
Затем я сравниваю два импортированных макроса и затем экспортирую их обратно в базы данных.
DoCmd.TransferDatabase acExport, "Microsoft Access", sSourcePath, acMacro, "autoexecSource", "autoexec"
DoCmd.TransferDatabase acExport, "Microsoft Access", sDestPath, acMacro, "autoexecDest", "autoexec"
Очевидно, что это решение работает только с использованием VBA в Access, но оно работает.
Надеюсь, это кому-нибудь поможет.
Код, запускаемый при запуске, может быть не в макросе autoexec, он может быть в форме запуска, поэтому вы можете рассмотреть возможность "программного нажатия клавиши Shift" через API:
Другой вариант, если у вас есть доступ для редактирования макросов AutoExec открываемых вами баз данных: установите условие для каждого шага в макросе, которое указывает [Application].[UserControl]
, Если указать это, шаг макроса будет выполняться только в том случае, если пользователь открыл базу данных, а не через автоматизацию. Если для шага макроса уже установлено условие, вы можете просто заключить его в скобки: (old condition) AND [Application].[UserControl]
,
Если у вас нет возможности изменить эти макросы, возможно, вам лучше воспользоваться решением @ChuckB.
Другой вариант: переименуйте макрос autoexec в вашем VB-коде.
OpenCurrentDatabase ("Ваша база данных")
DoCmd. Переименуйте "Autoexec", acMacro, "tmp_Autoexec"
CloseCurrentDatabase
После того, как вы выполнили свое действие, снова переименуйте его в autoexec... et voila....
Это старый вопрос, но другой способ сделать это - использовать аргумент командной строки /cmd и использовать оператор COMMAND при запуске приложения для условного запуска подпрограмм запуска в зависимости от того, был ли предоставлен аргумент /cmd. Это будет работать только при запуске из командной строки, но не через автоматизацию.