Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Requête Power Query, positionnement en dessous

  • Initiateur de la discussion Initiateur de la discussion Maxinet
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Maxinet

XLDnaute Nouveau
Bonjour à tous,

J'essaie de créer une requête Power Query qui me permettrai de positionner les données de certaines colonnes en dessous des données des 1ère colonnes. C'est sans doute pas clair, je vous ai mis un fichier en PJ avec l'exemple que je voudrai obtenir (les données du 1er tableau son déjà issues d'une requête)

Je débute avec Power Query et si vous pouvez me dire si c'est possible ou pas, cela m'aiderait

Merci et bonne journée !

Max
 

Pièces jointes

Solution
Bonjour Maxinet, job75, alexga78, le forum,

Plutôt d’accord avec @job75, c’est pas très clair.
Cela dit, une proposition basée sur le fichier du post #9 avec ta requête retouchée et qui semble répondre au besoin initial :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(), xx = Source{[Name="D365Industriel_VDonneesProcess"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(xx,{{"PRODUCTIONSITEID", type text}, {"FORMULE", type text}, {"PRD_FABRIQUE", Int64.Type}, {"LIBELLE_PRD_FAB", type text}, {"VERSION_FORMULE", type text}, {"TAILLE_BATCH", type text}, {"MULTIPLE", type text}, {"RENDEMENT", type text}, {"NOM_FORMULE", type text}, {"RENDEMENT_MIN", type text}, {"RENDEMENT_MAX", type text}, {"QUANTITY", type text}, {"QUANTITYDENOMINATOR", type text}...
Bonjour @Maxinet, le forum,

c'est possible 🙂

PowerQuery:
let
A = Excel.CurrentWorkbook(){[Name="BDD"]}[Content],
B = {"CODE REF", "LIBELLE", "MACHINE"},
C = (x,y)=> List.Transform(x, each y{_}),
D = Table.Combine(Table.Group(A, "Code ref produite", {"x", (x)=>
    Table.FromRows({C({0,1,4}, Record.ToList(Table.First(x)))},B) & Table.FromColumns(C({2..4}, Table.ToColumns(x)),B)})[x])
in D

Bonne journée à tous.
 
Bonjour Maxinet, alexga78,

Une solution VBA assez simple :
VB:
Sub Restructurer()
Dim i&
Application.ScreenUpdating = True
Columns("G").Resize(, Columns.Count - 6).Delete 'RAZ
With [BDD].ListObject.Range 'tableau structuré
    .Sort .Columns(1), xlAscending, .Columns(2), , xlAscending, Header:=xlYes 'tri sur 2 colonnes
    .Copy [G1] 'copier-coller
End With
With ActiveSheet.ListObjects(2).Range
    For i = .Rows.Count To 2 Step -1
        If .Cells(i - 1, 1) & .Cells(i - 1, 2) <> .Cells(i, 1) & .Cells(i, 2) Then
            .Rows(i).Insert xlDown, xlFormatFromRightOrBelow
            .Cells(i, 3).Resize(, 2) = .Cells(i + 1, 1).Resize(, 2).Value
            .Cells(i, 5) = .Cells(i + 1, 5)
        End If
    Next i
    .Columns(1).Resize(, 2).Delete xlToLeft 'supprime les 2 premières colonnes
    .Rows(1) = Array("Code ref", "LIBELLE", "MACHINE") 'en-têtes
    .Columns.AutoFit 'ajustement largeurs
End With
End Sub
Le fait de travailler sur les cellules rend l'exécution plus lente si le tableau est grand mais permet de conserver les formats.

A+
 

Pièces jointes

Pour tester j'ai créé par copier-coller un tableau source de 9000 lignes avec des valeurs en colonne A de 1 à 3000.

La macro s'exécute chez moi en 13 secondes, c'est très acceptable.
 
Bonjour le forum,

