Я пытаюсь получить список всех таблиц от базы данных формата ACCDB Доступа 2007 года с помощью Excel VBA.
Я следовал этому сообщению:
Как я могу получить имена таблиц от базы данных Access MS?
Используя:
SELECT MSysObjects.Name AS table_name
FROM MSysObjects
WHERE
(((Left([Name],1))<>"~")
AND ((Left([Name],4))<>"MSys")
AND ((MSysObjects.Type) In (1,4,6)))
order by MSysObjects.Name
но я получаю эту ошибку.
Запись не может быть считана; никакое разрешение чтения на 'MSysObjects'
Я хочу смочь получить имена таблиц только с помощью SQL-оператора а не OpenSchema
метод.
Я думаю, что проблема с Доступом. Я не уверен.
У кого-либо есть какая-либо идея?
Похоже, проблема с разрешениями. Попробуйте открыть базу данных и перейти к разрешениям безопасности (в меню «Инструменты» -> «Безопасность» -> «Разрешения для пользователей и групп»). Убедитесь, что у вас есть доступ администратора к базе данных.
Если вы этого не сделаете, вам, возможно, придется войти в базу данных как пользователь, который делает и предоставляет себе разрешения
Мне удалось заставить код работать с файлом MDB. У меня была возможность установить разрешения пользователей с помощью «Инструменты базы данных - Пользователи и разрешения» на ленте. Эта опция доступна только для файлов MDB. Теперь проблема в том, чтобы заставить его работать с файлом ACCDB.
Вот мой код:
Dim DBFile As String
Dim Connection As ADODB.Connection
Dim Recordset As New ADODB.Recordset
DBFile = "C:\Documents and Settings\User\Desktop\Son.mdb"
Set Connection = New ADODB.Connection <br/>
Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= " & DBFile & ";"
SQLString = "SELECT MSysObjects.Name AS table_name" & _
"FROM MSysObjects WHERE (((Left([Name],1))<>" & """~""" & ")" & _
"AND ((Left([Name], 4))<>" & """MSys""" & ")" & _
"AND ((MSysObjects.Type) In (1,4,6)));order by MSysObjects.Name"
Set Recordset = New ADODB.Recordset
Recordset.Open SQLString, Connection
Проблема в том, что я не могу заставить его работать с файлами ACCDB.
Используйте коллекцию DAO tabledefs
Sub TableDefs()
Dim db As dao.Database
Dim tdfLoop As dao.TableDef
Set db = CurrentDb
With db
Debug.Print .TableDefs.Count & " TableDefs in " & .name
For Each tdfLoop In .TableDefs
Debug.Print " " & tdfLoop.name
Next tdfLoop
End With
End Sub