Transposer plusieurs lignes -> plusieurs colonnes
Résolu
PhilippeC
-
ikar0415 Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
ikar0415 Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un tableau avec en 1re colonne des ID, en 2e colonne des dates de mesure, et en 3e colonne des résultats de mesure :
Colonne_1 Colonne_2 Colonne_3
ID1 ID1_date_M1 ID1_M1
ID1 ID1_date_M2 ID1_M2
ID2 ID2_date_M1 ID2_M1
ID3 ID3_date_M1 ID3_M1
ID3 ID3_date_M2 ID3_M2
ID3 ID3_date_M3 ID3_M3
...
Je cherche une formule pour réorganiser ce tableau afin d'obtenir comme résultat :
Colonne_1 Colonne_2 Colonne_3 Colonne_4 Colonne_5 Colonne_6
ID1 ID1_date_M1 ID1_M1 ID1_date_M2 ID1_M2
ID2 ID2_date_M1 ID2_M1
ID3 ID3_date_M1 ID3_M1 ID3_date_M2 ID3_M2 ID3_date_M3 ID3_M3
...
Une solution a été proposée dans le passé par via55, mais le fichier cjoint n'est plus accessible...
Merci pour votre aide,
Philippe
J'ai un tableau avec en 1re colonne des ID, en 2e colonne des dates de mesure, et en 3e colonne des résultats de mesure :
Colonne_1 Colonne_2 Colonne_3
ID1 ID1_date_M1 ID1_M1
ID1 ID1_date_M2 ID1_M2
ID2 ID2_date_M1 ID2_M1
ID3 ID3_date_M1 ID3_M1
ID3 ID3_date_M2 ID3_M2
ID3 ID3_date_M3 ID3_M3
...
Je cherche une formule pour réorganiser ce tableau afin d'obtenir comme résultat :
Colonne_1 Colonne_2 Colonne_3 Colonne_4 Colonne_5 Colonne_6
ID1 ID1_date_M1 ID1_M1 ID1_date_M2 ID1_M2
ID2 ID2_date_M1 ID2_M1
ID3 ID3_date_M1 ID3_M1 ID3_date_M2 ID3_M2 ID3_date_M3 ID3_M3
...
Une solution a été proposée dans le passé par via55, mais le fichier cjoint n'est plus accessible...
Merci pour votre aide,
Philippe
A voir également:
- Transposer plusieurs colonnes en lignes
- Formule moyenne excel plusieurs colonnes - Guide
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Comment faire des colonnes sur word - Guide
- Partager photos en ligne - Guide
- Mètre en ligne - Guide
4 réponses
Bonjour Philippe
Je ne me rappelle pas la solution que j'avais proposé d'autant plus que tu ne dis pas de quel post il s'agit
Proposition par macro pour des données en A, B, C sur la première feuille et qu'on transpose sur une seconde feuille (adapter la macro si nécessaire pour les noms des feuilles)
Alt+F11 pour ouvrir l'éditeur VBA puis Insertion - Module puis copier la macro dans la page, la modifier éventuellement et fermer l'éditeur
Lancer la macro depuis la feuille 1
Cdlmnt
Via
Je ne me rappelle pas la solution que j'avais proposé d'autant plus que tu ne dis pas de quel post il s'agit
Proposition par macro pour des données en A, B, C sur la première feuille et qu'on transpose sur une seconde feuille (adapter la macro si nécessaire pour les noms des feuilles)
Alt+F11 pour ouvrir l'éditeur VBA puis Insertion - Module puis copier la macro dans la page, la modifier éventuellement et fermer l'éditeur
Lancer la macro depuis la feuille 1
Sub transposition() Dim ligne1 As Long, ligne2 As Long ligne1 = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row 'derniere ligne remplie 1ere colonne feuille 1 For n = 2 To ligne1 nbID = Application.WorksheetFunction.CountIf(Sheets("Feuil1").Range("A1:A" & n), Sheets("Feuil1").Range("A" & n)) ' NB.SI sur l'ID depuis le début de la colonne If nbID = 1 Then ligne2 = Sheets("Feuil2").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1 'première ligne vide colonne 1 feuille 2 Sheets("Feuil2").Range("A" & ligne2) = Sheets("Feuil1").Range("A" & n) Else ligne2 = Sheets("Feuil2").Columns(1).Find(Sheets("Feuil1").Range("A" & n), , , xlWhole, xlByColumns, xlPrevious).Row 'ligne de l'ID dans feuille 2 End If Sheets("Feuil2").Cells(ligne2, nbID * 2) = Sheets("Feuil1").Range("B" & n) Sheets("Feuil2").Cells(ligne2, nbID * 2 + 1) = Sheets("Feuil1").Range("C" & n) Next End Sub
Cdlmnt
Via
Re,
Bizarre ! si cette erreur apparaît c'est vraisemblablement que le macro ne trouve pas en feuille 2 l'ID de la feuille 1 qui devrait normalement déjà y être inscrit puisque cette ligne de macro ne s'exécute que si le NB.SI donne un autre résultat que 1 (un nombre supérieur donc l'ID est déjà présent dans la plage en col A qui précède)
La macro fonctionne correctement chez moi
Impossible d'en dire plus sans voir ton fichier et l'erreur se produire, donc si tu peux le poster sur cjoint.com je regarderai
Cdlmt
Via
Bizarre ! si cette erreur apparaît c'est vraisemblablement que le macro ne trouve pas en feuille 2 l'ID de la feuille 1 qui devrait normalement déjà y être inscrit puisque cette ligne de macro ne s'exécute que si le NB.SI donne un autre résultat que 1 (un nombre supérieur donc l'ID est déjà présent dans la plage en col A qui précède)
La macro fonctionne correctement chez moi
Impossible d'en dire plus sans voir ton fichier et l'erreur se produire, donc si tu peux le poster sur cjoint.com je regarderai
Cdlmt
Via
Bonjour Philippe
Rien de méchant, en fait la macro bug car ta feuille 2 est totalement vierge
Mets des titres en A1,B1 et C1 et ça fonctionnera
Par contre vu la longueur du fichier la macro mets un petit peu de temps
Cdlmnt
Via
Rien de méchant, en fait la macro bug car ta feuille 2 est totalement vierge
Mets des titres en A1,B1 et C1 et ça fonctionnera
Par contre vu la longueur du fichier la macro mets un petit peu de temps
Cdlmnt
Via
Chapeau bas Via : la macro fonctionne parfaitement une fois les titres mis en A1, B1 et C1 de la Feuil2.
Ta solution conviendra aux nombreux utilisateurs qui souhaitent "merger" des bases de structures différentes.
Pour élargir le champ d'application de ta méthode, pourrais-tu proposer un script convenant au cas où plusieurs mesures ont été réalisées à la même date ?
Base initiale :
Colonne_1 Colonne_2 Colonne_3 Colonne_4
ID1 ID1_date_M1 ID1_M1_1 ID1_M1_2
ID1 ID1_date_M2 ID1_M2_1 ID1_M2_2
ID2 ID2_date_M1 ID2_M1_1 ID2_M1_2
ID3 ID3_date_M1 ID3_M1_1 ID3_M1_2
ID3 ID3_date_M2 ID3_M2_1 ID3_M2_2
ID3 ID3_date_M3 ID3_M3_1 ID3_M3_2
...
Base finale souhaitée :
Colonne_1 Colonne_2 Colonne_3 Colonne_4 Colonne_5 Colonne_6 Colonne_7 Colonne_8...
ID1 ID1_date_M1 ID1_M1_1 ID1_M1_2 ID1_date_M2 ID1_M2_1 ID1_M2_2
ID2 ID2_date_M1 ID2_M1_1 ID2_M1_2
ID3 ID3_date_M1 ID3_M1_1 ID3_M1_2 ID3_date_M2 ID3_M2_1 ID3_M2_2 ID3_date_M3 ID3_M3_1...
...
Classeur test ici : https://www.cjoint.com/c/HEmrNv2rvXK
Encore merci, et bien à toi,
Philippe
Ta solution conviendra aux nombreux utilisateurs qui souhaitent "merger" des bases de structures différentes.
Pour élargir le champ d'application de ta méthode, pourrais-tu proposer un script convenant au cas où plusieurs mesures ont été réalisées à la même date ?
Base initiale :
Colonne_1 Colonne_2 Colonne_3 Colonne_4
ID1 ID1_date_M1 ID1_M1_1 ID1_M1_2
ID1 ID1_date_M2 ID1_M2_1 ID1_M2_2
ID2 ID2_date_M1 ID2_M1_1 ID2_M1_2
ID3 ID3_date_M1 ID3_M1_1 ID3_M1_2
ID3 ID3_date_M2 ID3_M2_1 ID3_M2_2
ID3 ID3_date_M3 ID3_M3_1 ID3_M3_2
...
Base finale souhaitée :
Colonne_1 Colonne_2 Colonne_3 Colonne_4 Colonne_5 Colonne_6 Colonne_7 Colonne_8...
ID1 ID1_date_M1 ID1_M1_1 ID1_M1_2 ID1_date_M2 ID1_M2_1 ID1_M2_2
ID2 ID2_date_M1 ID2_M1_1 ID2_M1_2
ID3 ID3_date_M1 ID3_M1_1 ID3_M1_2 ID3_date_M2 ID3_M2_1 ID3_M2_2 ID3_date_M3 ID3_M3_1...
...
Classeur test ici : https://www.cjoint.com/c/HEmrNv2rvXK
Encore merci, et bien à toi,
Philippe
Bonsoir Philippe
Il suffit de remplacer les 2 dernières lignes de la macro par ces 3 ci !
Le principe pour trouver la bonne formule pour avoir les dates en colonnes de 3 en 3( 2 puis 5 puis 8 ...)c'est de résoudre un système d'équation :
on veut que la date 1 soit en colonne 2 et que la date 2 soit en colonne 5 et ainsi de suite donc il faut que 1 donne 2 et que 2 donne 5 soit :
a*1+b=2 et a*2 +b=5
On résoud le système : en soustrayant 2a - a donne a, b - b donne 0 et 5 - 2 donne 3 donc a=3
En remplaçant a par 3 dans la 1ere équation on va trouver b :
3*1 + b = 2 ou 3 + b = 2 soit b = 2 - 3 donc b = -1
l'équation recherchée est de la forme y = 3x - 1
d'où dans la ligne de macro nbID * 3 - 1 pour obtenir la colonne de la date
ensuite on rajoute 1 pour la colonne suivante mesure 1 et on rajoute 2 pour la colonne d'après mesure 2
CQFD ☺
Si tu veux une option avec 3 mesures, 4 mesures ... il te suffit d'appliquer la méthode
Cdlmnt
Via
Il suffit de remplacer les 2 dernières lignes de la macro par ces 3 ci !
Sheets("Feuil2").Cells(ligne2, nbID * 3 - 1) = Sheets("Feuil1").Range("B" & n) Sheets("Feuil2").Cells(ligne2, nbID * 3) = Sheets("Feuil1").Range("C" & n) Sheets("Feuil2").Cells(ligne2, nbID * 3 + 1) = Sheets("Feuil1").Range("D" & n)
Le principe pour trouver la bonne formule pour avoir les dates en colonnes de 3 en 3( 2 puis 5 puis 8 ...)c'est de résoudre un système d'équation :
on veut que la date 1 soit en colonne 2 et que la date 2 soit en colonne 5 et ainsi de suite donc il faut que 1 donne 2 et que 2 donne 5 soit :
a*1+b=2 et a*2 +b=5
On résoud le système : en soustrayant 2a - a donne a, b - b donne 0 et 5 - 2 donne 3 donc a=3
En remplaçant a par 3 dans la 1ere équation on va trouver b :
3*1 + b = 2 ou 3 + b = 2 soit b = 2 - 3 donc b = -1
l'équation recherchée est de la forme y = 3x - 1
d'où dans la ligne de macro nbID * 3 - 1 pour obtenir la colonne de la date
ensuite on rajoute 1 pour la colonne suivante mesure 1 et on rajoute 2 pour la colonne d'après mesure 2
CQFD ☺
Si tu veux une option avec 3 mesures, 4 mesures ... il te suffit d'appliquer la méthode
Cdlmnt
Via
Je teste cette solution.
Pour mémoire, le post que j'évoquais est ici :
https://forums.commentcamarche.net/forum/affich-28953572-transposer-valeur-de-plusieurs-lignes-sur-plusieurs-colonnes
Au lancement de la macro, l'erreur suivante survient :
Erreur d'exécution `91':
Variable objet ou variable bloc With non définie
Ce qui en débogage renvoie à cette ligne de code :
ligne2 = Sheets("Feuil2").Columns(1).Find(Sheets("Feuil1").Range("A" & n), , , xlWhole, xlByColumns, xlPrevious).Row
Aurais-je oublié ou mal compris quelque chose ?
Avec mes remerciements, et bien cordialement,
Philippe C