'Les feuilles doivent comporter au moins une valeur dans la 1ère ligne
'Pas plus de 255 colonnes
Function LireFichier(NomFichier, NomFeuille, Cellule, Optional Message)
Application.Volatile 'Attention au temps de recalcul si on multiplie les appels de la fonction !
Dim Cn As Object
Dim oCat As Object, Feuille As Object
Dim ComSQL As Object
Dim Rst As Object
If IsMissing(Message) Then Message = "?"
'Vérification des arguments
If NomFichier = "" Then LireFichier = "Argument NomFichier absent !": Exit Function
tb = Split(Replace(NomFichier, "/", "\"), "\")
If Dir(NomFichier) <> tb(UBound(tb)) Then LireFichier = "Le fichier n'existe pas !": Exit Function
If NomFeuille = "" Then LireFichier = "Argument NomFeuille absent !": Exit Function
If Cellule = "" Then LireFichier = "Argument Cellule absent !": Exit Function
'N° de colonne dans le tableau résultat
Col = "": On Error Resume Next: Col = Range(Cellule).Column - 1: On Error GoTo 0
If Col = "" Then LireFichier = "Argument Cellule incorrect !": Exit Function
'N° de ligne dans le tableau résultat
Lgn = Range(Cellule).Row - 2
Set Cn = CreateObject("ADODB.Connection")
Set oCat = CreateObject("ADOX.Catalog")
Set ComSQL = CreateObject("ADODB.Command")
Set Rst = CreateObject("ADODB.Recordset")
With Cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomFichier & _
";Extended Properties=""Excel 12.0;HDR=YES;ReadOnly=True;"""
.Open
End With
'Recherche de la feuille
Set oCat.ActiveConnection = Cn
Trouvée = False
For Each Feuille In oCat.tables
If Replace(Replace(Feuille.Name, Chr(39), ""), "$", "") = NomFeuille Then Trouvée = True: Exit For
Next
Set oCat = Nothing
If Not Trouvée Then LireFichier = Message: Cn.Close: Exit Function
With ComSQL
.ActiveConnection = Cn
.CommandType = 1
.CommandText = "SELECT * FROM [" & NomFeuille & "$]"
End With
Set Rst = ComSQL.Execute
tb = False
On Error Resume Next: tb = Rst.GetRows: On Error GoTo 0
If TypeName(tb) = "Boolean" Then 'Cas d'une feuille vide
LireFichier = ""
ElseIf Col > UBound(tb, 1) Or Lgn > UBound(tb, 2) Then 'Cellule au delà de la plage de donnée
LireFichier = ""
ElseIf Lgn = -1 Then
LireFichier = Rst.Fields(Col).Name 'Titre de la colonne
Else
LireFichier = IIf(IsNull(tb(Col, Lgn)), "", tb(Col, Lgn)) 'Si cellule vide "" sinon la valeur
End If
Cn.Close
Set Cn = Nothing
Set ComSQL = Nothing
Set Rst = Nothing
End Function