Как обойти макрос MSAccss AutoExec и обойти форму запуска
Как обойти макрос MSAccess autoexec и форму запуска для глубокого обновления кода большого приложения MS Access 2003 с сотнями форм и отчетов?
Проект предусматривает обновление до Access 2016, 2019 или 365.
Это критически важная система, которая держится на костылях в течение 15 лет без каких-либо обновлений кода VBA.
- Файлы в приложении
- Несколько файлов MSAccess в формате MDB и ACCDB
- Нет файлов MSAccess в форматах MDE или ACCDE со скомпилированным кодом VBA
- Нет MSAccess других файлов, таких как файлы безопасности mdw
- Я запускаю команду dos для базы данных - PATH_TO_MSACCESS.exe DB_NAME.mdb
- Я использую 32-разрядную версию MSAccess.exe из Office 365.
- Обратите внимание, что при запуске на 64-битном MSAccess.exe возникают ошибки совместимости и компилятора VBA, если VBA вызывает методы Win32 API операционной системы Windows. Это приложение вызывает несколько (5) вызовов API Win32. Технически, 64-битный MS Access будет обрабатывать некоторые 32-битные данные, отправленные / возвращенные из Win32 API, как 64-битные, вызывающие ошибки.
Самая трудная часть заключается в том, что многие веб-страницы и почти все связанные с этим страницы Microsoft были удалены из Интернета.
Вот что я пробовал и на какие ссылки смотрел.
- Пробовал но не получилось
- Удерживание клавиши Shift при открытии базы данных MSAccess
- Нажатие F11 открывает панель навигации в Access (не открывается). Если открывается панель навигации, я мог бы отредактировать макрос AutoExec или код Form_Open формы запуска.
Текущий статус:
- Приложение работает нормально на машине с версией MS Access до 2016 года.
- Это не удается несколькими способами, если на машине установлен только 32-разрядный MS Access 365/2019.
- Я нахожу и исправляю такие вещи, как неправильные записи файла конфигурации, неправильный путь установки и т. Д., Но мне нужно отладить код запуска VBA и загрузку начальной формы в отладчике VBA.
- Я не могу войти в отладчик VBA в первой строке макроса AutoExec или запустить функцию Form_Open формы
- Я нахожу и исправляю такие вещи, как неправильные записи файла конфигурации, неправильный путь установки и т. Д., Но мне нужно отладить код запуска VBA и загрузку начальной формы в отладчике VBA.
- Проект заключается в обновлении до 32-разрядной версии MS Access для Office 365 (предположительно такой же, как автономный MS Access 2019).
Много гуглил и некоторые варианты.
Access 2007: открытие базы данных MS-Access из командной строки без запуска кода запуска vba? Удерживайте нажатой клавишу Shift при открытии базы данных MDB
Access XP База данных открытого доступа без выполнения скриптов или форм
- Удерживайте нажатой клавишу Shift при открытии базы данных Access
- Удалить макрос AutoExec
- Удалить настройку формы запуска из базы данных
Access 2007: имитация нажатия клавиши SHIFT при использовании VBA для открытия базы данных доступа ms, защищенной файлом mdw?
- Немного другой случай, когда база данных Access защищена файлом MDW
- Те же ответы
Доступ к XP/2003/2007? Как пропустить макрос Autoexec при открытии MSAccess из MSAccess?
- Метод первый:
- Исходный URL-адрес мертв, машина Internet Archive Wayback имеет архивную копию: https://web.archive.org/web/20101204113950/http://www.mvps.org/access/api/api0068.htm
- Отправить клавишу Shift в Access через код, чтобы обойти запуск макроса, если [AllowbypassKey] не установлен
- Метод второй:
- Извлеките макрос Autoexec из базы данных, замените его пустым макросом AutoExec
- Использует DoCmd.DatabaseTransfer acImport и DoCmd.DatabaseTransfer acExport
- Метод третий:
- Переименуйте макрос AutoExec, используя код VBA
- OpenCurrentDatabase ("Ваша база данных")
- DoCmd.Переименуйте "Autoexec", acMacro, "tmp_Autoexec"
- CloseCurrentDatabase
Сокращения клавиатуры MS Access для доступа к коду VBA или объектам в базе данных Access. С https://support.microsoft.com/en-us/office/keyboard-shortcuts-for-access-70a673e4-4f7b-4300-b8e5-3320fa6606e2
- F2 - переключение между режимом редактирования (с отображаемой точкой вставки) и режимом навигации в режиме таблицы или конструктора.
- F4 - открыть панель свойств объекта
- F5 - переключиться в представление формы из представления конструктора формы
- F6 - переключаться между панелями в интерфейсе MS Access
- F10 (?) Показать ленту
- F11 - показать или скрыть панель навигации
- Alt-X, Alt-X,1 - открыть вкладку Внешние данные на ленте.
- Alt-Y - открыть вкладку Инструменты базы данных на ленте.
- Alt-J,T - открыть вкладку Таблица на ленте.
- Alt-X,2 - открыть вкладку надстроек на ленте.
- Control-F1 - развернуть / свернуть ленту
- Alt-F11 - переключение в / из редактора VBA
7 ответов
Еще что проверить? Вы используете ярлык? если в нем есть переключатель /runtime, то клавиша shift будет игнорироваться. НЕ ВАЖНО, что вы делаете, и даже если нет кода обхода клавиши shfit (для отключения), клавиша shift означает, что клавиша shift ВСЕ ЕЩЕ игнорируется. Итак, вы хотите убедиться, что вы не запускаете / не используете ярлык.
вы также хотите проверить / убедиться / узнать / знать, имеет ли приложение безопасность рабочей группы. Опять же, в 99 из 100 случаев ярлык покажет это.
Далее: это файл mdb или mde? Файл mde - это скомпилированная версия. Исходного кода не существует, и вы не можете изменить файл mde. Итак, еще раз убедитесь, что у вас есть файл mdb для внешнего интерфейса, а не mde. Если у вас нет этого mdb, то у вас большие проблемы - у вас нет исходного кода.
У вас есть вся эта информация в вашем посте, но вы не учитываете самые важные вопросы. Итак, это mde или mdb? Вы должны это знать. Указывается ли в ссылке файл безопасности рабочей группы (mdw), который обычно используется для запуска приложения. Если задействована безопасность рабочей группы, то используемый вами идентификатор входа в систему может помочь вам пройти мимо клавиши Shift, но тогда этому пользователю, возможно, не были предоставлены права разработки, поэтому в этот момент обход ключа shify будет бесполезен для входа в код.
Я имею в виду, запустите свою копию доступа 2016 или что-то еще. Затем попробуйте импортировать объекты из этой базы данных. Таким образом, вам не придется использовать ключ shfit или беспокоиться о нем, а просто импортировать формы, отчеты и код в новую свежую базу данных.
Итак, еще один вопрос: не беспокойтесь о запуске приложения - создайте новую пустую базу данных, а затем импортируйте из существующей - вы можете это сделать? (при этом НЕ копируется установка клавиши Shift исходной базы данных).
Командная строка MSAccess позволяет указать, какой макрос следует выполнить при запуске.
Я запустил следующую командную строку cmd.exe, которая генерирует несколько ошибок и позволяет вам войти в базу данных Access с помощью навигатора и войти в код VBA. Не лучшее решение, но одна возможность.
MSAccess.exe DB /X ADEEERETDEREAR
DB - это полный путь к базе данных Access. ADEERETDEREAR - это макрос, которого не существует.
Доступ 2010?
- Сбросить форму запуска до нуля в коде VBA
- Код 2012 года находится здесь: https://www.tek-tips.com/viewthread.cfm?qid=1673392
Четвертый способ, как указано выше
Более полный пример с той же страницы.
- Код 2012 года находится здесь: https://www.tek-tips.com/viewthread.cfm?qid=1673392
Public Sub GetCBs()
Dim db As DAO.Database
Dim strPath As String
Dim startUpform As String
Dim app As Access.Application
Dim custBars As Collection
Dim custShortCutBars As Collection
Dim custNonShortCutBars As Collection
Dim i As Integer
Dim blnAutoexec As Boolean
strPath = GetOpenFile()
'Get the db without opening in application
Set db = getDb(strPath)
'Get startupform
startUpform = getStartUp(db)
'Turn off the start up form
TurnOffStartUp db
'Check for and auto exec. If exists import and replace
If hasAutoexec(db) Then
blnAutoexec = True
ImportAutoExec (strPath)
End If
Set app = New Access.Application
'Open safely
app.OpenCurrentDatabase (strPath)
'Read command bars
Set custBars = getCustBars(app)
Set custShortCutBars = getCustShortCutBars(app)
Set custNonShortCutBars = getCustNonShortCutBars(app)
app.CloseCurrentDatabase
Set db = app.CurrentDb
Set db = getDb(strPath)
'Return start up form
TurnOnStartUp db, startUpform
db.Close
'Return auto exec
If blnAutoexec Then
ReturnAutoExec (strPath)
End If
Debug.Print "all custom bars:"
'All bars
For i = 1 To custBars.Count
Debug.Print custBars(i)
Next i
'Do something with the command bars
Debug.Print "all shortcut bars:"
'Short cut only
For i = 1 To custShortCutBars.Count
Debug.Print custShortCutBars(i)
Next i
'Not short cut
Debug.Print "Non shortCut"
For i = 1 To custNonShortCutBars.Count
Debug.Print custNonShortCutBars(i)
Next i
End Sub
Public Function getDb(strPath As String) As DAO.Database
Set getDb = DBEngine(0).OpenDatabase(strPath)
End Function
Public Function getCustBars(app As Access.Application) As Collection
' all bars
Dim col As New Collection
Dim cb As Object
For Each cb In app.CommandBars
If cb.BuiltIn = False Then
col.Add (cb.Name)
End If
Next cb
Set getCustBars = col
End Function
Public Function getCustShortCutBars(app As Access.Application) As Collection
' only short cut bars
Dim col As New Collection
Dim cb As commandbar
For Each cb In app.CommandBars
If cb.BuiltIn = False Then
If cb.Type = msoBarTypePopup Then
col.Add (cb.Name)
End If
End If
Next cb
Set getCustShortCutBars = col
End Function
Public Function getCustNonShortCutBars(app As Access.Application) As Collection
' Menu bars that are not shortcut bars
Dim col As New Collection
Dim cb As commandbar
For Each cb In app.CommandBars
If cb.BuiltIn = False Then
If cb.Type <> msoBarTypePopup Then
col.Add (cb.Name)
End If
End If
Next cb
Set getCustNonShortCutBars = col
End Function
Public Function getStartUp(db As DAO.Database) As String
Dim prp As DAO.Property
For Each prp In db.Properties
If prp.Name = "startupform" Then
getStartUp = prp.Value
Exit For
End If
Next
End Function
Public Sub TurnOffStartUp(db As DAO.Database)
Dim prp As DAO.Property
For Each prp In db.Properties
If prp.Name = "startupform" Then
prp.Value = "(None)"
Exit For
End If
Next
End Sub
Public Sub TurnOnStartUp(db As DAO.Database, strFrm As String)
Dim prp As DAO.Property
For Each prp In db.Properties
If prp.Name = "startupform" Then
prp.Value = strFrm
Exit For
End If
Next
End Sub
Public Sub ImportAutoExec(strPath As String)
On Error GoTo errLbl
DoCmd.TransferDatabase acImport, "Microsoft Access", strPath, acMacro, "AutoExec", "AutoExecBackup"
DoCmd.TransferDatabase acExport, "Microsoft Access", strPath, acMacro, "TempAutoExec", "AutoExec"
Exit Sub
errLbl:
If Err.Number = 7874 Then
Debug.Print "Auto Exec macro does not exist"
Else
MsgBox Err.Number & " " & Err.Description
End If
End Sub
Public Sub ReturnAutoExec(strPath As String)
On Error GoTo errLbl
DoCmd.TransferDatabase acExport, "Microsoft Access", strPath, acMacro, "AutoExecBackup", "AutoExec"
DoCmd.DeleteObject acMacro, "AutoExecBackup"
Exit Sub
errLbl:
If Err.Number = 7874 Then
Debug.Print "Auto Exec macro does not exist"
Else
MsgBox Err.Number & " " & Err.Description
End If
End Sub
Public Function hasAutoexec(db As DAO.Database) As Boolean
Dim rs As DAO.Recordset
Dim strSql As String
strSql = "SELECT MSysObjects.Name FROM MSysObjects WHERE MSysObjects.Name = 'AutoExec' AND MSysObjects.Type = -32766"
Set rs = db.OpenRecordset(strSql)
If Not (rs.EOF And rs.BOF) Then
hasAutoexec = True
End If
End Function
Я не пробовал импортировать объекты Access в новую базу данных. (Спасибо Альберту Каллалу за информацию)
Это позволило бы мне взглянуть на код VBA. Он может не работать в качестве замены исходной базы данных со всеми внутренними настройками базы данных.
Как импортировать объекты Access из другой базы данных Access:https://support.microsoft.com/en-us/office/import-database-objects-into-the-current-access-database-23aea08b-7487-499d-bdce-0c76bedacfdd
- Шаги Access 365 (вероятно, работает для Access 2016)
- Вкладка "Внешние данные" на ленте
- Щелкните Новый источник данных -> Из базы данных -> Доступ в группе ленты Импорт и ссылка.
- Получить внешние данные - отображается окно базы данных Access
- Найдите файл MDB или ACCDB базы данных MSAccess в поле имени файла.
- Отображается окно "Импорт объектов".
- Выберите таблицы, запросы, формы, макросы отчетов, модули для импорта
- В диалоговом окне кнопки Параметры вы можете выбрать меню, панели инструментов и т. Д. Для импорта.
- Нажмите ОК
- Для дублированных имен Access добавит 1,2,3 в конец имени импортируемого объекта.
Доступ 2007? Как отключить макросы и значения запуска при открытии базы данных MS Access
Доступ 2003?
- Обойти клавишу Shift. Эти ссылки на проекты Zip-файлов, доступные для загрузки
- https://web.archive.org/web/20071214172548/http://www.members.shaw.ca/AlbertKallal/msaccess/msaccess.html
- https://web.archive.org/web/20071214172548/http://www.members.shaw.ca/AlbertKallal/msaccess/shiftkey.zip
- https://web.archive.org/web/20071214172548/http://www.members.shaw.ca/AlbertKallal/msaccess/shiftkey2000.zip
Доступ 2007:
- удалить макрос autoexec из MS Access 2007
- Создайте новый макрос, а затем переименуйте его в пользовательском интерфейсе Access в autoexec, ответьте да на приглашение перезаписать существующий макрос AutoExec
Доступ 2010?
Доступ?
- Отключите клавишу F11 в MS Access, чтобы предотвратить открытие области навигации
- Откройте базу данных Access, пусть будет показана основная форма
- Нажмите F11, чтобы открыть панель навигации.
- Предположение, что можно изменить макрос autoexec и / или форму запуска из панели навигации
Доступ?
- https://bytes.com/topic/access/answers/211664-programatically-set-startup-form
- Предположение, что вы можете использовать VBA в одной базе данных Access, чтобы открыть целевую базу данных
- Получите название стартовой формы
- Измените имя стартовой формы или, возможно, очистите имя стартовой формы
- Код VBA похож на CurrentDB.Properties("StartupForm") = "MyForm"
- Другой вариант - вычеркнуть имя стартовой формы в свойствах базы данных.
- То же самое может работать для макроса autoexec
Доступ 2010?
Сбросить форму запуска до нуля в коде VBA
Код 2012 года находится здесь: https://www.tek-tips.com/viewthread.cfm?qid=1673392
Первый способ
Dim strOriginalForm as String Dim db as Database Sub RemoveStartup() Set db = OpenDatabase(yourdatabase) strOriginalForm = db.Properties("StartUpForm") db.Properties("StartUpForm") = "(none)" db.Close set db = Nothing End Sub Sub ResetStartup() Set db = OpenDatabase(yourdatabase) db.Properties("StartUpForm") = strOriginalForm db.Close Set db = Nothing End Sub
Второй способ
Set prp = db.CreateProperty("AllowByPassKey", dbBoolean, True)
db.Properties.Append prp
Третий способ Удалите свойство, используя - database.properties.delete имя свойства
Существует более полный пример с той же страницы.
Обход запуска при удержании клавиши Shift не работает при работе на виртуальной машине или VDI, поэтому у меня это не сработало.