Эмуляция клавиши SHIFT, когда вы используете VBA, чтобы открыть базу данных ms-access, защищенную файлом mdw?

Я хочу запустить рекурсивно через каталог *.mdb файлы и искать их, чтобы увидеть, какие из них имеют конкретную связанную таблицу.

Эти файлы защищены несколькими *.mdw файлы. Я не написал ни одного из них, но я их сопровождающий.

Я нашел способ сделать это, но он слишком интерактивный; Мне нужно, чтобы он не был интерактивным; так как некоторые из них *.mdbs Я ищу использовать макрос 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
Другие вопросы по тегам