Transposer plusieurs lignes d'un tableau bout à bout sur une seule ligne

Bonjour,

J'aimerais savoir s'il existe une façon (avec macros ou formules) de transposer plusieurs lignes bout à bout ayant la même valeur en colonne A d'un tableau excel sur une seule ligne? Je n'ai mis que quelques lignes en exemple mais j'en ai des milliers à traiter! :-)

25test-cyril52.xlsx (13.00 Ko)

Il faut regarder le fichier joint pour comprendre ce que je veux, tout est expliqué dedans.

Merci beaucoup pour vos éventuelles réponses.

Bonsoir à tous !

Et....

Une approche Power Query (nativement intégré dans Excel depuis 2016) :

Si le tableau structuré inséré (tSource) évolue, faire "Actualiser tout " pour mettre à jour le tableau retourné.

Génial!!!

C'est parfait! Je ne sais pas utiliser ce "Power Query" mais ça marche très bien quand je fais évoluer le tableau tSource.

Vraiment, un grand merci JFL.

Bonsoir à tous de nouveau !

Bien...

Je vous remercie de ce retour.

Je ne peux que vous inciter à découvrir cet outil. Il deviendra rapidement votre meilleur ami.....

Il existe une multitude de tutoriels sur le Net pour vous guider, à votre rythme, dans les premiers apprentissages. A consommer sans modération.

Bonsoir,

JFL Bonsoir,

perso je suis "allergique" au PQ ! Ce n'est pas facile à vivre, alors je vous propose un code VBA :

Sub LRD()
    Dim IDMère, IDMémoire, TabS, TabR()
    Dim ColR, LigR
    Dim EnCours As Boolean

    ' on récupère les données du tableau source, ici cela donnera un tableau de 7 lignes et 5 colonnes
    TabS = Sheets("Feuil1").Range("TabSo")

    ' on dimensionne un tableau "réponse" sur 13 lignes correspondant aux 13 colonnes finales
    ' et sur 1 colonne, correspondant au nombre de ligne final
    ' pourquoi cette inversion ?
    ' car VBA n'autorise pas de redimensionner un tableau sur la "première taille"
    ColR = 0
    LigR = 1
    ' pas d'IDMère en mémoire
    IDMémoire = ""

    ' on boucle sur les lignes du tableau source
    For i = 1 To UBound(TabS)
        ' on garde la main dans le cas où il faudrait stopper le code
        DoEvents
        ' on rècupère la valeur de l'IDMère
        IDMère = TabS(i, 1)
        ' si l'ID est différent on commence à remplir une nouvelle colonne du tableau résultat
        If IDMère <> IDMémoire Then
            ' si l'on est pas en train de renseigner un IDMère
            If EnCours = False Then
                ' donc encours = True
                EnCours = True
                ' on met en mémoire l'IDMère que l'on va remplir
                IDMémoire = IDMère
                ' on incrémente le nombre de colonne du tableau résultat
                ColR = ColR + 1
                LigR = 1
                ' on redimensionne le tableau
                ReDim Preserve TabR(1 To 13, 1 To ColR)
                ' on rempli l'entête de la colonne avec l'IDMère
                TabR(LigR, ColR) = TabS(i, 1)
                ' on va remplir les données sexe taille et poid
                For j = 3 To 5
                    ' entre chaque donnée on incrémente le numéro de ligne
                    LigR = LigR + 1
                    ' on inscrit la donnée dans le tableau résultat
                    TabR(LigR, ColR) = TabS(i, j)
                Next j
            ' si on est en train de remplir les données d'un IDMère
            Else
                ' on a fini de renseigner l'IDMère précédent
                ' on reprend à la ligne 1 pour la nouvelle colonne
                LigR = 1
                ' donc encours = False
                EnCours = False
                ' on met en mémoire le nouvel IDMère
                IDMémoire = IDMère
                ' on incrémente le nombre de colonne du tableau résultat
                ColR = ColR + 1
                ' on redimensionne le tableau
                ReDim Preserve TabR(1 To 13, 1 To ColR)
                ' on rempli l'entête de la colonne avec l'IDMère
                TabR(LigR, ColR) = TabS(i, 1)
                ' on va remplir les données sexe taille et poid
                For j = 3 To 5
                    ' entre chaque donnée on incrémente le numéro de ligne
                    LigR = LigR + 1
                    ' on inscrit la donnée dans le tableau résultat
                    TabR(LigR, ColR) = TabS(i, j)
                Next j
            End If
        ' si c'est le même IDMère alors on continue de remplir le tableau résultat
        Else
            ' on va remplir les données sexe taille et poid
            For j = 3 To 5
                ' entre chaque donnée on incrémente le numéro de ligne
                LigR = LigR + 1
                ' on inscrit la donnée dans le tableau résultat
                TabR(LigR, ColR) = TabS(i, j)
            Next j
        End If
    Next i
    ' on inscrit le tableau résultat à partir de la cellule A3 de la Feuil2 en le transposant, je suis parti du principe que la ligne d'entête est existante
    Sheets("Feuil2").Range("A3").Resize(UBound(TabR, 2), 13) = Application.Transpose(TabR)
    Sheets("Feuil2").Range("A3").Resize(UBound(TabR, 2), 13).Borders.Color = 0
End Sub

Et le fichier :

16test-cyril52.xlsm (26.33 Ko)

J'ai mis le tableau source en Tableau structuré... Le tableau résultat pourrait aussi mais il y a des "conflits" de nom de colonne...

@ bientôt

LouReeD

Bonsoir à tous de nouveau !

@LouReed : Hello !

Pour tenter de vous attirer dans les filets de Power Query, voyez l’extrême longueur du code pour retourner le résultat attendu :

let
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    Unpivot = Table.UnpivotOtherColumns(Source, {"ID de la mère", "ID du fœtus"}, "Attribut", "Valeur"),
    ValRempl = Table.ReplaceValue(Unpivot,each [ID du fœtus],each Text.Replace([ID du fœtus], Text.From([ID de la mère])&"_","Fœtus "),Replacer.ReplaceValue,{"ID du fœtus"}),
    ColFusion = Table.CombineColumns(ValRempl,{"ID du fœtus", "Attribut"},Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),"ET"),
    Pivot = Table.Pivot(ColFusion, List.Distinct(ColFusion[ET]), "ET", "Valeur")
in
    Pivot

La vie est belle n'est-ce pas ?

Bonsoir à tous,

Pour rester dans le contexte, la longueur de la requête M ressemble davantage à un "fœtus" comparée à celle du VBA, qui est déjà plus évolué...

Mais bon, c'est bien connu, LouReeD aime rivaliser sur la longueur

Bonne nuit !

Bonsoir à tous de nouveau !

Mais bon, c'est bien connu, LouReeD aime rivaliser sur la longueur

Mais quel vilain......!

Qui ça le vilain ?

Aller bonne nuit !

@ bientôt

LouReeD

Bonjour à tous ,

Avant de me mettre à PQ (hé oui, j'ai décidé d'aller en cure me soigner ), un code VBA avec un petit effort sur la mise en forme du résultat.

...

Rechercher des sujets similaires à "transposer lignes tableau bout seule ligne"