Microsoft 365 Transposer une cellule sur 2 en colonnes

fxbrg

XLDnaute Nouveau
Bonjour à tous,
Désolé si le titre n'est pas clair, mais le besoin est très simple :)

Préalable je ne peux pas utiliser de macro (dommage parce qu'en vba c'est simple et ça marche nickel), corporate oblige...

J'importe via Power Query les données d'une courbe depuis un fichier csv. Ces données sont formatées en "ordonnée1, abscisse1, ordonnée2, abscisse2, ordonnée3, abscisse3" etc. Elles ont de longueur variable, grosso modo entre 30 et 1000 points en tout. J'ai besoin de pouvoir recréer les courbes originelles, et pour ça j'ai besoin d'un bête tableau à deux colonnes. Suite à conversion, je me retrouve avec une ligne de cellules.

Par l'exemple, je voudrais passer de ça


28​
154​
23​
156​
33​
161​
24​
163​
26​
166​

à ça (et que ce soit dynamique) pour pouvoir construire mon graph ensuite :


28​
154​
23​
156​
33​
161​
24​
163​
26​
166​

Un grand merci d'avance,

Amicalement,
JF
 

CISCO

XLDnaute Barbatruc
Bonsoir

Une solution parmi d'autres :
1696369420710.png

@ plus
 

RyuAutodidacte

XLDnaute Impliqué
Supporter XLD
Bonjour,

Autre Solution qui marche sur toute version d'Excel :

1696389133530.png


Résultat en colonne A et B :
Col A

Code:
=TRANSPOSE(INDEX($A$1:$J$1;1;{1.3.5.7.9}))
Col B
Code:
=TRANSPOSE(INDEX($A$1:$J$1;1;{2.4.6.8.10}))

OU

Résultat en colonne D et E
(Formules à étirer vers le bas) :
Col D

Code:
=TRANSPOSE(INDEX($A$1:$J$1;1;LIGNE(A1)+LIGNES($A$1:A1)-1))
Col E
Code:
=TRANSPOSE(INDEX($A$1:$J$1;1;LIGNE(A2)+LIGNES($A$1:A1)-1))

OU

Formule avec DECALER
(Formules à étirer vers le bas) :
Code:
=DECALER($A$1;0;LIGNE(A1)+LIGNES($A$1:A1)-2)
' et
=DECALER($A$1;0;LIGNE(A1)+LIGNES($A$1:A1)-1)
 
Dernière édition:

Cousinhub

XLDnaute Barbatruc
Bonjour,
Quitte à récupérer via PQ, pourquoi ne pas traiter par PQ?
Ce code te permet de mettre ta ligne sous forme de tableau à 2 colonnes
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    Transp = Table.Transpose(Source),
    Transform = Table.FromRows(List.Split(Transp[Column1],2), {"Ordonnée", "Abscisse"})
in
    Transform

Un petit fichier exemple pour illustrer
Bonne journée
 

Pièces jointes

  • PQ_Transpose ligne en 2 colonnes.xlsx
    17.3 KB · Affichages: 1

fxbrg

XLDnaute Nouveau
Wow, merci à tous! J'aime bien l'idée de Cousinhub, mais la situation est un peu plus compliquée parce que de fait, le champ "Curve data" ressemble à ça dans mon import :
(0,500,500):5355,0,5623,7,5695,10,5633,12,5598,12,5716,14,5925,19
J'ai d'abord une parenthèse avec 3 paramètres, et je fais une première conversion (sur le : pour récupérer ma chaine séparée par des virgules. Je vais essayer de faire ça dans PQ, mais c'est pas exclu que je revienne vous solliciter :)
Merci encore,
 

fxbrg

XLDnaute Nouveau
Re-,
Ton fichier d'origine est un csv? (Annule cette question, la réponse est dans le 1er fil.... oupss)
Si c'est le cas, tu peux mettre un fichier exemple?
Bonjour,
Pour le plaisir de comprendre, voici un petit fichier exemple. le champ Curve Data est le dernier. Merci d'avance!

ps : apparemment on ne peut pas joindre de csv, j'ai fait une version .xls, mais à la base c'est un csv (qui provient d'une base de donnée SQLite)
 

Pièces jointes

  • TestPQ.xls
    22.5 KB · Affichages: 3

Cousinhub

XLDnaute Barbatruc
Re-,
En mettant le bon chemin et le bon nom du fichier csv, ça pourrait donner ceci :
PowerQuery:
let
    Source = Csv.Document(File.Contents("C:\Users\cousi\Documents\Excel\exemples\PQ\Essai fxbrg.csv"),[Delimiter=",", Columns=61, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    PromoHead = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    SupprCol = Table.SelectColumns(PromoHead,{"CurveData"}),
    Extrait = Table.TransformColumns(SupprCol, {{"CurveData", each Text.AfterDelimiter(_, ":"), type text}}),
    Fract = Table.ExpandListColumn(Table.TransformColumns(Extrait, {{"CurveData", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CurveData"),
    Transform = Table.FromRows(List.Split(Fract[CurveData],2), {"Ordonnée", "Abscisse"})
in
    Transform
 

fxbrg

XLDnaute Nouveau
Re-,
En mettant le bon chemin et le bon nom du fichier csv, ça pourrait donner ceci :
PowerQuery:
let
    Source = Csv.Document(File.Contents("C:\Users\cousi\Documents\Excel\exemples\PQ\Essai fxbrg.csv"),[Delimiter=",", Columns=61, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    PromoHead = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    SupprCol = Table.SelectColumns(PromoHead,{"CurveData"}),
    Extrait = Table.TransformColumns(SupprCol, {{"CurveData", each Text.AfterDelimiter(_, ":"), type text}}),
    Fract = Table.ExpandListColumn(Table.TransformColumns(Extrait, {{"CurveData", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CurveData"),
    Transform = Table.FromRows(List.Split(Fract[CurveData],2), {"Ordonnée", "Abscisse"})
in
    Transform
Merci beaucoup, je vais tester ça :)
 

Discussions similaires

Réponses
4
Affichages
934

Statistiques des forums

Discussions
312 225
Messages
2 086 411
Membres
103 201
dernier inscrit
centrale vet