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! :-)
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 !
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 SubEt le fichier :
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
PivotLa 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 !
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
...