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

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 !

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:
- 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

Retour