Проблема, с которой вы сталкиваетесь с ошибками ODBC в Excel, вероятно, вызвана проблемой с правами доступа к самой базе данных. По умолчанию учетная запись администратора (которую вы, скорее всего, используете) не имеет разрешений на чтение для объектов MSysObjects. Вы можете исправить это, зайдя в пользовательские разрешения и предоставив доступ на чтение к этой таблице для учетной записи администратора. Сложность такого подхода заключается в том, что разрешения хранятся в файле system.mdw на вашем локальном компьютере (при условии, что вы не изменили это). Это означает, что вам нужно будет исправить разрешения на каждом компьютере, который использует код, который вы создаете.
Однако вы можете избежать всей проблемы с помощью библиотеки расширений ADO. Код, размещенный ниже, должен «Просто запустить», если вы дадите ему правильный путь в БД.
Option Explicit
Public Sub Example()
EnumerateDBTables Range("A1:A2"), "C:\Test\db1.mdb"
End Sub
Public Sub EnumerateDBTables(ByVal target As Excel.Range, ByVal dbPath As _
String, Optional ByVal clearSheet As Boolean = True)
'Requires reference to Microsoft ADO Ext. 2.8 for DDL and Security
'If you have trouble finding it, look here:
'C:\Program Files\Common Files\System\ado\msadox28.tlb
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim ws As Excel.Worksheet
Dim lngRow As Long
Dim lngCol As Long
Set ws = target.Parent
If clearSheet Then ws.UsedRange.Clear
Set cat = New ADOX.Catalog
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
dbPath
'Add Headers:
ws.Range(target.Cells(1, 1), target.Cells(1, 1).Offset(0, 3)) = _
Array("Name", "Type", "Created", "Modified")
lngRow = target.Row + 1&
For Each tbl In cat.Tables
lngCol = target.Column
ws.Cells(lngRow, lngCol) = tbl.Name
ws.Cells(lngRow, lngCol + 1&) = tbl.Type
ws.Cells(lngRow, lngCol + 2&) = tbl.DateCreated
ws.Cells(lngRow, lngCol + 3&) = tbl.DateModified
lngRow = lngRow + 1&
Next
ws.UsedRange.Columns.AutoFit
End Sub
Edit:
Технически вы можете выполнить это даже без написания кода ... Самая оптимальная программа из всех ... 0 строк :)
Вот как это сделать:
- Open the database you want to query.
- Go to to Tools>Security>User And Group Permissions.
- In the box marked "User/Group Name", select "Admin".
- In the box marked "Object Name" select "MysObjects".
- In the area marked "Permissions" (Just below), checkmark the box named "Read Data"
- Click Ok Close the database.
- Open Excel.
- Go to Data>Import External Data>New Database Query.
- Select MS Access Database.
- Uncheck "Use Query Wizard".
- Click OK.
- Browse to Database.
- Click Options.
- Check "System Tables".
- Click OK.
- Build Your Query.
- Click Close.
- Now click View then SQL.
- Paste your SQL.
- Now close the window via the Red X in the upper-right hand corner and you will be prompted for a destination range.
- Tada!