Regroupement de lignes avec les mêmes valeurs

Bonjour à toutes et tous,

Comme je ne suis pas un expert en vba, je poste ma demande en espérant qu’un expert parmi vous m’aidera à trouver une solution à mon problème.

Dans la feuille "B_D", j’ai un tableau de dix colonnes et beaucoup (beaucoup) de lignes dont la longueur varie chaque année, je voudrais regrouper toutes les lignes dont le contenu de la cellule de la 2e colonne et celui de la cellule de la 3e colonne sont identiques avec les cellules de la ligne suivante aux mêmes colonnes.

Je souhaite de préférence (si c’est possible) l’utilisation de dictionnaire(s) vu leurs efficacités dans le traitement des données importantes, sinon, utilisation de tableaux avec vba.

J’ajoute qu’il serait également souhaitable (pour plus de visibilité) d’insérer une ligne vide entre chaque groupe de données.

Vous trouverez dans le fichier joint, la feuille avec une partie réduite de "B_D" ainsi que les résultats souhaités dans le feuille "Resultat".

10regrouper.zip (20.32 Ko)

Je reste à votre disposition pour d’autres informations supplémentaires.

Salutations.

Bonjour,

j’ai un tableau de dix colonnes et beaucoup (beaucoup) de lignes,

Je souhaite de préférence (si c’est possible) l’utilisation de dictionnaire(s) vu leurs efficacités dans le traitement des données importantes, sinon, utilisation de tableaux avec vba.

si cela dépasse 64000 lignes , les dictionnaires et tableaux ne marchent plus.

Je vous propose une solution simple, sans tableau ni dictionnaire, mais qui marche bien, faites l'essai.

Cdlt

Bonjour

Bonjour à tous

Une variante

17regrouper-v1.xlsm (38.25 Ko)

Bye !

Bonjour à tous !

Une proposition via Power Query (complément Microsoft gratuit à installer pour Excel 2010 et 2013. Nativement intégré dans Excel à partir de 2016) :

Si la source évolue : "Actualiser tout" via le menu pour mettre à jour le tableau retourné.

Remarque : Si un message d'erreur apparait voir ici !

Bonjour,

Autre solution, via Power Query. Ce complément est natif à partir des versions 2016, et gratuit en téléchargement sur le site de µSoft sous ce lien

Une ligne vide entre chaque "couple". La requête est chargée dans l'onglet "PQ", et se met à jour dès l'activation de cet onglet.

Pas de limites, hormis le nombre de lignes d'Excel...

Si ça le fait

Bonne journée

Edit, oups, pas rafraîchi...désolé...

Bonjour à tous de nouveau !

Edit, oups, pas rafraîchi...désolé...

@cousinhub : Ne le soyez surtout pas !

D'autant plus que ne connaissant pas cette approche, vous m'avez donné la possibilité de la travailler.

Bonjour le forum, bonjour à Arturo83, gmb, JFL et cousinhub,

Merci pour vos propositions respectives.

Quel plaisir et respect à vous tous pour le partage de vos connaissances et surtout pour votre disponibilité.

J’ai testé vos 4 propositions, elles donnent le bons résultats et répondent à mes attentes.

Comme ce problème est résolu, je me permets de vous demander une proposition dans le même ordre, mais cette fois-ci c’est pour :

  • Via un 2e bouton, regrouper toutes les lignes dont le contenu de la cellule de la 2e colonne est identique avec les cellules des lignes suivantes à la même colonne, donc on travaille seulement sur une seule colonne "B", ne pas oublier S-V-P la ligne séparatrice entre les groupes.
  • Via un 3e bouton, regrouper toutes les lignes dont le contenu de la cellule de la 3e colonne est identique avec les cellules des lignes suivantes à la même colonne, donc on travaille seulement sur une seule colonne "C", ne pas oublier S-V-P la ligne séparatrice entre les groupes.

Merci pour vos propositions.

Bonjour à tous de nouveau !

Version 2 avec sélection du mode de regroupement :

Bonjour le forum, bonjour à Arturo83 et JFL,

Merci pour les propositions mise en place pour la seconde demande.

J’ai fait mes tests, le résultat est parfait.

Grand MERCI à vous deux pour la mise à jour de ma demande.

A bientôt.

Bonsoir à tous !

Je vous remercie de ce retour.

Bonsoir à tous,

Avec un dictionnaire en m'appuyant sur la colonne B :

Option Explicit
Sub test()
Dim dico As Object, i As Long, e
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    With Sheets("B_D")
        With .Cells(1).CurrentRegion
            For i = 2 To .Rows.Count
                If Not dico.exists(.Cells(i, 2).Value) Then
                    Set dico(.Cells(i, 2).Value) = _
                    Union(.Rows(1), .Rows(i))
                Else
                    Set dico(.Cells(i, 2).Value) = _
                    Union(dico(.Cells(i, 2).Value), .Rows(i))
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = False
    With Sheets("Feuil1")
        .Cells.Clear
        For Each e In dico
            If IsEmpty(.Range("a1")) Then
                dico(e).Copy .Range("a1")
            Else
                dico(e).Copy .Range("a" & Rows.Count).End(xlUp)(3)
            End If
        Next
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

