【发布时间】:2010-07-23 15:23:16
【问题描述】:
我有一个包含多个工作表的工作簿,并在工作簿中创建了命名表(非范围)。出于说明目的,这些表名是 tblA、tblB 和 tblC。我无法找到通过 ADO 或 ODBC 查询这些表的方法。我可以访问命名范围,但这不适用于我的需要。
谢谢!
【问题讨论】:
我有一个包含多个工作表的工作簿,并在工作簿中创建了命名表(非范围)。出于说明目的,这些表名是 tblA、tblB 和 tblC。我无法找到通过 ADO 或 ODBC 查询这些表的方法。我可以访问命名范围,但这不适用于我的需要。
谢谢!
【问题讨论】:
我不知道是否可以直接完成,但有兴趣看看是否有人回来提供工作方法。 ADO 的 GetSchema 集合似乎只获取工作表名称和命名范围,而不是命名表所在的 ListObjects。以下是一种解决方法,但这意味着打开 Excel 以查找表的标题/数据范围。使用 ADO 或类似方法几乎没有意义,因为您可以直接复制数据,但我想您可以在保存为一次性任务之前转换为命名范围?
Option Explicit
Sub test()
Dim WB As Workbook, WS As Worksheet, strExcelfile As String, strSheetName As String
Dim strTableName As String, objListObj As ListObject, HeaderRange As String
Dim strSQL As String, DataRange As String
strExcelfile = "C:\Users\osknows\Desktop\New folder\test.xlsm"
strSheetName = "Sheet1"
strTableName = "TableName"
Set WB = GetObject(strExcelfile) 'Filepath & Filename
Set WS = WB.Sheets(strSheetName) 'SheetName
Set objListObj = WS.ListObjects(strTableName) 'Table Name
'get range of Table
HeaderRange = objListObj.HeaderRowRange.Address
DataRange = objListObj.DataBodyRange.Address
'write data directly if required
With ThisWorkbook
With Sheet1
'.Range(HeaderRange).Value = WS.Range(HeaderRange).Value
'.Range(DataRange).Value = WS.Range(DataRange).Value
End With
End With
'or use ADODB which is a bit pointless now!
Dim cnn1 As New ADODB.Connection
Dim rst1 As New ADODB.Recordset
cnn1.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strExcelfile & ";" & _
"Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
strSQL = "SELECT * FROM [" & strSheetName & "$" & Replace(DataRange, "$", "") & "];"
rst1.Open strSQL, cnn1, adOpenStatic, adLockReadOnly
'tidy up
Set objListObj = Nothing
Set WS = Nothing
WB.Close
Set WB = Nothing
End Sub
【讨论】: