2010-07-23 5 views
2

J'ai un classeur avec plusieurs feuilles et j'ai créé des tables nommées (NOT ranges) dans le classeur. À des fins d'illustration, ces noms de tables sont tblA, tblB et tblC. Je suis incapable de trouver un moyen d'interroger ces tables via ADO ou ODBC. Je peux accéder aux plages nommées, mais cela ne fonctionnera pas pour mes besoins.Comment accéder à une table nommée Excel via ADO/ODBC?

Merci!

Répondre

2

Je ne sais pas si cela peut être fait directement mais je serais intéressé de voir si quelqu'un revient avec une méthode de travail. La collection GetSchema d'ADO semble uniquement prendre en charge les noms de feuilles et les plages nommées, mais pas les ListObjects dont les tables nommées sont. Voici une solution de contournement, mais cela signifie l'ouverture d'Excel pour trouver l'en-tête/plage de données de la table. Il est presque inutile d'utiliser ADO ou similaire alors que vous pouvez copier les données directement, mais je suppose que vous pourriez convertir dans une plage nommée avant d'enregistrer comme une tâche unique?

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 
+0

Cela semble génial. S'il n'y a pas de meilleures réponses au moment où cela se termine, la prime est à vous :) –

Questions connexes