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 :

Regrouper données plusieurs feuilles dans une seule feuille


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Avril 2012
    Messages : 113
    Points : 152
    Points
    152
    Par défaut Regrouper données plusieurs feuilles dans une seule feuille
    Bonjour à tous,

    Je travaille sur une macro me permettant de regrouper toutes les données de plusieurs feuilles dans une seule feuille (toutes les feuilles en question se trouvant dans le même fichier Excel), avec quelques détails d'affichage du résultat. Voici toutes les étapes dont j'ai besoin :

    1. Regrouper toutes les données des feuilles du fichier dans une seule feuille "Liste"
    2. Mise en forme : supprimer les lignes vides qui ont pu être collées dans la feuille "Liste", et supprimer la mise en forme des bordures de tableau
    3. Tri sur la colonne "C" qui contient des dates, de la plus ancienne à la plus récente
    4. Compter le nombre de lignes de la feuille "Liste" pour afficher le nombre total dans une cellule

    Et il faudrait que tout ce listing soit remplacé par le nouveau à chaque activation de la macro.

    J'ai déjà un gros pavé de code, qui est le résultat d'un regroupement de plusieurs macros trouvées ici et là sur le web :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Sub Liste_Résultats()
     
    Dim dlgR As Integer, dlgi As Integer
    Dim i As Byte
     
    'Sélectionne la feuille récapitulative et supprime les résultats précédents
    Sheets("Liste").Activate
    Range("A:D").Cells.Clear
     
    'Liste les données de toutes les autres feuilles dans la feuille "Liste"
    For i = 1 To Worksheets.Count
        If UCase(Sheets(i).Name) <> "Liste" Then
            dlgR = Sheets("Liste").Range("A" & Rows.Count).End(xlUp).Row
            With Sheets(i)
                dlgi = .Range("A" & Rows.Count).End(xlUp).Row
                .Range("A2:D" & dlgi).Copy Sheets("Liste").Range("A" & dlgR + 1)
            End With
        End If
    Next
     
    'Supprime les éventuelles lignes vides
    Range("A1:A65536").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
     
    'Supprime les bordures de tableau
    Cells.Select
       With Selection
           .Borders(xlDiagonalDown).LineStyle = xlNone
           .Borders(xlDiagonalUp).LineStyle = xlNone
           .Borders(xlEdgeLeft).LineStyle = xlNone
           .Borders(xlEdgeTop).LineStyle = xlNone
           .Borders(xlEdgeBottom).LineStyle = xlNone
           .Borders(xlEdgeRight).LineStyle = xlNone
           .Borders(xlInsideVertical).LineStyle = xlNone
           .Borders(xlInsideHorizontal).LineStyle = xlNone
           .Interior.ColorIndex = xlNone
       End With
     
    'Tri par date, de la plus ancienne à la plus récente
    Columns("C:C").Select
        ActiveWorkbook.Worksheets("Liste").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Liste").Sort.SortFields.Add Key:=Range("C1"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Liste").Sort
            .SetRange Range("A1:D65536")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        ActiveWindow.SmallScroll Down:=-15
     
    'Compte le nombre de lignes pour inscrire le résultat
    Dim NbLig As Integer
        NbLig = Cells.SpecialCells(xlCellTypeLastCell).Row
     
    Worksheets("Liste").Range("K:K").Cells.Clear
    Worksheets("Liste").Range("K5").Value = "Total : " & NbLig
     
    End Sub
    Problème : tout fonctionne, sauf que les résultats des différentes feuilles apparaissent plusieurs fois dans la feuille "Liste", ce qui devraient évidemment ne pas être le cas.

    Si quelqu'un a le courage de se pencher sur mon patchwork de code... Merci beaucoup d'avance !

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Ysae68 Voir le message
    J'ai déjà un gros pavé de code, qui est le résultat d'un regroupement de plusieurs macros trouvées ici et là sur le web :
    Mauvaise idée.

    les résultats des différentes feuilles apparaissent plusieurs fois dans la feuille "Liste", ce qui devraient évidemment ne pas être le cas.
    Je ne comprends pas.
    Est-ce que tu veux dire que le traitement précédent n'est pas supprimé avec que les nouvelles données soient implantées ?

    Si c'est le cas, essaye de remplacer Range("A:D").Cells.Clear par UsedRange.EntireRow.Delete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:A65536").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Ca ce n'est pas une très bonne idée.
    Si tes données ne font que quelques centaines de ligne, ton code se paye le Delete de 65 000 lignes pour rien.
    Si, à l'opposé, tes données font plus de 66000 lignes (ce qui est possible avec les versions d'Excel qui ne sont pas antédiluviennes), une partie ne sera pas effacée.

    Il vaudrait mieux écrire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1", Cells(Rows.Count, 1).End(xlup)).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intersection(UsedRange, Columns(1)).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Membre habitué
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Avril 2012
    Messages : 113
    Points : 152
    Points
    152
    Par défaut
    Merci pour la réponse

    Citation Envoyé par Menhir Voir le message
    Mauvaise idée.
    Ah mais je m'en doute, simplement ne sachant écrire du VBA en partant de 0, je bricole avec ce que je trouve


    Citation Envoyé par Menhir Voir le message
    Est-ce que tu veux dire que le traitement précédent n'est pas supprimé avec que les nouvelles données soient implantées ?
    Les résultats précédents sont bien effacés à chaque lancement de la macro, et ensuite les données des différentes feuilles sont listées deux fois dans la feuille récapitulative lors de l'exécution du script (alors qu'évidemment ils ne devraient l'être qu'une seule fois).


    Citation Envoyé par Menhir Voir le message
    Si tes données ne font que quelques centaines de ligne, ton code se paye le Delete de 65 000 lignes pour rien.
    A peine environ une centaine de lignes au total, mais comme les données des différentes feuilles changent régulièrement, j'aimerai éviter de devoir les copier/coller manuellement dans la feuille récapitulative à chaque fois...

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour !

    Citation Envoyé par Ysae68 Voir le message
    Regrouper données plusieurs feuilles dans une seule feuille
    Voir déjà la contribution du même nom dans le sous-forum d'Excel Contribuez !

    ___________________________________________________________________________________________________________
    Je suis Paris, New-York, Mogadicio, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Ysae68 Voir le message
    ne sachant écrire du VBA en partant de 0, je bricole avec ce que je trouve
    Comme le côté obscure de la Force, c'est un chemin plus rapide et plus séduisant.
    Une solution plus efficace à moyen terme serait d'acquérir un minimum de connaissances de base en se formant.
    http://bidou.developpez.com/article/VBA/

    Les résultats précédents sont bien effacés à chaque lancement de la macro, et ensuite les données des différentes feuilles sont listées deux fois dans la feuille récapitulative lors de l'exécution du script (alors qu'évidemment ils ne devraient l'être qu'une seule fois).
    A priori, je ne vois rien dans ton code qui explique ce phénomène.
    Est-ce que ça ne viendrait pas des données sources ?

    A peine environ une centaine de lignes au total, mais comme les données des différentes feuilles changent régulièrement, j'aimerai éviter de devoir les copier/coller manuellement dans la feuille récapitulative à chaque fois...
    Ce n'était pas l'objet de ma remarque.
    Je signalais juste que ce Delete sur 65 000 lignes dans ton code fait un énorme travail inutile ce qui génère certainement des ralentissement et qu'il est possible d'écrire des instructions plus efficaces.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 729
    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 : 12 729
    Points : 28 555
    Points
    28 555
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comme la relevé très justement Menhir que je salue au passage, voir une fonction "clé sur porte" proposée dans cette contribution titrée Regrouper plusieurs feuilles sur une autre. (2003-2010)
    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

  7. #7
    Membre habitué
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Avril 2012
    Messages : 113
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Comme le côté obscure de la Force, c'est un chemin plus rapide et plus séduisant.
    Ca je ne te le fais pas dire ! Bon, à terme il faudrait effectivement que je me penche sérieusement là-dessus, surtout que c'est un besoin qui revient régulièrement. Merci pour le lien

    Citation Envoyé par Menhir Voir le message
    A priori, je ne vois rien dans ton code qui explique ce phénomène.
    Est-ce que ça ne viendrait pas des données sources ?
    Non, j'ai bien vérifié, et j'ai également essayé en ne gardant que cette partie du code (sait-on jamais) :

    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
    Dim dlgR As Integer, dlgi As Integer
    Dim i As Byte
     
    'Sélectionne la feuille récapitulative et supprime les résultats précédents
    Sheets("Liste").Activate
    Range("A:D").Cells.Clear
     
    'Liste les données de toutes les autres feuilles dans la feuille "Liste"
    For i = 1 To Worksheets.Count
        If UCase(Sheets(i).Name) <> "Liste" Then
            dlgR = Sheets("Liste").Range("A" & Rows.Count).End(xlUp).Row
            With Sheets(i)
                dlgi = .Range("A" & Rows.Count).End(xlUp).Row
                .Range("A2:D" & dlgi).Copy Sheets("Liste").Range("A" & dlgR + 1)
            End With
        End If
    Next

    Sinon, j'avais déjà trouvé ce topic précédemment, mais le code est un peu difficile à adapter quand on ne s'y connait pas, d'où mes recherches d'un script plus court sur le web.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 729
    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 : 12 729
    Points : 28 555
    Points
    28 555
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je n'ai pas regardé l'ensemble de ton code mais cette ligne m'interpelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If UCase(Sheets(i).Name) <> "Liste" Then
    car effectuer ce test ou ne rien tester c'est du pareil au même
    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

  9. #9
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Bravo Philippe , je ne l'avais pas remarquée celle-là.

    Donc le mystère est levé, tes données sont dupliquées parce que recopiées de la feuille de synthèse.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/03/2016, 17h28
  2. [XL-2013] Compiler données de plusieurs classeurs dans une seule feuille
    Par Myrddyne dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/02/2016, 20h19
  3. [XL-2007] Copier plusieurs feuilles de plusieurs fichier dans une seule feuille
    Par QcSylvanio dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/10/2012, 23h02
  4. [Toutes versions] Macro regroupant plusieurs classeurs dans une seule feuille
    Par lisandjo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/04/2012, 08h52
  5. Réponses: 4
    Dernier message: 26/11/2009, 13h00

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