Introduction

Je vous propose une petite procédure qui importe le résultat d’une requête faite sur une base de données Access dans une feuille Excel.
Cette requête est exécutée par une fonction nommée QueryAccess qui renvoie une table contenant le résultat d’une requête faite sur une base de données Access.

Les arguments utilisés dans la fonction

dbFullName de type String, contient le chemin complet + le nom de la base de données.
SqlQuery de type String, contient la requête SQL.
[WithLabel] de type booléen, argument facultatif, True ou omis renvoie les étiquettes de colonnes

Le code de la procédure

Function QueryAccess(dbFullName As String, SqlQuery As String, Optional WithLabel As Boolean = True)
 ' Philippe Tulliez
 ' v 2.0 - 11/01/14 ' Ajouté argument optionnel WithLabel
 ' Nécessite de référencer Microsoft DAO x.x ObjectLibrary
 ' Arguments
 ' dbFullName ' Chemin +  nom du fichier
 ' SqlQuery ' Chaîne de caractères contenant la requête SQL
 ' [WithLabel] ' True ou Omis renvoie les étiquettes de colonnes
' 
' Variables - Déclaration et affectation des valeurs
 Dim db As DAO.Database, Rs As DAO.Recordset
 Dim myTable(), count As Long, Elem As Integer
 Set db = Workspaces(0).OpenDatabase(dbFullName, ReadOnly:=True)
 Set Rs = db.OpenRecordset(SqlQuery)
 ' Lecture des enregistrements de la requête
 While Not Rs.EOF
  ReDim Preserve myTable(Rs.Fields.count, count)
  If count = 0 And WithLabel Then
   For Elem = 0 To Rs.Fields.count - 1: myTable(Elem, count) = Rs(Elem).SourceField: Next ' Etiquettes de colonnes
   count = count + 1: ReDim Preserve myTable(Rs.Fields.count, count)
  End If
  For Elem = 0 To Rs.Fields.count - 1
    myTable(Elem, count) = IIf(IsNull(Rs(Elem)), "", Rs(Elem))
  Next Elem
  count = count + 1: Rs.MoveNext
 Wend
 QueryAccess = Application.WorksheetFunction.Transpose(myTable)
 Rs.Close: db.Close: Set Rs = Nothing
End Function