2016-01-19 3 views
1

У меня есть расположение файла mdb, определенное в диапазоне 1 листа 1. Это значение:возвращает список всех таблиц доступа (.mdb) с макросом excel

«C: \ Users \ User \ Desktop \ test.mdb»

То, что я ищу, чтобы сделать, это создать список всех таблиц в этом файле и вернуть его в Excel. У меня есть частично рабочий сценарий, но он возвращает ненужные элементы

Я отработку этого:

Sub GetTableNames() 

Dim cnn As ADODB.Connection 
Dim cat As ADOX.Catalog 
Dim tbl As ADOX.Table 
Dim lRow As Long 
Dim szConnect As String 

LastRowSetup = Worksheets("Setup").Cells(Rows.Count, 1).End(xlUp).Row 'last row where table names populate 

If LastRowSetup < 10 Then 
    LastRowSetup = 10 'so we dont accidentally clear important data above this 
End If 

Sheets("Setup").Range("A10:A" & LastRowSetup & "").ClearContents 'clear old data 

fStr = Sheets("Setup").Range("C2").Value 'file location of mdb 

szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
"Data Source=" & fStr & ";" 

Set cnn = New ADODB.Connection 
cnn.Open szConnect 
Set cat = New ADOX.Catalog 
Set cat.ActiveConnection = cnn 

lRow = 10 
For Each tbl In cat.Tables 
Sheet1.Cells(lRow, 1).Value = tbl.Name 
lRow = lRow + 1 
Next tbl 

cnn.Close 
Set cat = Nothing 
Set cnn = Nothing 

End Sub 

однако она возвращается много дополнительных вещей, которые не имена таблиц. например,

~TMPCLP313341 
~TMPCLP74661 
Approved_table1 
Approved_table2  
MSysAccessStorage 
MSysAccessXML 
MSysACEs 
MSysNameMap 
MSysNavPaneGroupCategories 
MSysNavPaneGroups 
MSysNavPaneGroupToObjects 
MSysNavPaneObjectIDs 
MSysObjects 
MSysQueries 
MSysRelationships 

Когда я физически открываю mdb, все, что я вижу, это «таблица 1» и «таблица 2». есть способ реализовать дополнительный фильтр в ADODB-соединении, чтобы не возвращать все временные файлы и объекты Msys, или это то, что я просто должен будет фильтровать после импорта.

Обратите внимание, что мне пришлось установить ссылку на Microsoft ADO Ext. 2.X для библиотеки объектов DDL и безопасности, а также для обычной библиотеки объектов ADO .

ответ

3

попробовать этот код:

For Each tbl In cat.Tables 
If Left(tbl.Name, 4) <> "MSys" And Left(tbl.Name, 1) <> "~" then 
    Sheet1.Cells(lRow, 1).Value = tbl.Name 
    lRow = lRow + 1 
end if 
Next tbl 
+0

Используйте .type, чтобы узнать, какой тип таблицы, а не проверен. –

+0

очень простой. спасибо вам доброжелательно – kamelkid2

+0

Добро пожаловать. – Fadi

1

есть способ осуществить дополнительный фильтр в соединении ADODB не возвращать все временные файлы и объекты Msys или это что-то я просто должен фильтр после импорта.

Нет, вам придется перебирать имена таблиц и просто игнорировать систему («MSys ...») и временные таблицы («... ...»).

+0

Вы можете получить доступ к системным таблицам и использовать SQL-запрос, исключая их, вместо того, чтобы смотреть на схему, или использовать нормальные ado и openschema (таблицы) в набор записей, а затем фильтровать набор записей –