POWER QUERY - Convertir des blocs de données avec plusieurs sous-en-têtes

Bonjour à toutes et tous,

Je cherche à transformer un tableau Excel importé dans Power Query qui est structuré en blocs répétés.

Chaque bloc contient :

  1. Une ligne indiquant des quantités
  2. Une ligne d’en-têtes
  3. Une ou plusieurs lignes de données

Voici un exemple simplifié de la structure actuelle :

Colonne 1Colonne 2Colonne 3Colonne 4Colonne 5
3 PAL5 PAL8 PAL
ArticlePrix netPrix Qtt 1Prix Qtt 2Prix Qtt 3
A10,009,008,007,00
B20,0018,0016,0014,00
2 PAL4 PAL6 PAL
ArticlePrix netPrix Qtt 1Prix Qtt 2Prix Qtt 3
C30,0027,0024,0021,00

Je souhaite obtenir un tableau final structuré sur une seule ligne par article, avec les quantités associées à chaque prix :

ArticlePrix netPrix Qtt 1Qtt 1Prix Qtt 2Qtt 2Prix Qtt 3Qtt 3
A10,009,003 PAL8,005 PAL7,008 PAL
B20,0018,003 PAL16,005 PAL14,008 PAL
C30,0027,002 PAL24,004 PAL21,006 PAL

Vous trouverez l'exemple ci-dessus en pièce jointe.

Ce fichier contient une première solution dans Power Query, chargée dans la [Feuil2].

Je n'en suis pas satisfait. Je voudrais une solution plus robuste, moins spécifique et surtout scalable.

- Le nombre de blocs peut varier

- Le nombre de lignes par bloc peut varier

- Le nombre de colonnes de prix peut varier

- EDIT : Le nombre de colonnes de prix peut varier par bloc

Êtes-vous plus inspiré que moi ?

Je vous remercie d'ores et déjà pour vos réponses que je sais pertinentes.

Catab,

10test.xlsx (20.84 Ko)

Hello,

Une proposition scalable, je laisse les pros optimiser tout ça

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    GroupBy = Table.Group(Source, {"Colonne1"}, {{"tbl", each let a = List.RemoveNulls(Record.ToList(_{0})) in List.Accumulate({1..List.Count(a)},Table.PromoteHeaders(Table.Skip(_)),(s,c)=> Table.AddColumn(s,"Qtt " & Text.From(c),each a{c-1}))}}, 0 , (x,y)=> Number.From(y[Colonne1]=null)),
    Combine = Table.Combine(GroupBy[tbl]),
Permute = Table.ReorderColumns(Combine,List.FirstN(Table.ColumnNames(Combine),2)& List.Sort(List.Skip(Table.ColumnNames(Combine),2), each Text.Select(_,{"0".."9"})))
in
    Permute

@+

Bonjour à tous !

Une autre proposition ?

Bonjour,

Merci beaucoup pour vos retour.

Vous êtes très fort... Vos deux solutions fonctionnent bien.

Je suis par contre incapable d'en saisir la logique. C'est du M trop poussé pour moi qui utilise encore uniquement les fonctions du ruban pour 90% de mes opérations

L'étape clé "GroupBy" notamment me parait bien complexe. Je ne serais pas contre un peu d'explication.

Hello,

Alors par où commencer ...

Tout commence avec le Table.Group ou plutôt dans le ruban l'étape "Regrouper par". Cette fonctionnalité permet de regrouper en fonction de clients, de fournisseurs ou pleins d'autres choses pour faire des sommes, moyennes etc etc. Il y a aussi l'option "Toutes les lignes" qui permet d'avoir la sous table correspondant à notre client ou fournisseur etc comme ci-dessous.

image

Le 4ème et 5ème arguments de cette fonction permettent d'établir notre propre règle de regroupement et faire un peu comme on veut. Quand on a des données "destructurées" mais avec un pattern commun comme dans ton cas c'est hyper pratique.

Du coup la partie en ROUGE permet de faire notre test en disant si j'ai du null en "Colonne1" je crée un sous groupe. Pourquoi cette règle ? Car dans ton cas tes quantités sont sur la première ligne de chaque sous groupe et ça correspond à une valeur null en colonne 1. Le x et le y permettent de définir les "bornes" de la plage.

image

Une fois qu'on a cette sous table, on peut lui dire quoi faire sur cette table. Donc en BLEU on définit une variable dans laquelle on récupère la première ligne de chaque sous table (chaque ligne avec les quantités) et on récupère ces quantités sous forme de liste donc pour la première sous table ça va être {"3 PAL","5 PAL", "8 PAL"}.

Ensuite en VERT on utilise une fonction récursive pour boucler sur l'ajout de colonne. Si t'as trois valeurs dans tes quantités tu ajoutes Qtt1, Qtt2 et Qtt3 etc etc et ça s'adapte tout seul en fonction du nombre d'élément. Donc on récupère la sous table sans la ligne des quantités car c'est déjà stocké dans la variable "a" et on applique la fonction récursive. Il y a pas mal de documentation dessus sur internet.

image

Ca c'était pour l'étape GroupBy. Pour le permute, c'est la fonction Table.ReorderColumns quand tu déplaces une colonne sauf qu'au lieu de mettre en dur les colonnes je lui dis de mettre Article et prix net en premier puis de mettre les prix et quantité triés en fonction du chiffre à l'intérieur en gros.

N'hésite pas si besoin, j'espère que ça pourra t'aider

@+

Edit : JFL, bien le bonsoir

Bonjour à tous !

@BAROUTE78 : Ave Maître es pédagogie didactique....

Je vous retourne mon précédent classeur amendé de commentaires dans le code de la requête ( voir dans le menu Editeur avancé).

Par ailleurs, je vous invite à inclure dans vos marque-pages, cette documentation Microsoft.

C'est du M trop poussé pour moi qui utilise encore uniquement les fonctions du ruban pour 90% de mes opérations

Votre démarche initiale est une excellente porte d'entrée dans l'univers Power Query.

N'hésitez pas à utiliser la barre de formule pour modifier les fonctions, puis à coder directement dans l'éditeur avancé.

Rechercher des sujets similaires à "power query convertir blocs donnees tetes"