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

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

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

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
 
- 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
658
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…