POWERQUERY :: Combiner les onglets d'un classeur Excel ou certains au cas par cas

oguruma

XLDnaute Occasionnel
Suite du post Combiner des fichiers Excel
Le fichier source et data sont les mêmes

Hypothèse : on souhaite combiner plusieurs Tables (tableaux structurés) [à condition que leurs structures soient identiques)
- soit on importe tous les TS du classeur Excel
- soit on importe tous les TS de manière générique
- soit des TS nommément précisés

Environnement PowerQuery
1706019897272.png

Rappel des paramètres
1706020801937.png


PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="TBL_2020"]}[Content]
in
    Source
   
let
    Source = fnGetTable("TBL_2020")
in
    Source

let
    pFilter=fnGetParameter("TB_PARAMS","FILTRE_TABLE"),
    Source = Excel.CurrentWorkbook(),  
    FilterTable = if pFilter is null then Source else Table.SelectRows(Source, each Text.StartsWith([Name], pFilter)),
    Content = FilterTable[Content],
    ToTable = Table.FromList(Content, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ExpandTable = Table.ExpandTableColumn(ToTable, "Column1", {"Date", "Client", "Produit", "Vendeur", "Montant"}, {"Date", "Client", "Produit", "Vendeur", "Montant"})
in
    ExpandTable
   
let
    Source =  fnCombineAllTables("TBL_")
in
    Source
   
let

    //---------------------------------------------------------------------------
    // On récupère un à un les tableaux structurés
    //---------------------------------------------------------------------------
    Source1 = Excel.CurrentWorkbook(){[Name="TBL_2020"]}[Content],
    Source2 = Excel.CurrentWorkbook(){[Name="TBL_2021"]}[Content],
    Source3 = Excel.CurrentWorkbook(){[Name="TBL_2022"]}[Content],

    //---------------------------------------------------------------------------
    // Puis combinaison des tableaux structurés en table
    //---------------------------------------------------------------------------
    Combine = Table.Combine({Source1, Source2, Source3})

in
    Combine
   
let
    //---------------------------------------------------------------------------------
    // Appel de la fonction permettant de combiner plusieurs tables spécifiques
    // Ces tables sont définies dans la table des paramètres
    //---------------------------------------------------------------------------------
    Source=fnCombineTableByList("TB_PARAMS","LISTE_TB")
in
    Source

Les différentes fonctions

PowerQuery:
let
    //-------------------------------------------------------------------------------
    // Combinaison de plusieurs tables à partir du classeur Excel courant
    // avec possibilité de filtrer sur le nom des tables (tableaux structurés)
    // au préalable les tableaux structurés doivent être créés
    // il est recommandé qu'ils commencent tous par le même préfixe
    //-------------------------------------------------------------------------------

    fnCombineAllTables = (pFilterTbl as text) =>
   
    let
        //---------------------------------------------------------------------------
        // On récupère les objets du classeur
        //---------------------------------------------------------------------------
        Source = Excel.CurrentWorkbook(),  

        //---------------------------------------------------------------------------
        // On applique le filtre sur les tableaux structurés
        //---------------------------------------------------------------------------
        FilterTable = if pFilterTbl is null then Source else Table.SelectRows(Source, each Text.StartsWith([Name], pFilterTbl)),

        //---------------------------------------------------------------------------
        // On récupère les tableaux structurés (tables)
        //---------------------------------------------------------------------------
        Content = FilterTable[Content],

        //---------------------------------------------------------------------------
        // Conversion en table d'objets
        //---------------------------------------------------------------------------
        ToTable = Table.FromList(Content, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

        //---------------------------------------------------------------------------
        // On se base sur le 1er tableau pour récupérer les titres de colonnes
        //---------------------------------------------------------------------------
        TblColumns = ToTable{0}[Column1],

        //---------------------------------------------------------------------------
        // Les colonnes sont transformées en liste
        //---------------------------------------------------------------------------
        LstColumns=Table.ColumnNames(TblColumns),

        //---------------------------------------------------------------------------
        // Création de la table contenant tous les tableaux structurés
        //---------------------------------------------------------------------------
        ExpandTable = Table.ExpandTableColumn(ToTable, "Column1", LstColumns, LstColumns)

    in
        ExpandTable
in
    fnCombineAllTables
   
let
    //---------------------------------------------------------------------------------
    // Fonction permettant de combiner plusieurs tables (tableaux structurés)
    // Ce dossier et ces tables sont définis dans une table paramètres
    //---------------------------------------------------------------------------------

    // La table des paramètres et le paramètre tables à combiner
    fnCombineExcelByList = (pTableParams as text, pParam as text) as table =>
   
    let
        LstFiles=Text.Split(fnGetParameter(pTableParams,pParam),";"),   // Liste des tables à combiner
        LstCombine=List.Accumulate(
                        LstFiles,            // Initialisation de la boucle sur la liste à traiter
                        #table({},{}),       // Initialisation de l'accumulateur sur une table vide
                        (state,current) =>   // Boucle de traitement pour combiner les fichiers un à un
                            let
                                Source = fnGetTable(current),     // Importation de la table en cours
                                Combine = Table.Combine( {state , Source})  // Combinaison de la table
                            in                          
                            Combine   // Ensemble des tables combinées
                        )    
    in
        LstCombine
in
    fnCombineExcelByList
   
let
    //-------------------------------------------------------------------
    // Fonction permettant d'importer un tableau structuré
    // Ce tableau structuré doit exister au préalable
    //-------------------------------------------------------------------
   
    fnGetTable=(pTable as text) as table =>

    let
        Source = Excel.CurrentWorkbook(){[Name=pTable]}[Content]
    in
        Source
in
    fnGetTable
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 116
Messages
2 116 408
Membres
112 742
dernier inscrit
julien.sch