IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro d'importation d'une table Access [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2024
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2024
    Messages : 6
    Par défaut Macro d'importation d'une table Access
    Bonjour,
    Novice en Macro Excel, j'essaie de faire une macro afin de récupérer une table Access depuis Excel.

    Sachant que la macro devra aller chercher le nom du fichier Access, et le nom de la table, dans deux cellules préalablement renseignées dans le fichier Excel.
    L'emplacement du fichier Access est connu et ne change pas. idem pour la position du fichier Excel qui porte la macro.

    J'ai bien réussi, par enregistrement, à créer le code ci-dessous, mais je n'arrive pas à m'approprier le code enregistrer automatiquement, et à paramétrer la possibilité de choisir le fichier Access et de la table que je veux importer.
    Dans l'exemple ci-dessous le nom de la table "TRAVAUX_DEC" et le nom du fichier "225-360-PG3.mdb" doivent pouvoir etre changer via les deux celulles rempli sous Excel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        ActiveWorkbook.Queries.Add Name:="TRAVAUX_DEC", Formula:= _
            "let" & Chr(13) & "" & Chr(10) & "    Source = Access.Database(File.Contents(""C:\DATA\225-360-PG3.mdb""), [CreateNavigationProperties=true])," & Chr(13) & "" & Chr(10) & "    _TRAVAUX_DEC = Source{[Schema="""",Item=""TRAVAUX_DEC""]}[Data]" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    _TRAVAUX_DEC"
        ActiveWorkbook.Worksheets.Add
        With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
            "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=TRAVAUX_DEC;Extended Properties=""""" _
            , Destination:=Range("$A$1")).QueryTable
            .CommandType = xlCmdSql
            .CommandText = Array("SELECT * FROM [TRAVAUX_DEC]")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .ListObject.DisplayName = "TRAVAUX_DEC"
            .Refresh BackgroundQuery:=False
        End With
    Est-ce qu’il est possible de modifier ce code enregistré automatiquement, et je n'ai pas encore trouvé comment faire, ou est ce que je dois trouver une autre solution ?

    Merci

  2. #2
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 222
    Par défaut
    Hello,

    l'enregistreur de macro produit un code difficilement lisible... j'ai essayé d'adapter et de le clarifier un peu, mais c'est sans garantie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
        Dim Nom_Table As String
        Dim Nom_Fichier As String
     
        ' *** à adapter ***
        Nom_Fichier = Workbooks("nom_classeur").Worksheets("nom_feuille").Range("A1")
        Nom_Table = Workbooks("nom_classeur").Worksheets("nom_feuille").Range("A2")
        ' *** à adapter ***
     
        ActiveWorkbook.Queries.Add _
            Name:=Nom_Table, _
            Formula:= _
                "let" & Chr(13) & "" & Chr(10) & _
                "Source = Access.Database(File.Contents(""C:\DATA\" & Nom_Fichier & ".mdb""), " & _
                "[CreateNavigationProperties=true])," & Chr(13) & "" & Chr(10) & _
                "_TRAVAUX_DEC = Source{[Schema="""",Item=" & Nom_Table & "]}[Data]" & Chr(13) & "" & Chr(10) & _
                "in" & Chr(13) & "" & Chr(10) & _
                "_TRAVAUX_DEC"
     
        ActiveWorkbook.Worksheets.Add
     
        With ActiveSheet.ListObjects.Add(SourceType:=0, _
            Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & Nom_Table & ";Extended Properties=""""", _
            Destination:=Range("$A$1")).QueryTable
            .CommandType = xlCmdSql
            .CommandText = Array("SELECT * FROM [" & Nom_Table & "]")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .ListObject.DisplayName = Nom_Table
            .Refresh BackgroundQuery:=False
        End With

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Dans ce billet, VBA Excel – Fonction qui renvoie une liste de données résultant d’une requête SQL dans Access, je propose le code d'une fonction générique qui renvoie le résultat d'une requête SQL.
    Cependant je privilégie maintenant Power Query, intégré à Excel depuis la version 2016, pour importer des tables ou des requêtes depuis Access.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 222
    Par défaut
    harf, j'ai encore oublié Power Query

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2024
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2024
    Messages : 6
    Par défaut
    Bonjour,
    Merci pour vos retours.
    Je ne maitrise pas suffisamment les macros pour comprendre et m'approprier le code fourni par Philippe Tulliez.

    Je pensais avoir utilisé Power Query dans ma macro. J’avoue etre un peu dépassé.

    Nain porte koi, ton code crée un message d'erreur "Erreur :1004 - Référence cyclique".
    et je constate qu'il est encore fait référence au nom de la table "TRAVAUX_DEC" et non pas à la variable "Nom_Table" dans ton code.
    J'ai facilement remplacé le second, mais je n'arrive pas à remplacer le premier. Sans s'avoir si c'est ça qui crée la référence cyclique.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
              Formula:= _
                "let" & Chr(13) & "" & Chr(10) & _
                "Source = Access.Database(File.Contents(""C:\DATA\" & Nom_Fichier & ".mdb""), " & _
                "[CreateNavigationProperties=true])," & Chr(13) & "" & Chr(10) & _
                "_TRAVAUX_DEC = Source{[Schema="""",Item=" & Nom_Table & "]}[Data]" & Chr(13) & "" & Chr(10) & _
                "in" & Chr(13) & "" & Chr(10) & _
                "_" & Nom_Table
    Merci d'avance pour votre aide.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonjour,
    Sans filets..
    Tiré de l'aide µSoft sous ce lien :
    Une requête de langage de formule M Power Query est composée d’étapes d’expression de formule qui créent une requête hybride. Une expression de formule peut être évaluée (calculée) et produire une valeur. L’expression let encapsule un ensemble de valeurs à calculer, auxquelles des noms sont affectés, puis qui sont utilisées dans une expression ultérieure qui suit l’instruction in. Par exemple, une expression let peut contenir une variable Source qui est égale à la valeur de Text.Proper et qui génère une valeur texte dans la casse appropriée.
    Donc, l'expression qui suit l'instruction "in" doit être l'étape précédente.
    Dans le code fourni, il faut remplacer Nom_Table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "in" & Chr(13) & "" & Chr(10) & _
                "_" & Nom_Table
    par la dernière étape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "in" & Chr(13) & "" & Chr(10) & _
                "_TRAVAUX_DEC"
    Nota, on peut très bien renommer la dernière étape "_TRAVAUX_DEC" par n'importe quel terme, qui sera à remplir également après le "in"

    Bonne journée

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2024
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2024
    Messages : 6
    Par défaut
    Bonjour mapeh,
    et donc pourquoi est ce que j'ai l'erreur "Erreur :1004 - Référence cyclique" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Sub test()
     
        Dim Nom_Fichier As String
        Dim Nom_Table As String
     
        ' *** à adapter ***
        Nom_Fichier = Range("C2")
        Nom_Table = Range("C18")
        ' *** à adapter ***
     
        ActiveWorkbook.Queries.Add _
            Name:=Nom_Table, _
            Formula:= _
                "let" & Chr(13) & "" & Chr(10) & _
                "Source = Access.Database(File.Contents(""C:\Andalis\BUDGETS\DATA\" & Nom_Fichier & ".mdb""), " & _
                "[CreateNavigationProperties=true])," & Chr(13) & "" & Chr(10) & _
                "_TRAVAUX_DEC = Source{[Schema="""",Item=" & Nom_Table & "]}[Data]" & Chr(13) & "" & Chr(10) & _
                "in" & Chr(13) & "" & Chr(10) & _
                "_TRAVAUX_DEC"
     
        ActiveWorkbook.Worksheets.Add
     
        With ActiveSheet.ListObjects.Add(SourceType:=0, _
            Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & Nom_Table & ";Extended Properties=""""", _
            Destination:=Range("$A$1")).QueryTable
            .CommandType = xlCmdSql
            .CommandText = Array("SELECT * FROM [" & Nom_Table & "]")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .ListObject.DisplayName = Nom_Table
            .Refresh BackgroundQuery:=False
        End With
    End Sub
    Merci

  8. #8
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 207
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    L'avantage de PowerQuery c'est de pouvoir actualiser le résultat
    La question est donc : faut-il pouvoir actualiser ?
    Peut-être même peut-on fournir le fichier avec la requête PowerQuery en place et juste demander d'actualiser

    Sinon, si c'est juste le chargement d'une table ou requête Access, qu'on pourra potentiellement relancer d'ailleurs, je n'utiliserais pas forcément PowerQuery, mais ça peut se peut discuter

    un exemple (B1 contient le dossier d'emplacement de la base Access, B2 contient le nom de la base Access avec l'extension, remplacer "Liste" par le nom de la table ou requête, adapter le code SQL dans LitDonnees)

    Les résultats s'affichent dans une feuille vide nommée Result
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Dim Conn As Object
     
    Sub Lance()
        LitDonnees "Liste"
    End Sub
     
    Sub OuvreConnexion()
    Dim ChainConn As String, Dossier As String, Fichier As String
        Dossier = Range("B1").Value
        Fichier = Range("B2").Value
        ChainConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
            Dossier & Fichier & ";Persist Security Info=False;"
        Set Conn = CreateObject("ADODB.Connection")
        Conn.Open ChainConn
        If Conn.State = 0 Then MsgBox "Erreur connexion"
    End Sub
     
    Sub FermeConnexion()
        If Not Conn Is Nothing Then
            If Conn.State = 1 Then
                Conn.Close
            End If
        End If
        Set Conn = Nothing
    End Sub
     
    Sub LitDonnees(NomTable As String)
    Dim Rs As Object, i As Long
        With ThisWorkbook.Sheets("Result").Range("A1")
            .CurrentRegion.ClearContents
            OuvreConnexion
            Set Rs = Conn.Execute("Select * from " & NomTable)
            'Set Rs = Conn.Execute("Select * from Liste inner join Dept on Liste.Dept=Dept.Depart")
            'Set Rs = Conn.Execute("Select count(*) as Nombre from Liste")
     
            For i = 0 To Rs.Fields.Count - 1
                .Offset(0, i).Value = Rs.Fields(i).Name
            Next
            .Offset(1, 0).CopyFromRecordset Rs
        End With
        Rs.Close
        Set Rs = Nothing
        FermeConnexion
    End Sub

  9. #9
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 568
    Par défaut
    Bonjour à tous

    Une requête est actualisable par n'importe qui : nul besoin de coder d'autant que l'actualisation peut être faite automatiquement à l'ouverture d'Excel.

    Par ailleurs PowerQuery permet même d'effectuer une requête avec paramètres afin que ce soit le moteur du SGBD (Access ou autre) qui calcule et non Excel.

  10. #10
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 207
    Billets dans le blog
    2
    Par défaut
    Bonjour chris ,

    oui, c'est ce que sous-entendait ma phrase
    Peut-être même peut-on fournir le fichier avec la requête PowerQuery en place et juste demander d'actualiser
    Dans ce cas pas besoin de macro (ou juste une macro qui actualise la requête, à la rigueur)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Importation d'une table access dans excel avec Macro
    Par wamkey dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/01/2014, 22h44
  2. Réponses: 15
    Dernier message: 27/05/2013, 10h11
  3. Réponses: 7
    Dernier message: 20/08/2012, 08h11
  4. [OL-2003] Importation d'une table access dans le calendrier outlook
    Par ls8ls8 dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 09/07/2009, 19h22
  5. import d'une table access ds mysql
    Par nogood1 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 26/05/2006, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo