Как пропустить макрос Autoexec при открытии MSAccess из MSAccess? - PullRequest
9 голосов
/ 11 марта 2010

Итак, у меня есть MSAccess MDB, который должен открыть другие MDB и запустить набор кода, который будет сравнивать два Access MDB, чтобы найти различия в коде, различия в запросах и т. Д. Цель состоит в том, чтобы убедиться, что производственный MDB не изменился по сравнению с исходным развертыванием.

Моя проблема в том, что многие из этих приложений Access имеют макросы Autoexec, и нет простого способа вызвать .OpenCurrentDatabase без запуска макроса autoexec.

Как я могу просто пропустить макрос, используя CODE?

Я знаю, что могу удерживать клавишу Shift. Я знаю, что могу включить и выключить эту опцию.

Ответы [ 5 ]

6 голосов
/ 12 марта 2010

Код, запускаемый при запуске, может быть не в макросе autoexec, он может быть в форме запуска, поэтому вы можете рассмотреть возможность «программного нажатия клавиши Shift» через API:

http://www.mvps.org/access/api/api0068.htm

5 голосов
/ 11 марта 2010

Это хитрое решение, но оно работает для меня.

Я делаю 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, но оно работает.

Надеюсь, это кому-нибудь поможет.

2 голосов
/ 30 августа 2011

Другой вариант: переименуйте макрос autoexec в коде VB.

OpenCurrentDatabase ("Ваша база данных")

DoCmd. Переименование "Autoexec", acMacro, "tmp_Autoexec"

CloseCurrentDatabase

После того, как вы выполнили свое действие, снова переименуйте его в autoexec ... эт вуаля ....

2 голосов
/ 26 августа 2010

Другой вариант, если у вас есть доступ для редактирования макросов AutoExec открываемых вами баз данных: установите условие для каждого шага в макросе, которое задает [Application].[UserControl]. Указав это, шаг макроса будет выполняться только в том случае, если пользователь открыл базу данных, а не через автоматизацию. Если для шага макроса уже установлено условие, вы можете просто заключить его в скобки: (old condition) AND [Application].[UserControl].

Если у вас нет возможности изменить эти макросы, возможно, вам лучше воспользоваться решением @ ChuckB.

0 голосов
/ 27 августа 2010

Это старый вопрос, но другой способ сделать это - использовать аргумент командной строки / cmd и использовать оператор COMMAND при запуске приложения для условного запуска подпрограмм запуска в зависимости от того, был ли предоставлен аргумент / cmd. Это будет работать только при запуске из командной строки, но не через автоматизацию.

...