MS Excel VBA – 导入访问(MDB)表结构

我有这个片段,将访问表导入到Excel中。 MDBpath在范围C2中,表名称是C4

有没有一种方法可以导入表的属性/devise,并使用excel vba将其写入新的位置? 这将用于许多具有不同技能水平的人员,具有不同的表结构来导入。 数据最终将不得不回到访问,但我正在绊倒如何确保访问内的字段属性是正确的。

Sub GetData() DeleteConnections 'remove existing connections in case they persist Sheet4.Cells.Clear 'clear the old table Sheets("Import").Activate DatabaseName = Sheets("Setup").Range("C2").Value TableName = Sheets("Setup").Range("C4").Value With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _ "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=" & DatabaseName & "" _ , _ ";Mode=Share" _ , _ " Deny Write;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OL" _ , _ "EDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet" _ , _ " OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Loc" _ , _ "ale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet" _ , " OLEDB:Bypass UserInfo Validation=False"), Destination:=Range("$A$1")). _ QueryTable .CommandType = xlCmdTable .CommandText = Array("" & TableName & "") .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .SourceDataFile = _ "" & DatabaseName & "" .ListObject.DisplayName = "" & TableName & "" .Refresh BackgroundQuery:=False End With DeleteConnections 'remove the new connection End Sub 

如果你想要的只是表的结构,你可以劫持ADODB.RecordSet类来公开字段名称,数据types和长度。 像这样的东西应该工作。 在这个例子中,他们将在活动电子表格的列A,B和C中列出:

 Sub GetDataFieldInfo() Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Set conn = New ADODB.Connection conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0" & _ ";Data Source=" & DatabaseName & _ ";Persist Security Info=False;" conn.Open Set rs = conn.Execute("select * from " & TableName) For i = 0 To rs.Fields.Count - 1 Cells(i + 1, 1).Value2 = rs(i).Name Cells(i + 1, 2).Value2 = TypeName(rs.Fields(i).Value) Cells(i + 1, 3).Value2 = rs.Fields(i).DefinedSize Next rs.Close End Sub 

我在示例表上运行它,结果如下所示:

 ID Long 4 Date Entered Date 8 Business Unit String 255 Type Code String 255 

你可能想看看这是如何处理空数据。

下面是一个将遍历QueryTable的源表的列名的代码片段:

 Dim qt As QueryTable Dim lo As ListObject Dim lc As ListColumn Set qt = ActiveSheet.ListObjects(1).QueryTable Set lo = qt.ListObject For Each lc In lo.ListColumns Debug.Print lc.Name Next Set lc = Nothing Set lo = Nothing Set qt = Nothing 

这是为了说明的目的而冗长的,并且显然可以被重构。