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