Générer tableau excel a partir donées access

Bonjour à tous !
J’ai un tableau sous excel que j’ai inséré dans access grace a plusieur tables .
Mon probleme est que je n’arrive pas a récuper toutes les données de mes tables et les retransférer sous excel et donc reformer mon tableau initial…(sachant que j’ai certains champs vides). Il faudrait que je mette un champs d’une table en colonne ; un champ comme 1ere ligne ; et le reste dans mon tableau !
Quelqu’un pourrait-il m’aider ?
Merci d’avance de me repondre… !
Configuration: access et excel 2000

22 réponses

Résumé de la discussion

La discussion porte sur l'exportation de données d'Access vers Excel et sur la reformulation du tableau initial, avec des tables liées et des champs vides. Plusieurs participants proposent des solutions en VBA/macros pour générer un fichier Excel à partir de champs d'Access, en plaçant certains champs en colonnes et d'autres en lignes, et en manipulant des objets Excel. Des échanges soulignent des difficultés pratiques, notamment les doublons lorsque plusieurs enregistrements partagent les mêmes valeurs et le besoin d'éviter les répétitions en générant des lignes et colonnes de manière cohérente. D'autres contributions suggèrent d'automatiser l'export sur une nouvelle feuille et d'ajuster le code pour aligner champ1 comme colonne, champ2 comme ligne et champ3 comme axe central afin de comparer les résultats.

