Le pouvoir caché de la fonction REDUCE : regrouper des tables à partir d'une liste

Cette fonction m'a toujours intriguée, car elle porte en elle des pouvoirs extraordinaire, mais il faut réussir à en déverrouiller le code intellectuel.

Voici un exemple très pratique qui permet de comprendre ce qui se passe. Pour d'autres approches, vous pouvez aller voir ici. Le gros intérêt de cette approche est qu'elle ne nécessite pas d'actualiser les données. Aussi, comme on renvoie une plage dynamique, on peut définir un nom y faisant référence (avec le #) et l'utiliser dans un TCD ou ailleurs.

Notre objectif est donc de combiner plusieurs tables ensemble.

Le plus simple est d'utiliser la fonction ASSEMB.V et ensuite de sélectionner les tables les unes après les autres. Pour la première table, on prend aussi l'en-tête.

Ça va donner ceci :

Maintenant, on veut automatiser l'approche en stockant le nom des tables dans une liste. Cela permet d'éviter de devoir modifier directement la formule.

Avec REDUCE, vous partez d'un élément de départ (ca peut être une plage de cellule), puis vous donnez un tableau à parcourir, et enfin, pour chaque élément de ce tableau, vous définissez une lambda, donc n'importe quelle fonction. Le résultat va combiner ensemble l'élément de départ avec le résultat de la fonction LAMBDA. Puis la fonction va recommencer avec la valeur suivante du tableau à parcourir et combiner les deux résultats ensemble. Le résultat final de la fonction peut être soit une valeur, soit une plage propagée.

Par exemple, dans cette fonction :

=REDUCE(T_Mois_Janvier_2024[#En-têtes];
        L_Tables[Liste des tables];
        LAMBDA(_cumul;_valeur;
               ASSEMB.V(_cumul;SIERREUR(INDIRECT(_valeur);"Erreur : table " & _valeur & " inexistante"))))

On va démarrer avec les en-têtes du premier tableau.
Puis, on va parcourir toutes les cellules de la table "L_Tables" pour récupérer les noms des tables à mettre les unes en dessous des autres.
Ensuite, on va faire l'assemblage vertical (ASSEMB.V) de ces tables, à l'aide de la LAMBDA.

Note : en théorie, BYROW aurait du permettre de faire la même chose, mais je n'ai pas encore compris pourquoi ca n'a pas fonctionné !