XL 2021 Trier tableau

julienha

XLDnaute Occasionnel
Bonjour,

Dans le fichier joint, j'aimerais trier le tableau A1:L19 (avec la fonction trier par éventuellement) avec les critères ci-dessous:
- la colonne L en ordre décroissant si toutes les valeurs de la colonne K sont égales à "Put"
- la colonne L en ordre croissant si toutes les valeurs de la colonne K sont égales à "Call"
- sinon trier la colonne J en ordre décroissant

Merci par avance
 

Pièces jointes

  • trier.xlsm
    18.8 KB · Affichages: 13

oguruma

XLDnaute Occasionnel
Je suis parti de ton fichier de ton 1er Post

la solution toute simple en fait

let
Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
//****************************************************************************************
//* On retient les non NULL
//****************************************************************************************
TB_NON_NULL = Table.SelectRows(Source, each [Colonne1] <> null),
NB_NON_NULL = Table.RowCount(TB_NON_NULL),

//****************************************************************************************
//* On calule le nombre de PUT
//****************************************************************************************
TB_PUT = Table.SelectRows(TB_NON_NULL, each [#"C/P"] = "Put"),
NB_PUT=Table.RowCount(TB_PUT),

//****************************************************************************************
//* On calule le nombre de CALL
//****************************************************************************************
TB_CALL = Table.SelectRows(TB_NON_NULL, each [#"C/P"] = "Call"),
NB_CALL=Table.RowCount(TB_CALL),

//****************************************************************************************
//* Préparation des tris pour la syntaxe à retenir
//****************************************************************************************
// TRI_ASCENDING = Table.Sort(TB_NON_NULL,{{"Strike", Order.Ascending}}),
//TRI_DESCENDING = Table.Sort(TB_NON_NULL,{{"Strike", Order.Descending}}),
//AUTRE_TRI= Table.Sort(TB_NON_NULL,{{"Side", Order.Descending}}),
//****************************************************************************************

SORT=if NB_NON_NULL = NB_PUT
then Table.Sort(TB_NON_NULL,{{"Strike", Order.Descending}})
else if NB_NON_NULL = NB_CALL
then Table.Sort(TB_NON_NULL,{{"Strike", Order.Ascending}})
else Table.Sort(TB_NON_NULL,{{"Side", Order.Descending}})
in
//TB_NON_NULL
// TB_CALL
// TB_PUT
// NB_PUT
// NB_CALL
SORT
 

Pièces jointes

  • OGURUMA_TRIER_1.0.xlsm
    227.7 KB · Affichages: 7

oguruma

XLDnaute Occasionnel
suite à cette première livraison tu as déjà une bonne base de départ. Sur la toile il y a de nombreux PDF qui traitent du sujet... certains ont été longtemps sur mon chevet. Faut que je les retrouve... je les posterai :)
après sans de PUB il y a un très bon ouvrage aux éditions ENI.... qui traite du sujet... une 20taine d'euros.. pas une ruine mais un investissement ;)
 

julienha

XLDnaute Occasionnel
Pas tout compris.... on dirait que mon post n'a pas été enregistré.....
Je suis parti de ton fichier de ton 1er Post

la solution toute simple en fait

let
Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
//****************************************************************************************
//* On retient les non NULL
//****************************************************************************************
TB_NON_NULL = Table.SelectRows(Source, each [Colonne1] <> null),
NB_NON_NULL = Table.RowCount(TB_NON_NULL),

//****************************************************************************************
//* On calule le nombre de PUT
//****************************************************************************************
TB_PUT = Table.SelectRows(TB_NON_NULL, each [#"C/P"] = "Put"),
NB_PUT=Table.RowCount(TB_PUT),

//****************************************************************************************
//* On calule le nombre de CALL
//****************************************************************************************
TB_CALL = Table.SelectRows(TB_NON_NULL, each [#"C/P"] = "Call"),
NB_CALL=Table.RowCount(TB_CALL),

//****************************************************************************************
//* Préparation des tris pour la syntaxe à retenir
//****************************************************************************************
// TRI_ASCENDING = Table.Sort(TB_NON_NULL,{{"Strike", Order.Ascending}}),
//TRI_DESCENDING = Table.Sort(TB_NON_NULL,{{"Strike", Order.Descending}}),
//AUTRE_TRI= Table.Sort(TB_NON_NULL,{{"Side", Order.Descending}}),
//****************************************************************************************

SORT=if NB_NON_NULL = NB_PUT
then Table.Sort(TB_NON_NULL,{{"Strike", Order.Descending}})
else if NB_NON_NULL = NB_CALL
then Table.Sort(TB_NON_NULL,{{"Strike", Order.Ascending}})
else Table.Sort(TB_NON_NULL,{{"Side", Order.Descending}})
in
//TB_NON_NULL
// TB_CALL
// TB_PUT
// NB_PUT
// NB_CALL
SORT
Merci bcp. Par contre, les données de la zone A2:L19 sont actualisées par des copiés collés. Est ce que ca fonctionne?
 

oguruma

XLDnaute Occasionnel
Oui, la requête s'appuie sur ce tableau structuré... toutes les modifications sont prises en compte ainsi que l'ajout de lignes..... cette dynamique est réalisée par les pouvoirs des Tableaux Structurés. La requête s'appuie sur le nom du TS donc sans tenir compte du nombre de lignes.
A ce propos toutes données injectées dans PQ sont automatiquement transformées en table si elles ne le sont pas à la source.
Exemple, tu injectes dans PQ une plage de $A$1:$Z$1000 PQ transformera cette plage en tableau en lui attribuant un nom de tableau pas défaut.
En revanche si $A$1:$Z$1000 est déjà un TS alors PQ s'appuiera sur ce TS en conservant le nom du tableau initial.
Règle de base à retenir : en PQ tout est Table ou Tableau ou dans des cas bien particuliers Liste de données.

Donc tu peux faire autant de copier/coller que tu veux ça fonctionne.

Mais afin d'éviter des copier/coller il faudrait peut-être songer à importer directement ta source dans PQ ça te les éviterait.
Si ta source est un fichier Texte avec séparateurs ou pas (style .csv), JSON, XML, PDF et autres on sait les traiter avec PQ. Allez plus loin là-dessus dans ce post on va être hors sujet. Mais une direction d'étude pour toi.
 

julienha

XLDnaute Occasionnel
Oui, la requête s'appuie sur ce tableau structuré... toutes les modifications sont prises en compte ainsi que l'ajout de lignes..... cette dynamique est réalisée par les pouvoirs des Tableaux Structurés. La requête s'appuie sur le nom du TS donc sans tenir compte du nombre de lignes.
A ce propos toutes données injectées dans PQ sont automatiquement transformées en table si elles ne le sont pas à la source.
Exemple, tu injectes dans PQ une plage de $A$1:$Z$1000 PQ transformera cette plage en tableau en lui attribuant un nom de tableau pas défaut.
En revanche si $A$1:$Z$1000 est déjà un TS alors PQ s'appuiera sur ce TS en conservant le nom du tableau initial.
Règle de base à retenir : en PQ tout est Table ou Tableau ou dans des cas bien particuliers Liste de données.

Donc tu peux faire autant de copier/coller que tu veux ça fonctionne.

Mais afin d'éviter des copier/coller il faudrait peut-être songer à importer directement ta source dans PQ ça te les éviterait.
Si ta source est un fichier Texte avec séparateurs ou pas (style .csv), JSON, XML, PDF et autres on sait les traiter avec PQ. Allez plus loin là-dessus dans ce post on va être hors sujet. Mais une direction d'étude pour toi.
Merci BCP. Ma source c'est la zone A2:L19 qui est alimenté par des copiés-collés qui viennent d'un logiciel externe.
Si je veux ajouter par exemple un autre critère de tri prioritaire sur une colonne, c est possible?
 

oguruma

XLDnaute Occasionnel
Oui, il faut bien respecter les enchainements, la source de données (table) étape(n) doit faire référence à étape(n-1) à voir si nécessaire
tu peux ajouter autant de tris intermédiaires si cela répond à ta question
l'issue il faudra bien positionner le dernier résultat dans la clause "in"

ce qu'il faut comprendre en M
la clause "let" : c'est là où tu fais les traitements nécessaires
la clause "in" : c'est où tu produits les résultats
Si tu as bien compris ces deux règles essentielles dans PQ tu as déjà fait au moins 50 % du chemin dans tous tes développements PQ.

je parle au pluriel, car tu verras qu'après un peu d'expérience tu peux décomposer tes traitements par des "let" imbriqués (nested let) ou des "in" imbriqués (nested in) et si tu veux bien segmenter tes traitements dans niveau plus avancé du peux les découper en section. Dans ton problème nous n'en sommes pas encore là, je profite de ce post pour te faire tour d'horizon des possibilités offertes par PQ quand on commence à le maîtriser.

J'ai été tenté de le faire dans la version initiale : en fait tu as plusieurs instructions de tri et ce qui diffère ce sont les paramètre source, colonne de tri et ordre.
Dans la clause "let" tu peux insérer une fonction appelé par exemple "TriColonne" (un peu comme un sous-programme) et y faire appel en passant les paramètres table source, colonne, ordre.

Pour cela, voir mes post qui traitents de PQ et celui où je parle de passage de paramètres ou récupérer des valeurs d'une feuille Excel.

Je suis peut-être allé un peu loin dans ma réponse mais j'ai cru deviner que tu as mordu à l'hameçon PowerQuery et que tu as envie désormais d'avancer sur ce produit pour d'autres développements ou la résolutions d'autres problèmes que tu as sous le coude :) good luck

Une nouvelle fois oublie les copier/coller et incorpore ta source en mettant en paramètre dans un tableau structuré ta source de données. J'ai déposé tout ce qu'il faut sur le forum pour résoudre cela.
 
Dernière édition:

julienha

XLDnaute Occasionnel
Oui, il faut bien respecter les enchainements, la source de données (table) étape(n) doit faire référence à étape(n-1) à voir si nécessaire
tu peux ajouter autant de tris intermédiaires si cela répond à ta question
l'issue il faudra bien positionner le dernier résultat dans la clause "in"

ce qu'il faut comprendre en M
la clause "let" : c'est là où tu fais les traitements nécessaires
la clause "in" : c'est où tu produits les résultats
Si tu as bien compris ces deux règles essentielles dans PQ tu as déjà fait au moins 50 % du chemin dans tous tes développements PQ.

je parle au pluriel, car tu verras qu'après un peu d'expérience tu peux décomposer tes traitements par des "let" imbriqués (nested let) ou des "in" imbriqués (nested in) et si tu veux bien segmenter tes traitements dans niveau plus avancé du peux les découper en section. Dans ton problème nous n'en sommes pas encore là, je profite de ce post pour te faire tour d'horizon des possibilités offertes par PQ quand on commence à le maîtriser.

J'ai été tenté de le faire dans la version initiale : en fait tu as plusieurs instructions de tri et ce qui diffère ce sont les paramètre source, colonne de tri et ordre.
Dans la clause "let" tu peux insérer une fonction appelé par exemple "TriColonne" (un peu comme un sous-programme) et y faire appel en passant les paramètres table source, colonne, ordre.

Pour cela, voir mes post qui traitents de PQ et celui où je parle de passage de paramètres ou récupérer des valeurs d'une feuille Excel.

Je suis peut-être allé un peu loin dans ma réponse mais j'ai cru deviner que tu as mordu à l'hameçon PowerQuery et que tu as envie désormais d'avancer sur ce produit pour d'autres développements ou la résolutions d'autres problèmes que tu as sous le coude :) good luck

Une nouvelle fois oublie les copier/coller et incorpore ta source en mettant en paramètre dans un tableau structuré ta source de données. J'ai déposé tout ce qu'il faut sur le forum pour résoudre cela.
merci pour les précisions.
J'ai ajouté un cirtére de tri par underlying mais j'ai une erreur(cf PJ)
 

Pièces jointes

  • 2023-08-23 12_31_02-Éditeur avancé.png
    2023-08-23 12_31_02-Éditeur avancé.png
    78.4 KB · Affichages: 9

Statistiques des forums

Discussions
315 088
Messages
2 116 089
Membres
112 658
dernier inscrit
doro 76