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
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
A voir également:
- Transposer plusieurs colonnes en lignes
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Word colonnes indépendantes - Guide
- Partager photos en ligne - Guide
- Site de vente en ligne particulier - Guide
- Inverser deux colonnes excel - Guide
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
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
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
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
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
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
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
11 mai 2018 à 02:46
Bonsoir Via,
Voici le lien :
https://www.cjoint.com/c/HElaSjfAmLA
Encore merci pour ton aide,
Philippe
Voici le lien :
https://www.cjoint.com/c/HElaSjfAmLA
Encore merci pour ton aide,
Philippe
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
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
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
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
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
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
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
12 mai 2018 à 20:49
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
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
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
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
10 mai 2018 à 18:29
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
10 mai 2018 à 21:45
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