Accéder aux données MS Access
Bonjour à tous,
A chaque fois, c'est pareil, je ne sais jamais quoi utiliser pour lire des données dans une base de données Access en VBA Excel.
Le principe est assez simple, j'ai mon fichier Excel et je souhaite, suivant des critères contenus dans une feuille, importer les données d'une base de données Access.
Bien sur, je veux juste accéder aux données, sans ouvrir Access
Pourriez-vous m'aiguiller ?
Merci d'avance
Jp
Bonjour,
Excel 2016 : Ruban, Données, Nouvelle requête, A partir d'une base de données Access...
Cdlt.
Merci Jean-Eric,
Bien sur, cette méthode, mais je parle pour le faire en VBA !
Entre ADO, DAO, Jet, ODBC, etc....
Je rame à chaque fois entre ces possibilités !
Re,
C'est bien pour éviter VBA et ses contraintes que tu dois aller voir "Récupérer et transformer" (Power Query).
C'est +/- automatique. Tu choisis ta Table puis Modifier, etc...
C'est plus simple mais cela demande un apprentissage.
Le web fournit une aide assez conséquente pour les premiers pas!
Cdlt.
J'en convient Eric, je me suis déjà penché sur le PowerData, mais je ne suis pas certain que cela réponde à mes attentes, sauf bien sur que je ne maitrise pas l'ensemble.
Le premier problème qui me semble bloquant, c'est la localisation de ma source de données (Access), le chemin d'accès est variable suivant l'utilisateur, nous n'avons pas tous le même mappage réseaux et il me semble que cette partie n'est pas super souple avec PowerData !
C'est une des raisons qui me faisait m'orienter vers du VBA.
L'idée globale du projet, c'est de piloter la mise à jour de nos planning de formation Outlook à partir d'Excel sur base d'un outils de Gestion Access que nous avons développé.
Bonjour
On peut utiliser une cellule Excel par exemple pour renseigner le chemin, qui peut donc varier..., qui sera utilisé par PowerQuery
Bonjour Chris,
Vous pourriez m'aiguiller pour faire cela ?
Changer la source et les filtres à partir de cellule Excel ?
Merci d'avance
Bonjour à tous,
Pour lire des données Access dans excel, c'est assez simple.
Ci-joint mon code que j'utilise régulièrement pour extraire la totalité d'un .accdb vers Excel
Ce code demande à pointer sur un fichier .acdb ou .mdb, puis crée autant d'onglets que de tables et colle le contenu de chaque table dans chacun des onglets correspondant.
Dans chaque onglet la première ligne correspond au codage du type des données de la colonne.
Pour utiliser ce code, coller-le dans un module quelconque, et exécuter la procédure 'lister_tables'.
Pas de référence à cocher, pas de blabla, ça fait le job.
Après pour ajouter des filtres, il suffit de modifier la ligne de commande SQL
Pierre
Ps : le code prend en charge l'éventualité d'un mot de passe protégeant la base
Option Explicit
' ***********************************************************************
' ***** *****
' ***** CODE PierreP56 : http://tatiak.canalblog.com/ *****
' ***** *****
' ***********************************************************************
Public Const PRVD = "PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE="
Sub lister_tables()
Dim BDD As String, msg As String, Mdp As String, Req As String
Dim Cnx As Object, Cat As Object, Tbl As Object
BDD = NDF_A_LIRE
msg = "Saisir le mot de passe d'accès à la base (optionnel)" & vbCrLf & "ou cliquez sur 'Annuler'"
Mdp = InputBox(msg, "MOT DE PASSE")
If Not BDD = "Faux" Then
Set Cnx = CreateObject("ADODB.Connection")
Req = PRVD & BDD
If Not Mdp = "" Then Req = Req & ";Jet OLEDB:Database Password=" & Mdp & ";"
Cnx.Open Req
Set Cat = CreateObject("ADOX.Catalog")
Set Cat.activeconnection = Cnx
Set Tbl = CreateObject("ADOX.Table")
For Each Tbl In Cat.Tables
If Tbl.Type = "TABLE" Then
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = Tbl.Name & "_"
lirecontenu BDD, Tbl.Name
End If
Next
Cnx.Close
Set Cnx = Nothing
Set Cat = Nothing
Set Tbl = Nothing
End If
End Sub
Sub lirecontenu(NDF As String, Tbl As String)
Dim Requete As String, result As Integer
Requete = "SELECT * FROM [" & Tbl & "] "
result = Import.Query(Requete, NDF)
End Sub
Function NDF_A_LIRE() As String
ChDrive (Left(ActiveWorkbook.Path, 1))
ChDir ActiveWorkbook.Path
NDF_A_LIRE = Application.GetOpenFilename("Fichiers Access,*.mdb;*.accdb")
End Function
' ***** REQUETEUR SQL *****************************************************************************
Function Query(Requete As String, BDD As String) As Integer
Dim Cnx As Object, Rst As Object
Dim Col_SQL As Integer, i As Long, j As Integer
On Error GoTo errhdlr
Set Cnx = CreateObject("ADODB.Connection")
Cnx.Open PRVD & BDD
Set Rst = CreateObject("ADODB.Recordset")
Rst.Open Requete, Cnx, 3
Query = Rst.RecordCount
Col_SQL = Rst.Fields.Count - 1
ReDim Ent(Col_SQL)
For i = 0 To Col_SQL
ActiveSheet.Cells(1, i + 1).Value = Rst.Fields(i).Type
ActiveSheet.Cells(2, i + 1).Value = Rst.Fields(i).Name
Next i
If Not Query = 0 Then
Rst.movefirst
ActiveSheet.Range("A3").CopyFromRecordset Rst
End If
Cnx.Close
Set Cnx = Nothing
Set Rst = Nothing
Exit Function
errhdlr:
Query = -1
If Not Rst Is Nothing Then
If Rst.State = 1 Then Rst.Close
Set Rst = Nothing
End If
If Not Cnx Is Nothing Then
If Cnx.State = 1 Then Cnx.Close
Set Cnx = Nothing
End If
Debug.Print Err.Number & " " & Err.Description & vbCrLf & "Requête : " & Requete
End Function
' *************************************************************************************************
Merci beaucoup,
Il est dommage que cela ne fonctionne que sur du 32 bits !
RE
Bonjour Chris,
Vous pourriez m'aiguiller pour faire cela ?
Changer la source et les filtres à partir de cellule Excel ?
Merci d'avance
Chemin de la base avec son nom et table (ou requête) affichés dans l'onglet chemin