Si l'on ne veut pas copier les formats on utilisera des tableaux VBA :
VB:
Sub Restructurer()
Dim tablo, i&, rest(), n&
With [BDD].ListObject.Range 'tableau structuré
    .Sort .Columns(1), xlAscending, .Columns(2), , xlAscending, Header:=xlYes 'tri sur 2 colonnes
    tablo = .Resize(, 5) 'matrice, plus rapide
End With
For i = 2 To UBound(tablo)
    If tablo(i - 1, 1) & tablo(i - 1, 2) <> tablo(i, 1) & tablo(i, 2) Then
        ReDim Preserve rest(2, n) 'base 0
        rest(0, n) = tablo(i, 1)
        rest(1, n) = tablo(i, 2)
        rest(2, n) = tablo(i, 5)
        n = n + 1
    End If
    ReDim Preserve rest(2, n)
    rest(0, n) = tablo(i, 3)
    rest(1, n) = tablo(i, 4)
    rest(2, n) = tablo(i, 5)
    n = n + 1
Next i
'---restitution---
With [G2] '1ère cellule de destination
    .Resize(n, 3) = Application.Transpose(rest) 'Transpose est limitée à 65536 lignes
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents
    .Resize(, 3).EntireColumn.AutoFit 'ajustement largeurs
End With
End Sub
C'est bien sûr beaucoup plus rapide, sur 9000 lignes la macro s'exécute en 0,11 seconde.

A+
 

Pièces jointes

Bonjour alexa78, ça fonctionne parfaitement, merci beaucoup par contre je n'arrive pas rattacher au début de ma 1ère requête qui donnait ça :
(je ne maîtrise pas encore le code M !)
Let
Source = Excel.CurrentWorkbook(), xx = Source{[Name="xx"]}[Content],
#"Type modifié" = Table.TransformColumnTypes(D365Industriel_VDonneesProcess,{{"PRODUCTIONSITEID", Int64.Type}, {"FORMULE", type text}, {"PRD_FABRIQUE", Int64.Type}, {"LIBELLE_PRD_FAB", type text}, {"VERSION_FORMULE", type text}, {"TAILLE_BATCH", type number}, {"MULTIPLE", Int64.Type}, {"RENDEMENT", Int64.Type}, {"NOM_FORMULE", type text}, {"RENDEMENT_MIN", Int64.Type}, {"RENDEMENT_MAX", type number}, {"QUANTITY", type number}, {"QUANTITYDENOMINATOR", type number}, {"PRODUIT_CONSOMME", Int64.Type}, {"NOM_PRODUIT_CONSOMME", type text}, {"NUMERO_LIGNE_FORMULE", type number}, {"GAMME_LIEE_FORMULE", Int64.Type}, {"SEQUENCE_LIGNE_FORMULE", Int64.Type}, {"DESCRIPTION_LIGNE_FORMULE", type text}, {"TOLERENCE_CONSO_MAX", Int64.Type}, {"TOLERENCE_CONSO_MIN", type number}, {"GAMME", type text}, {"NOM_GAMME", type text}, {"OPERATION", type text}, {"NUM_OPEARTION", Int64.Type}, {"PRIORITE_OPERATION", Int64.Type}, {"ROUTEOPERATIONID", type text}, {"MACHINE", type text}, {"GROUPE_MACHINE", type text}, {"Groupe de coût", Int64.Type}}),
#"Autres colonnes supprimées" = Table.SelectColumns(#"Type modifié",{"PRD_FABRIQUE", "LIBELLE_PRD_FAB", "PRODUIT_CONSOMME", "NOM_PRODUIT_CONSOMME", "OPERATION", "MACHINE", "Groupe de coût"}),
#"Lignes filtrées" = Table.SelectRows(#"Autres colonnes supprimées", each ([OPERATION] = "8-CONDI") and ([Groupe de coût] = 2 or [Groupe de coût] = 10)),
#"Valeur remplacée" = Table.ReplaceValue(#"Lignes filtrées","800233","L100",Replacer.ReplaceText,{"MACHINE"}),
#"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée","886034","L200",Replacer.ReplaceText,{"MACHINE"}),
#"Lignes filtrées1" = Table.SelectRows(#"Valeur remplacée1", each ([MACHINE] <> "800192")),
#"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées1",{"OPERATION", "Groupe de coût"})
in
#"Colonnes supprimées"
 