klin89

Bonjour Klin89,

Merci pour votre réponse.

Comme vous l’avez mentionné, votre code regroupe les lignes qui ont les mêmes cellules en la colonne "B", il fonctionne très bien et donne les résultats souhaités.

Toutefois, pouvez-vous S-V-P le modifier de telle manière qu’il n’ajoute pas un entête à chaque groupe, juste une ligne séparatrice. Si je savais le faire je l’aurais fait moi-même mais je vais essayer comme même.

Et comme j’y suis, je me permets de vous demander de me proposer un code qui fait la même chose mais cette fois-ci, en s’appuyant sur la colonne "C".

Merci d’avance.

Cordialement.

Re

Il faut remplacer

.Cells(i, 2).Value

par

.Cells(i, 3).Value

Sinon sans les en-têtes

Option Explicit
Sub test()
Dim dico As Object, i As Long, e
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    With Sheets("B_D")
        With .Cells(1).CurrentRegion
            For i = 2 To .Rows.Count
                If Not dico.exists(.Cells(i, 2).Value) Then
                    Set dico(.Cells(i, 2).Value) = .Rows(i)
                Else
                    Set dico(.Cells(i, 2).Value) = _
                    Union(dico(.Cells(i, 2).Value), .Rows(i))
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = False
    With Sheets("Feuil1")
        .Cells.Clear
        For Each e In dico
            If IsEmpty(.Range("a1")) Then
                dico(e).Copy .Range("a1")
            Else
                dico(e).Copy .Range("a" & Rows.Count).End(xlUp)(3)
            End If
        Next
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

klin89

Rebonjour Klin89,

Je suis vraiment désolé car il y’a eu un petit malentendu, je vous pris pour ne pas se fâcher !

Je m’explique :

Il est vrai que je ne souhaite pas garder les entêtes en haut de chaque groupe mais je souhaitais garder celui à la première ligne, que je fige lorsque je me déplace dans mon tableau.

Je m’en veux que je ne l’ai pas précisé.

Que diriez-vous de résoudre la totalité de ma demande car il manque une étape à finaliser, à savoir, que dans mon premier énoncé, j’ai demandé de regrouper toutes les lignes dont le contenu de la cellule de la 2e colonne et (+) celui de la cellule de la 3e colonne (Ensembles) sont identiques avec les cellules des lignes suivantes aux mêmes colonnes.

Désolé encore pour ce malentendu.

Cordiale poignée de mains.

Pas de soucis Harzer,

Option Explicit
Sub test()
Dim dico As Object, i As Long, e, txt As String
  Set dico = CreateObject("Scripting.Dictionary")
  dico.CompareMode = 1
  With Sheets("B_D")
    With .Cells(1).CurrentRegion
      For i = 2 To .Rows.Count
        txt = .Cells(i, 2).Value & .Cells(i, 3).Value
        If Not dico.exists(txt) Then
            If dico.Count = 0 Then
                Set dico(txt) = Union(.Rows(1), .Rows(i))
            Else
                Set dico(txt) = .Rows(i)
            End If
        Else
            Set dico(txt) = Union(dico(txt), .Rows(i))
        End If
      Next
    End With
  End With
  Application.ScreenUpdating = False
  With Sheets("Feuil1")
  .Cells.Clear
  For Each e In dico
    If IsEmpty(.Range("a1")) Then
        dico(e).Copy .Range("a1")
    Else
        dico(e).Copy .Range("a" & Rows.Count).End(xlUp)(3)
    End If
  Next
  End With
  Set dico = Nothing
  Application.ScreenUpdating = True
End Sub

klin89

Bonjour Klin89,

Merci pour votre réponse.

J’ai remarqué que cette proposition met un seul entête, c’est parfait. Grand MERCI.

J’ai remarqué également que ce code concerne le regroupement de toutes les lignes dont le contenu de la cellule de la 2e colonne ("B") + le contenu de la cellule de la 3e colonne "C" (Ensembles) sont identiques avec les cellules des lignes suivantes aux mêmes colonnes.

C’est bien ça, il n’y a pas d’erreur de ma part ?

D’après mes tests, les résultats obtenus sont corrects et le code me satisfait totalement.

Il ne me manque plus que l’entête de la première ligne pour le code qui s’appuie sur la colonne "B" et l’entête de la première ligne qui s’appuie sur la colonne "C".

A vous lire.

Merci encore.

Re Harzer,

Dans le code précédent, j'ai introduit la variable txt qui détermine la clé du dictionnaire.

Remplace la par .Cells(i, 2).Value ou .Cells(i, 3).Value pour obtenir le résultat souhaité.

If Not dico.exists(.Cells(i, 2).Value) Then

etc.....

klin89

Bonjour Klin89,

Merci pour la proposition pour finaliser ma demande et merci surtout pour votre disponibilité et patience.

Amitiés.

Rechercher des sujets similaires à "regroupement lignes memes valeurs"