Transposer plusieurs lignes -> plusieurs colonnes

Résolu/Fermé
PhilippeC - 10 mai 2018 à 15:51
ikar0415 Messages postés 5 Date d'inscription jeudi 10 mai 2018 Statut Membre Dernière intervention 14 mai 2018 - 14 mai 2018 à 15:00
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

4 réponses

via55 Messages postés 14502 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 9 décembre 2024 2 736
10 mai 2018 à 18:09
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

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
1
ikar0415 Messages postés 5 Date d'inscription jeudi 10 mai 2018 Statut Membre Dernière intervention 14 mai 2018
10 mai 2018 à 18:29
Merci beaucoup M. 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
0
ikar0415 Messages postés 5 Date d'inscription jeudi 10 mai 2018 Statut Membre Dernière intervention 14 mai 2018
10 mai 2018 à 21:45
Re-bonjour Via,

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
0
via55 Messages postés 14502 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 9 décembre 2024 2 736
11 mai 2018 à 01:07
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
1
ikar0415 Messages postés 5 Date d'inscription jeudi 10 mai 2018 Statut Membre Dernière intervention 14 mai 2018
11 mai 2018 à 02:46
Bonsoir Via,
Voici le lien :
https://www.cjoint.com/c/HElaSjfAmLA
Encore merci pour ton aide,
Philippe
0
via55 Messages postés 14502 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 9 décembre 2024 2 736
11 mai 2018 à 13:38
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
1
ikar0415 Messages postés 5 Date d'inscription jeudi 10 mai 2018 Statut Membre Dernière intervention 14 mai 2018
12 mai 2018 à 19:41
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
0
via55 Messages postés 14502 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 9 décembre 2024 2 736
12 mai 2018 à 20:49
Bonsoir Philippe

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
1
ikar0415 Messages postés 5 Date d'inscription jeudi 10 mai 2018 Statut Membre Dernière intervention 14 mai 2018
14 mai 2018 à 15:00
Bonjour Via,
Je te remercie chaleureusement pour cette réponse qui vient, je pense, clôturer le sujet !
L'occasion de louer une nouvelle fois ces espaces d'échange et l'investissement de tous ceux qui les animent.
A bientôt,
Philippe
0