Bonjour et merci Job75, je garde la macro sous le coude pour d'autre chose, mais là je vais rester sur la requête Power Query
Bonne journée !
 
Bonjour @Maxinet, le forum

Copie/colle ce code dans l'éditeur avancé de PQ, si j'ai bien compris la correspondance du nom des colonnes avec l'exemple...


PowerQuery:
let
Source = Excel.CurrentWorkbook(), xx = Source{[Name="BDD"]}[Content],
#"Type modifié" = Table.TransformColumnTypes(D365Industriel_VDonneesProcess,{{"PRODUCTIONSITEID", Int64.Type}, {"FORMULE", type text}, {"PRD_FABRIQUE", Int64.Type}, {"LIBELLE_PRD_FAB", type text}, {"VERSION_FORMULE", type text}, {"TAILLE_BATCH", type number}, {"MULTIPLE", Int64.Type}, {"RENDEMENT", Int64.Type}, {"NOM_FORMULE", type text}, {"RENDEMENT_MIN", Int64.Type}, {"RENDEMENT_MAX", type number}, {"QUANTITY", type number}, {"QUANTITYDENOMINATOR", type number}, {"PRODUIT_CONSOMME", Int64.Type}, {"NOM_PRODUIT_CONSOMME", type text}, {"NUMERO_LIGNE_FORMULE", type number}, {"GAMME_LIEE_FORMULE", Int64.Type}, {"SEQUENCE_LIGNE_FORMULE", Int64.Type}, {"DESCRIPTION_LIGNE_FORMULE", type text}, {"TOLERENCE_CONSO_MAX", Int64.Type}, {"TOLERENCE_CONSO_MIN", type number}, {"GAMME", type text}, {"NOM_GAMME", type text}, {"OPERATION", type text}, {"NUM_OPEARTION", Int64.Type}, {"PRIORITE_OPERATION", Int64.Type}, {"ROUTEOPERATIONID", type text}, {"MACHINE", type text}, {"GROUPE_MACHINE", type text}, {"Groupe de coût", Int64.Type}}),
#"Autres colonnes supprimées" = Table.SelectColumns(#"Type modifié",{"PRD_FABRIQUE", "LIBELLE_PRD_FAB", "PRODUIT_CONSOMME", "NOM_PRODUIT_CONSOMME", "OPERATION", "MACHINE", "Groupe de coût"}),
#"Lignes filtrées" = Table.SelectRows(#"Autres colonnes supprimées", each ([OPERATION] = "8-CONDI") and ([Groupe de coût] = 2 or [Groupe de coût] = 10)),
#"Valeur remplacée" = Table.ReplaceValue(#"Lignes filtrées","800233","L100",Replacer.ReplaceText,{"MACHINE"}),
#"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée","886034","L200",Replacer.ReplaceText,{"MACHINE"}),
#"Lignes filtrées1" = Table.SelectRows(#"Valeur remplacée1", each ([MACHINE] <> "800192")),
#"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées1",{"OPERATION", "Groupe de coût"}),
B = ((x)=> {x{0}, x{1}, x{4}})(Table.ColumnNames(#"Colonnes supprimées")),
C = (x,y)=> List.Transform(x, each y{_}),
D = Table.Combine(Table.Group(#"Colonnes supprimées", B{0}, {"x", (x)=>
    Table.FromRows({C({0,1,4}, Record.ToList(Table.First(x)))},B) & Table.FromColumns(C({2..4}, Table.ToColumns(x)),B)})[x])
in D

Bonne journée
 
Bonjour Alexga78,
Je reconnais que ce n'était pas clair.
Pour que ma demande soit plus compréhensible, j'ai mis un fichier avec un exemple du code que tu m'as donné et le résultat que je souhaiterai avoir. Merci d'avance pour votre aide !
 

Pièces jointes

Bonjour Maxinet, job75, alexga78, le forum,

Plutôt d’accord avec @job75, c’est pas très clair.
Cela dit, une proposition basée sur le fichier du post #9 avec ta requête retouchée et qui semble répondre au besoin initial :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(), xx = Source{[Name="D365Industriel_VDonneesProcess"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(xx,{{"PRODUCTIONSITEID", type text}, {"FORMULE", type text}, {"PRD_FABRIQUE", Int64.Type}, {"LIBELLE_PRD_FAB", type text}, {"VERSION_FORMULE", type text}, {"TAILLE_BATCH", type text}, {"MULTIPLE", type text}, {"RENDEMENT", type text}, {"NOM_FORMULE", type text}, {"RENDEMENT_MIN", type text}, {"RENDEMENT_MAX", type text}, {"QUANTITY", type text}, {"QUANTITYDENOMINATOR", type text}, {"PRODUIT_CONSOMME", type text}, {"NOM_PRODUIT_CONSOMME", type text}, {"OPERATION", type text}, {"NUM_OPEARTION", type text}, {"PRIORITE_OPERATION", type text}, {"ROUTEOPERATIONID", type text}, {"MACHINE", type text}, {"GROUPE_MACHINE", type text}, {"GROUPE_COUT", Int64.Type}, {"MACHINE_NOM", type text}}),
    #"Autres colonnes supprimées" = Table.SelectColumns(#"Type modifié",{"PRD_FABRIQUE", "LIBELLE_PRD_FAB", "PRODUIT_CONSOMME", "NOM_PRODUIT_CONSOMME", "OPERATION", "MACHINE", "GROUPE_COUT"}),
    #"Lignes filtrées" = Table.SelectRows(#"Autres colonnes supprimées", each ([OPERATION] = "8-CONDI") and ([GROUPE_COUT] = 2 or [GROUPE_COUT] = 10)),
    #"Valeur remplacée" = Table.ReplaceValue(#"Lignes filtrées","800233","L100",Replacer.ReplaceText,{"MACHINE"}),
    #"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée","886034","L200",Replacer.ReplaceText,{"MACHINE"}),
    #"Lignes filtrées1" = Table.SelectRows(#"Valeur remplacée1", each ([MACHINE] <> "800192")),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées1",{"OPERATION", "GROUPE_COUT"}),
    AddColumnCodeMP = Table.AddColumn(#"Colonnes supprimées", "CODE MP", each [PRD_FABRIQUE]),
    RenameColumns = Table.RenameColumns(AddColumnCodeMP,{{"PRD_FABRIQUE", "CODE REF"}, {"LIBELLE_PRD_FAB", "LIBELLE"}}),
    GroupBy = Table.Group(RenameColumns, {"CODE MP", "CODE REF", "LIBELLE", "MACHINE"}, {{"Data", each Table.RenameColumns(Table.SelectColumns(_, {"CODE MP", "PRODUIT_CONSOMME", "NOM_PRODUIT_CONSOMME", "MACHINE"}), {{"PRODUIT_CONSOMME", "CODE REF"}, {"NOM_PRODUIT_CONSOMME", "LIBELLE"}}), type table [CODE MP=number, CODE REF=nullable text, LIBELLE=nullable text, MACHINE=nullable text]}}),
    TransformRows = Table.Combine(Table.TransformRows(GroupBy, each Table.FromRecords({Record.RemoveFields(_, "Data")}) & Record.Field(_, "Data")))
in
    TransformRows

A+
 
Bonsoir tout le monde, mRomain,
Je conviens que ma demande n'était pas très explicite, merci beaucoup d'avoir pris le temps pour y répondre, c'est exactement ce que je cherchais.
Power Query offre plein de possibilités, j'avance petit à petit mais c'est très intéressant
Bonne fin de soirée
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
738
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…