Bobot (l’IA à votre service)
  1. re:

    voici un exemple :

    Sub InitialiseExcel()
    
        Dim xlApp, xlBook, xlRange As Variant             'Objets classeur
        Dim xlWks, iRows, iCols, iRotate As Variant       'Objets feuille
        Dim FichierXL As String
        Dim Boucle, Cmpt As Integer
        '
        FichierXL = "C:\MonFichier.xls"
        'Création de l'objet Excel (main mise sur !)
        Set xlApp = CreateObject("Excel.Application")
        'Création de l'objet [Fichier Excel]
        Set xlBook = xlApp.Workbooks.Open(FichierXL)
        'Création de l'objet [Feuille] du classeur Excel.
        xlApp.ActiveWorkbook.Worksheets.Add
        Set xlWks = xlBook.ActiveSheet
        'Création de la plage permise dans la feuille Excel.
        Set xlRange = xlWks.Range("A1:A65535")
    
        DoCmd.GoToRecord , , acLast
        Cmpt = Forms![MonFormulaire].Recordset.RecordCount
        DoCmd.GoToRecord , , acFirst
        
        For Boucle = 1 To Cmpt
            xlRange.Cells((Boucle + 1), 1).Value = Forms![MonFormulaire].[Champs1]
            DoCmd.GoToRecord , , acNext
        Next Boucle
        
        DoCmd.GoToRecord , , acFirst
        For Boucle = 1 To Cmpt
            xlRange.Cells(1, (Boucle + 1)).Value = Forms![MonFormulaire].[Champs2]
            DoCmd.GoToRecord , , acNext
        Next Boucle
        
        DoCmd.GoToRecord , , acFirst
        For Boucle = 1 To Cmpt
            xlRange.Cells((Boucle + 1), (Boucle + 1)).Value = Forms![MonFormulaire].[Champs3]
            DoCmd.GoToRecord , , acNext
        Next Boucle
        
        DoCmd.GoToRecord , , acFirst
    
        xlApp.Visible = True
        xlWks.Activate
        xlRange.Cells(1, 1).Select
        xlApp.DisplayAlerts = False
        xlBook.SaveAs FichierXL
        'xlApp.Quit
        xlApp.DisplayAlerts = True
    
        Set xlRange = Nothing
        Set xlWks = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
       
        MsgBox "Fin du travail"
    
    End Sub
    


    Lupin
    1
    1. Bonjour,

      Voilà, j'ai lu ton précédent message et a ce que je peux voir,
      tu n'as pas trouver pointure a ton pied !!!

      Donc tu as des tables sous Access que tu veux exporter sous
      Excel. Alors première étape, créer une requête qui te fournira
      les éléments voulu.

      Sous ACCESS :

      //Créer une nouvelle requête à l'aide de l'assistant
      //Sélectionner la(es) table(s) nécessaire(s)
      //Sélectionner le(s) champs à faire afficher

      N.B. Même une fois créé, tu pourra rajouter des tables/champs
      dans la requête. De plus il est aussi possible de modifier
      la requête par programmation sur des actions de l'utilisateur.

      // Menu Fichier / Exporter / Format XLS

      Il est fort probable qu'une mise en page soit nécessaire sous
      Excel, mais allons y un pas à la fois.

      N.B. Il est aussi fort possible qu'un formulaire accroché sur la
      requête fasse aussi l'affaire.

      Pour l'instant, il te faut créer une requête.

      Lupin

      0
      1. Je vais essayer mais le prob c que je veu les enregistremen d'un champ précis d'une de mes tables ds ma 1ere ligne de mon tableau ; et mm choz je veu ossi les enregistremen d'un champ précis d'une autre table ds la 1ere colone et le reste des données ds les différentes cases de ce tableau...
        Je c pa si tu c faire sa keske ten pense c faisable?
        mici de ton aide
        0
    2. c'est faisable utiliser null et not null
      0
      1. je v essayer merci bcq!
        0
    3. re:

      en effet, c'est possible. En fait peu importe la structure que
      tu veux, si tu as les données, le reste n'est qu'une mise en
      page.

      Une requête peut pointer dans plusieurs table et sur plusieurs
      champs, a toi de choisir les données recherchées.

      Tu pourrais aussi construire ton tableau Excel avec plus d'une requête, en exportant plus d'une fois et en fusionnant les
      fichiers Excel généré.

      Il y a toute une panoplie de possibilitées.

      Lupin
      0
      1. Ok merci j'ai bien compris!
        néanmoins, apres avoir créer les requetes, je les exporte sous excel mais cela me crée un tableau identique a la requete. Je c que c un probleme de mise en page ; mais en fait ce que je voudrais c générer mon tableau excel directement com je le veux (sans avoir besoin de faire de mise en page sous excel).
        Grace a un bouton, envoyer directement sous excel un champ d'une table comme 1ere ligne, un autre comme 1ere colone ; et toutes les données d'une autre table dans ce tableau (les champs que je veux mettre en 1ere Ligne et 1ere Colonne figure dans cette table ce qui me garanti la cohérence des informations)

        tu penses que c faisable ce que je veux? ("automatiser" la création du tableau excel) Il faut surement créer un code en vba non?

        Merci de ton aide...a+
        0
    4. re:

      oui c'est possible en VBA, on peut faire ce que l'on veut !
      il y a plein d'exemples pour piloter Excel depuis VB/VBA/VBS sur le net !

      en voici un :
      http://www.oricom.ca/lupin/document/excelvbs.txt

      Lupin
      0
      1. Slt! j'ai un peu regarder le code que tu m'a donné mais je n'ai pas tout compris...(jsui novice en vba!)
        Pourrais tu m'expliquer plus clairement coment je pourrais programmer un bouton en vba qui me construit un tableau sous excel en fonction de différents champs de plusieurs tables?
        (Dire par code qu'un champ sera la 1ere colonne, un autre la 1ere ligne, ...)
        et comme j'ai deja un tableau du mm type que je veux sous excel, c'est possible d'inserer dans le meme fichier (sur une autre feuille excel) les données que j'ai sous access? (de facon a pouvoir comparer le tableau initial au tableau final directement)

        Mici d'avance de ton aide a+
        0
    5. Salut,

      Voici donc un exemple de code a accrocher sur un bouton
      d'un formulaire.

      Tu créé une routine dans la section [Module], sur un formulaire
      tu place un bouton qui est accroché sur une procédure événementiel,
      et dans cette procédure, tu appelle la routine créé.

      Sub InitialiseExcel()
      
          Dim xlApp, xlBook, xlRange As Variant             'Objets classeur
          Dim xlWks, iRows, iCols, iRotate As Variant       'Objets feuille
          Dim FichierXL As String
          Dim Boucle, Cmpt As Integer
          '
          FichierXL = "C:\MonFichier.xls"
          'Création de l'objet Excel (main mise sur !)
          Set xlApp = CreateObject("Excel.Application")
          'Création de l'objet [Fichier Excel]
          Set xlBook = xlApp.Workbooks.Open(FichierXL)
          'Création de l'objet [Feuille] du classeur Excel.
          Set xlWks = xlBook.Worksheets(1)
          'Création de la plage permise dans la feuille Excel.
          Set xlRange = xlWks.Range("A1:A65535")
      
          DoCmd.GoToRecord , , acLast
          Cmpt = Forms![MonFormulaire].Recordset.RecordCount
          DoCmd.GoToRecord , , acFirst
          
          For Boucle = 1 To Cmpt
              xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1]
              xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2]
              xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3]
              DoCmd.GoToRecord , , acNext
          Next Boucle
          DoCmd.GoToRecord , , acFirst
      
          xlApp.Visible = True
          xlWks.Activate
          xlRange.Cells(1, 1).Select
          xlApp.DisplayAlerts = False
          xlBook.SaveAs FichierXL
          xlApp.Quit
          xlApp.DisplayAlerts = True
      
          Set xlRange = Nothing
          Set xlWks = Nothing
          Set xlBook = Nothing
          Set xlApp = Nothing
         
          MsgBox "Fin du travail"
      
      End Sub
      
      


      Voilà, ceci devrait te fournir un bon point de départ !

      Lupin
      0
      1. Slt! J'ai bien regarder le code que tu m'as envoyé et il y a une partie que je n'ai pas bien comprise :

        DoCmd.GoToRecord , , acLast
        Cmpt = Forms![MonFormulaire].Recordset.RecordCount
        DoCmd.GoToRecord , , acFirst
        For Boucle = 1 To Cmpt
        xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1]
        xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2]
        xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3]
        DoCmd.GoToRecord , , acNext
        Next Boucle
        DoCmd.GoToRecord , , acFirst

        xlApp.Visible = True
        xlWks.Activate
        xlRange.Cells(1, 1).Select
        xlApp.DisplayAlerts = False
        xlBook.SaveAs FichierXL
        xlApp.Quit
        xlApp.DisplayAlerts = True

        Set xlRange = Nothing
        Set xlWks = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
        MsgBox "Fin du travail"

        J'ai pas bien compris ce que cela fait...Le "forms" c le nom de la table? le "[MonFormulaire]" c le formulaire ou on entre les données dans la table?et les champs st les champs que l'on va utiliser pour former le tableau sous excel?

        Tu pourrais m'expliquer tout ceci stp?

        Mici d'avance a+
        0
    6. Salut,

      J'ai créé une table access que j'ai nommé [ MaTable ], ayant
      pour champs [ Champs1 - Champs2 - Champs3 ].
      J'ai créé une requête que j'ai nommé [ MaRequete ], celle-ci
      récupère tous les enregistrements de ma table.
      J'ai créé un formulaire que j'ai nommé [ MonFormulaire ].

      Donc, le formulaire pointe sur la requête et la requête pointe
      sur la table.

      J'ai placé un bouton sur mon formulaire que j'ai accroché
      a une procédure événementiel.
      Private Sub cmd_Execute_Click()
          Call Fonctions.InitialiseExcel
      End Sub
      
      
      'Afin de renseigner la propriété [RecordCount]
      DoCmd.GoToRecord , , acLast 
      'Capture le nombre d'enregistrement
      Cmpt = Forms![MonFormulaire].Recordset.RecordCount 
      'Retourne au premier enregistrement
      DoCmd.GoToRecord , , acFirst 
      
      ' Boucle sur tous les enregistrements
      For Boucle = 1 To Cmpt 
        'Place en position [Boucle,1] la valeur du premier champs
        xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1] 
        'Place en position [Boucle,1] la valeur du second champs
        xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2] 
        'Place en position [Boucle,1] la valeur du troisième champs
        xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3] 
        'Enregistrement suivant
        DoCmd.GoToRecord , , acNext 
      Next Boucle 
      'Retourne au premier enregistrement
      DoCmd.GoToRecord , , acFirst 
      
      'Fermeture de Excel
      'Rend Excel visible
      xlApp.Visible = True
      'Active le classeur 
      xlWks.Activate 
      'Positionnement en [ A1 ]
      xlRange.Cells(1, 1).Select
      'Message d'erreur en arrêt 
      xlApp.DisplayAlerts = False
      'Sauvegarde du fichier Excel créé. 
      xlBook.SaveAs FichierXL 
      'Ferme l'application Excel
      xlApp.Quit
      'Message d'erreur actif
      xlApp.DisplayAlerts = True 
      
      'Libération des variables
      Set xlRange = Nothing 
      Set xlWks = Nothing 
      Set xlBook = Nothing 
      Set xlApp = Nothing 
      
      MsgBox "Fin du travail" 
      


      Lupin
      </pre>
      0
      1. J'ai fait exactement come toi avec les mm nom pr tester et sa ne marche pas...Il ne me reconait pas le "Call Fonctions.InitialiseExcel" et je c pa trop ce que cela signifie daileur!

        Dans le bouton, j'ai entrer le code la :

        Private Sub cmd_Execute_Click()
        Call Fonctions.InitialiseExcel

        End Sub

        Sub InitialiseExcel()

        Dim xlApp, xlBook, xlRange As Variant 'Objets classeur
        Dim xlWks, iRows, iCols, iRotate As Variant 'Objets feuille
        Dim FichierXL As String
        Dim Boucle, Cmpt As Integer
        '
        FichierXL = "C:\WINDOWS\Bureau\Maintenance\PréventifMill1bis2.xls"
        'Création de l'objet Excel (main mise sur !)
        Set xlApp = CreateObject("Excel.Application")
        'Création de l'objet [Fichier Excel]
        Set xlBook = xlApp.Workbooks.Open(FichierXL)
        'Création de l'objet [Feuille] du classeur Excel.
        Set xlWks = xlBook.Worksheets(1)
        'Création de la plage permise dans la feuille Excel.
        Set xlRange = xlWks.Range("A1:A65535")

        'Afin de renseigner la propriété [RecordCount]
        DoCmd.GoToRecord , , acLast 'Capture le nombre d'enregistrement
        Cmpt = Forms![MonFormulaire].Recordset.RecordCount 'Retourne au premier enregistrement
        DoCmd.GoToRecord , , acFirst

        ' Boucle sur tous les enregistrements
        For Boucle = 1 To Cmpt 'Place en position [Boucle,1] la valeur du premier champs
        xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1] 'Place en position [Boucle,1] la valeur du second champs
        xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2] 'Place en position [Boucle,1] la valeur du troisième champs
        xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3] 'Enregistrement suivant
        DoCmd.GoToRecord , , acNext Next Boucle 'Retourne au premier enregistrement
        DoCmd.GoToRecord , , acFirst

        'Fermeture de Excel
        'Rend Excel visible
        xlApp.Visible = True
        'Active le classeur xlWks.Activate 'Positionnement en [ A1 ]
        xlRange.Cells(1, 1).Select
        'Message d'erreur en arrêt xlApp.DisplayAlerts = False
        'Sauvegarde du fichier Excel créé. xlBook.SaveAs FichierXL 'Ferme l'application Excel
        xlApp.Quit
        'Message d'erreur actif
        xlApp.DisplayAlerts = True

        'Libération des variables
        Set xlRange = Nothing Set xlWks = Nothing Set xlBook = Nothing Set xlApp = Nothing

        MsgBox "Fin du travail"

        End Sub

        Tu vois ce qui ne vas pa? (je debute en vba dc je compren pa gd chose lol)

        Merci de ton aide...
        0
    7. re:

      Sous acces, lorsque tu ouvre ta base, tu vois les objets
      suivants dans la colonne de gauche.

      Tables
      Requetes
      Formulaires
      États
      Pages
      Macros
      Modules

      Rend toi à la section [ Modules ]
      Crée un nouveau module et colle-y la procédure
      Sub InitialiseExcel()

      Maintenant, par défaut le nom du nouveau module
      est [ Module1 ], soit tu le renomme, soit tu appelleras
      la procédure par :

      Call Module1.InitialiseExcel

      dans mon exemple, je renommer le module par [ Fonctions ]

      d'ou mon exemple : Call Fonctions.InitialiseExcel

      maintenant, dans ton formulaire, si tu as rajouter le bouton,
      dans les propriétés [ OnClic ] -> procédure événementiel ->

      tu y place :
      Call Module1.InitialiseExcel
      ou
      Call Fonctions.InitialiseExcel

      ça devrait tourner comme ça!

      Lupin
      0
      1. Je commence a comprendre doucement mais surment!
        J'ai créer donc le module que tu m'as di mais lorsque je clic sur le bouton, il ne me reconait pa les lignes de code suivante :

        DoCmd.GoToRecord , , acNext Next Boucle 'Retourne au premier enregistrement
        en supriman "Next Boucle 'Retourne au premier enregistrement" cela marche!

        'Libération des variables
        Set xlRange = Nothing Set xlWks = Nothing Set xlBook = Nothing Set xlApp = Nothing

        la ligne ci dessus non plus n'est pas reconnu...

        Ta une idée de ce qui ne va pa? (moi pa du tt lol)

        Merci bcq!!
        0
        1. Mici bcq ca marche!
          Sauf que je voudrais que en appuyant sur le bouton cela me crée une nouvelle feuille dans le fichier excel défini (pour comparer la feuille ou il y a le tableau initial avec la nouvelle feuille créée en fonction des données entrées par l'utilisateur)
          Alor que la ca minssere tout dans la mm feuille!

          Quelle ligne de code dois-je rajouter pour faire ceci?

          Mici de ton aide
          0
          1. re:

            Pour ajouter une feuille a chaque exécution :

            Modifier les lignes suivantes :
               'Création de l'objet [Feuille] du classeur Excel.
               Set xlWks = xlBook.Worksheets(1)
            

            par :
               'Création de l'objet [Feuille] du classeur Excel.
               xlApp.ActiveWorkbook.Worksheets.Add
               Set xlWks = xlBook.ActiveSheet
            


            Lupin
            0
            1. Slt!
              Merci pour ton code ca marche nickel c super!
              Mais j'ai encore quelque prob :
              Comen faire pour laisser ouvert le fichier excel apres avoir cliqué sur le bouton? (car actuelement apres avoir cliqué sur le bouton le tableau est créer mé le fichier excel se referme et je dois louvrir manuelement)
              et j'ai un probleme o niveau de la mise en page du tableau, je voudrais que le Champs1 forme la 1ere colone, le Champs2 la 1er ligne et le champs3 le centre de mon tableau (reste)...
              Comment pourrais-je faire ceci automatiquement (en cliquant sur mon bouton) ?
              (actuelement ca met champs1 1ere colone; champs2 2eme col; champs3 3eme col)

              Merci de ton aide (et dsl detre ossi nul en vba lol)
              a+
              0
              1. Salut,

                Pour la fermeture , ça se passe ici :
                'Fermeture de Excel
                'Rend Excel visible
                xlApp.Visible = True
                'Active le classeur 
                xlWks.Activate 
                'Positionnement en [ A1 ]
                xlRange.Cells(1, 1).Select
                'Message d'erreur en arrêt 
                xlApp.DisplayAlerts = False
                'Sauvegarde du fichier Excel créé. 
                xlBook.SaveAs FichierXL 
                'Ferme l'application Excel
                xlApp.Quit
                'Message d'erreur actif
                xlApp.DisplayAlerts = True 
                

                La ligne qui ferme Excel est la suivante :
                'Ferme l'application Excel
                xlApp.Quit

                Pour la mise en page, je ne peux te pondre ça la tout de suite.
                Je te rapporte quelques lignes plus tard !

                Lupin
                0
                1. ok merci (c t tt con le truc pour garder le fichier excel ouvert!) jcomprend mieu mintenan!!

                  Pour la disposition du tableau (champs1 1ere col; champs2 2eme col; champs 3 le milieu du tablo), j'arrive a le faire en manuel (formulaire-nouvo-Assistant tableau croisé dynamik) mais ce que je veux c automatiser cela ; dc par code ce que jarive pas snif!

                  Mici bcq de ton aide!
                  +++
                  0
                  1. Re:

                    la, je suis pas sur ! En somme une fois le tableau Excel créé,
                    tu crées un tableau dynamique croisé avec le résultat et
                    cette mise en page te convient ?

                    bien entendu, il est possible par VBA de créer un tableau
                    dynamique croisé. Est-ce bien cela, la création d'un tableau
                    dynamique croisé fera ce que tu cherche ?

                    Lupin
                    0
                    1. Ben en fait faire un tableau croisé dynamique me permet davoir un tableau avec la mise en forme que je souhaite ( mé je dois assigner manuelemen chacun de mes 3 champs dans la 1ere ligne, 1ere colone et o centre du tableau) dc manuelemen jarive a faire cke je veu...
                      Cependant j'aimerais automatiser cete tache c a dire par code dire que le champs1 je veux kil constitue la 1ere colone de mon tableau, le champs2 la 1ere ligne et le champs3 le cendre de mon tableau.

                      Tu as compris ou je veu en venir? C possible de faire cela par code?

                      Merci de ton aide...
                      0
                      1. Slt! merci pour ton code il marche bien, c t exactement ce que javé besoin! Mais il reste n derniere petit détail :
                        en fait dans mon champs2 joré une série de chiffre (de 1 a 52) et je voudrais que lorsqu'on crée le tableau, les différents chiffres soient classés par ordre croissan...
                        C possible? Quesque t'en pense?
                        Merci de ton aide +++
                        0
                        1. Hello! en testant mon appli access je me suis rendu compte d'un probleme : en fait il est possible qu'il y é plusieur fois les mm valeur dans le champs1 et le champs2 , et que seule la valeur du champs3 différe...
                          Quand je génére le tableau sous excel, il me rajoute une ligne lorsque les champs1 et 2 st les mm (cki me fait un tableau un peu fouilli)
                          Tout ceci, c'est parce que mon champs1 c le num de la semaine ; le champs2 un travail précis et le champs3 une case a cocher (qd le travail é fait). Or, il peu arriver qu'un mm travail soit fait a plusieurs semaines (ex sem 1-15-50) dc il faudrai que lorsque je génére le tableau sous excel, dans le k ou un travail a été fait plusieur fois a plusieur semaine d'intervalle que cela reste sur une ligne (ex: semaine1 5 15
                          changement charbons moteur oui oui oui

                          Avez vous compris? Suis je assez clair?

                          Es-il possible de remédier a ce probleme?

                          Merci de votre aide
                          0
                          1. Salut,

                            de simple requête dans access te permettrons de gérer
                            tout ça. Ordre croissant, dédoublement de valeur !

                            en fait je ne vais pas coder tout ton appli. Je te donne des
                            exemples pour te mettre sur la piste mais je ne peux faire
                            le travail pour toi !

                            Lupin
                            0
                            • 1
                            • 2