Option Explicit
Sub testAdO()
Dim fichier As String, nomfeuille As String, DispoCel As Range
fichier = "C:\Users\polux\DeskTop\extraction.xlsx"
'nomfeuille = "ISPA_Donnees_brutes_A73625_02_1"
nomfeuille = GetNameSheetsWithIndex("C:\Users\polux\DeskTop\extraction.xlsx", 1) 'on connais pas le nom de la feuille(1) on va le chercher
Set DispoCel = Feuil1.Cells(Rows.Count, "A").End(xlUp).Offset(1)
resADO [B5:B65000], fichier, nomfeuille, DispoCel
resADO [H5:Ai65000], fichier, nomfeuille, DispoCel.Offset(, 1)
Feuil1.Columns("A").NumberFormat = "dd/mm/yyyy"
Feuil1.Columns("A:AI").AutoFit
End Sub
Function resADO(plage, fichier, nomfeuille, destination)
Dim Cn As Object, texte_SQL$, rst As Object
Set Cn = CreateObject("ADODB.Connection")
Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"";"
' la requête.Attention!!!!!!! à ne pas oublier le symbole "$" après le nom de la feuille.
texte_SQL = "SELECT * FROM [" & nomfeuille & "$" & plage.Address(0, 0) & "]"
Set rst = CreateObject("ADODB.RecordSet")
Set rst = Cn.Execute(texte_SQL)
destination.CopyFromRecordset rst
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing: Set rst = Nothing
End Function
Function GetNameSheetsWithIndex(fichier$, Optional index As Long = 0)
Dim cnx As Object, rst As Object, res() As String, nm As String, i As Integer
Const adSchemaTables As Integer = 20
On Error GoTo FIN
'
Set cnx = CreateObject("ADODB.Connection") ' création des object Adodb
cnx.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fichier & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
cnx.Open
'
Set rst = cnx.OpenSchema(adSchemaTables) '20
Do Until rst.EOF = True ' interrogation du catalogue
nm = rst.Fields!Table_Name.Value
If Right(nm, 1) = "$" Then
i = i + 1
ReDim Preserve res(1 To i)
res(i) = Left(nm, Len(nm) - 1)
End If
rst.MoveNext
Loop
rst.Close: cnx.Close ' Fermeture des objets recordset et connexion
FIN:
Set rst = Nothing: Set cnx = Nothing ' Nettoyage des objets et gestion des erreurs
If Err.Number <> 0 Then
MsgBox "Opération interrompue en raison de l'erreur suivante :" & vbCrLf & vbCrLf & Err.Description, vbExclamation, "Lister feuilles classeur fermé"
ReDim res(1 To 1): res(1) = "nofound!!"
End If
On Error GoTo 0
If index = 0 Then GetNameSheetsWithIndex = res Else GetNameSheetsWithIndex = res(index)
End Function
'exemple d'utilisation de la fonction
'la fonction peut retourner un string ou un array
Sub test()
' en string
nomfeuille = GetNameSheetsWithIndex("C:\Users\polux\DeskTop\extraction.xlsx", 1)
MsgBox nomfeuille
'en array
listefeuille = GetNameSheetsWithIndex("C:\Users\polux\DeskTop\extraction.xlsx")
MsgBox listefeuille(1)
End Sub