Эмуляция клавиши SHIFT, когда вы используете VBA, чтобы открыть базу данных ms-access, защищенную файлом mdw?
Я хочу запустить рекурсивно через каталог *.mdb
файлы и искать их, чтобы увидеть, какие из них имеют конкретную связанную таблицу.
Эти файлы защищены несколькими *.mdw
файлы. Я не написал ни одного из них, но я их сопровождающий.
Я нашел способ сделать это, но он слишком интерактивный; Мне нужно, чтобы он не был интерактивным; так как некоторые из них *.mdb
s Я ищу использовать макрос Autoexec.
Из того, что я понимаю, выполнения макроса Autoexec можно избежать, если удерживать клавишу SHIFT при их открытии; однако я использую командную строку в своем макросе, чтобы открыть эти файлы, и, похоже, нет способа удержать клавишу Shift.
Я нашел другой пример, который позволяет удерживать нажатой клавишу Shift, чтобы избежать макроса Autoexec (см. Обход параметров запуска при открытии базы данных), но который не позволяет разблокировать базу данных с помощью *.mdw
файл, потому что метод OpenCurrentDatabase() не имеет параметра для *.mdw
файл
1 ответ
Если ваша цель просто проверить, содержит ли файл БД определенную связанную таблицу, вы можете использовать ADO OpenSchema
метод. При таком подходе вам не нужно открывать файл db в сеансе приложения Access, поэтому макрос AutoExec не запускается.
Ниже приведен пример использования позднего связывания. Я оставил комментарии к комментариям на случай, если вы предпочитаете раннее связывание. Измените провайдера, если ваша версия Access старше 2007 года.
Поскольку вы используете безопасность на уровне доступа Access, вам также придется адаптировать строку подключения, чтобы включить путь к вашему MDW и указать имя пользователя и пароль безопасности Access. Вот пример строки подключения (с использованием провайдера Jet 4) от http://connectionstrings.com/access. Я делю однострочную строку на точки с запятой для удобства чтения:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\mydatabase.mdb;
Jet OLEDB:System Database=system.mdw;
User ID=myUsername;
Password=myPassword;
Public Function HasLinkedTable(ByVal pDb As String, _
ByVal pTable As String) As Boolean
Const adSchemaTables = 20&
Dim cn As Object ' ADODB.Connection
Dim rs As Object ' ADODB.Recordset
Dim strConnect As String
Dim blnReturn As Boolean
strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & pDb & ";"
'Set cn = New ADODB.Connection
Set cn = CreateObject("ADODB.Connection")
cn.Open strConnect
Set rs = cn.OpenSchema(adSchemaTables)
With rs
Do While Not .EOF
If !TABLE_NAME = pTable And !TABLE_TYPE = "LINK" Then
'Debug.Print !TABLE_NAME, !TABLE_TYPE
blnReturn = True
Exit Do
End If
.MoveNext
Loop
.Close
End With
cn.Close
Set cn = Nothing
HasLinkedTable = blnReturn
End Function