EXCEL :: Effectuer des regroupements avec agrégations de données :: GROUPER.PAR

  • Initiateur de la discussion Initiateur de la discussion oguruma
  • 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 !

oguruma

XLDnaute Occasionnel
Bonjour le Forum,
De retour après quelques mois d'absence.
Cette fonction GROUPER.PAR avait été abordée dans un autre post. A l'époque cette fonction était en mode INSIDER. Elle a été un long moment disponible via ce mode avec les risques connus par tous. J'y étais aussi à cette époque. Je l'ai abandonné suite à de nombreux problèmes. J'avais commencé quelques travaux sur cette fonction.
Voici la version finalisée avec quelques exemples sur l'utilisation.
Elle présente en quelques sortes les mêmes fonctionnalités de regroupement et d'agrégation de données que les TCD. Les résultats sont présentés sous forme de tableaux qu'il est possible de personnaliser via des MFC pour la présentation.
Je pense que c'est une erreur de croire que les TCD vont disparaître. Il faut considérer cette fonction comme un complément réutilisable pour la conception de tableaux secondaire. Les TCD par leur richesse ont encore je crois de beaux jours devant eux. Avant l'arrivée de cette fonction on contourner cette possibilité par des SOMME.SI, SOMME.SI.ENS, NB.SI, NB.SI.ENS... etc.....
Enfin pour les plus chevronnés il y a aussi l'outillage PowerQuery qui permet d'effectuer des regroupements de données.

On peut l'utiliser soit avec des plages de cellules ou soit des tableaux structurés.

SOURCE : PLAGE DE CELLULES
1737563145529.png


Syntaxe
Voir la documentation Microsoft si besoin pour plus de détails.
1737563226940.png


PARTIE 1 :: LES PLAGES DE DONNEES

01 - Cas simple

=GROUPER.PAR(A1:A36;G1:G36;SOMME;3) => nous avons un regroupement par opérateur - pour chaque opérateur on fait la somme des consommations. L'option 3 permet d'afficher les titres des colonnes. Bien entendu prendre la 1ère ligne du tableau dans la plage de cellules.
1737563190308.png
==> la mise en gras et le cadre est manuel. Rien n'est automatique. Pour cela il faudra passer par les MFC. Je présente un exemple plus bas.

02 - Cas plus évolué sur plusieurs colonnes contigues
=GROUPER.PAR(T_CONSO!A1:C36;T_CONSO!G1:G36;SOMME;3)
1737563509383.png


03 - Cas plus évolué à deux niveaux et sous-totalisation
=GROUPER.PAR(T_CONSO!$A$1:$D$36;T_CONSO!$G$1:$G$36;SOMME;3;2)
1737563665984.png

1737563695605.png
==> sous-total ; idem il faudra passer par les MFC pour le mettre en valeur

Avec un total général : =GROUPER.PAR(T_CONSO!$A$1:$D$36;T_CONSO!$G$1:$G$36;SOMME;3;1)

04 - Colonnes non contigues
=GROUPER.PAR(ASSEMB.H(T_CONSO!$A$1:$A$36;T_CONSO!$B$1:$B$36;T_CONSO!$E$1:$E$36);T_CONSO!$G$1:$G$36;SOMME;3)
L'astuce est d'utiliser la fonction tableau. On va construire le tableau à traitement dynamiquement via ASSEMB.H
1737563947192.png


On peut aussi passer par CHOISIRCOLS
=GROUPER.PAR(CHOISIRCOLS(T_CONSO;1;2;5);$G$1:$G$36;SOMME;3;2;-1)

05 - Colonnes triées
=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;1)
1: Tri croissant sur la 1ère colonne
1737564163326.png


=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;-4)
-4 : tri décroissant sur la colonne conso - la 4ème
1737564195933.png


06 - Filtrer les données à traiter
=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;{-1;-2;3};$A$1:$A$36="Caléo")
1737564528695.png

Filtre évolué - Voir la fonction FILTRE
=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;{-1;-2;3};(($A$1:$A$36="Caléo") * ($E$1:$E$36="X")))

On peut aussi rendre ce filtre dynamique via une liste déroulante
1737564650614.png

=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;{-1;-2;3};(($A$1:$A$36=SEL_OPER) * ($E$1:$E$36="X")))

Filtre numéric
=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;{-1;-2;3};$G$1:$G$36>10000)
{-1;-2;3} : syntaxe si on souhaite trier sur plusieurs colonnes (notion de listes)


Utilisation de la fonction LAMBDA qui produit le même résultat : =GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;LAMBDA(conso;SOMME(conso));3;2;{-1;-2;3};$G$1:$G$36>10000)

Calcul de pourcentages par rapport au total
=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;POURCENTAGE.DE;3;2;{-1;-2;3};$G$1:$G$36>10000)
1737564941406.png


07 - Obtenir les données agrégées en texte
=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;TABLEAU.EN.TEXTE;3;0)
1737565040661.png


08 - Les MFC
1737565170359.png

1737565222391.png

==> voir le fichier joint afin de voir le montage possible

09 - Plusieurs agrégats de calculs
On passera aussi par la fonction ASSEMB.H. Attention de bien respecter l'ordre des calculs souhaités
=GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;ASSEMB.H(NBVAL;SOMME;POURCENTAGE.DE;MOYENNE);1;3;{-1;-2;3};$G$1:$G$36>10000)
1737565408392.png


09 - Réutilisation d'un regroupement
=LET(agreg;GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;LAMBDA(conso;SOMME(conso));3;2;{-1;-2;3};$G$1:$G$36>10000);FILTRE(agreg;INDEX(agreg;;4)>20000))

Pour cela on stock en mémoire le tableau via la fonction LET afin de le réutiliser pour d'autres traitements.
Cas où on veut filtrer sur le résultat. On ne retient que le total des consommations supérieur à 20 000. On doit stocker les agrégats dans une variable via la fonction LET qui va nous renvoyer un tableau de résultats en mémoire puis on va filtrer ce tableau sur la colonne 4 pour les totaux supérieurs à 20 000
1737565570127.png


=LET(agreg;GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;{1;2;3};$G$1:$G$36>10000);FILTRE(agreg;( (INDEX(agreg;;4)>20000) )))
1737565687902.png


=LET(agreg;GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;POURCENTAGE.DE;3;2;{1;2;3};$G$1:$G$36>10000);FILTRE(agreg;( (INDEX(agreg;;4)>0.1) )))
1737565724039.png


=LET(agreg;GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;{1;2;3};( ($G$1:$G$36>10000) + ($B$1:$B$36="2017") ));FILTRE(agreg;( ( (INDEX(agreg;;4)>10000) * (INDEX(agreg;;3)="X") ) )))
1737565791591.png

=LET(agreg2;LET(agreg;GROUPER.PAR(ASSEMB.H($A$1:$A$36;$B$1:$B$36;$E$1:$E$36);$G$1:$G$36;SOMME;3;2;{1;2;3};( ($G$1:$G$36>10000) + ($B$1:$B$36="2017") ));FILTRE(agreg;( ( (INDEX(agreg;;4)>10000) * (INDEX(agreg;;3)="X") ) )));GROUPER.PAR(agreg2;INDEX(agreg2;;4);SOMME;3;2))
1737565817383.png


Bien que ces deux regroupements ci-dessus n'aient certainement aucun sens ils démontrent néanmoins que l'on peut récupérer le résultat d'un regroupement pour l'exploiter de nouveau par un autre regroupement avec position de filtres, etc. etc. etc. On ne retient que le secteur X dans le regroupement final en ce qui concerne le total. On peut filtrer sur les résultats ainsi obtenus.

PARTIE 2 :: TABLEAUX STRUCTURES

=GROUPER.PAR(TBL_CONSO_GAZ[operateur];TBL_CONSO_GAZ[conso];SOMME)
1737566005214.png


=GROUPER.PAR(TBL_CONSO_GAZ[operateur];TBL_CONSO_GAZ[conso];SOMME)
1737566038504.png


=GROUPER.PAR(TBL_CONSO_GAZ[[#Tout];[operateur]:[code_categorie_consommation]];TBL_CONSO_GAZ[[#Tout];[conso]:[pdl]];SOMME;3;2)
1737566073955.png


=GROUPER.PAR(ASSEMB.H(TBL_CONSO_GAZ[[#Tout];[operateur]];TBL_CONSO_GAZ[[#Tout];[libelle_grand_secteur]]);TBL_CONSO_GAZ[[#Tout];[conso]:[pdl]];SOMME;3;2)
1737566137082.png


=GROUPER.PAR(ASSEMB.H(TBL_CONSO_GAZ[[#Tout];[operateur]];TBL_CONSO_GAZ[[#Tout];[libelle_grand_secteur]]);TBL_CONSO_GAZ[[#Tout];[conso]:[pdl]];SOMME;3;2;;TBL_CONSO_GAZ[conso]>20000)
1737566172482.png


=GROUPER.PAR(ASSEMB.H(TBL_CONSO_GAZ[[#Tout];[operateur]];TBL_CONSO_GAZ[[#Tout];[libelle_grand_secteur]]);ASSEMB.H(TBL_CONSO_GAZ[[#Tout];[conso]];TBL_CONSO_GAZ[[#Tout];[conso]];TBL_CONSO_GAZ[[#Tout];[conso]];TBL_CONSO_GAZ[[#Tout];[pdl]];TBL_CONSO_GAZ[[#Tout];[pdl]];TBL_CONSO_GAZ[[#Tout];[pdl]]);ASSEMB.H(SOMME;MAX;MIN;SOMME;MIN;MAX);3;2;;TBL_CONSO_GAZ[conso]>20000)

1737566236824.png


=GROUPER.PAR(INDEX(TBL_CONSO_GAZ;;4);TBL_CONSO_GAZ[conso];SOMME;1)
1737566276958.png

=GROUPER.PAR(TBL_CONSO_GAZ[code_grand_secteur];TBL_CONSO_GAZ[conso];SOMME;1)
1737566300573.png


=GROUPER.PAR(TBL_CONSO_GAZ[[#Tout];[code_categorie_consommation]];TBL_CONSO_GAZ[[#Tout];[conso]:[pdl]];SOMME;1)
1737566330686.png
 
Suite... car limitation à 30 images
1737566545682.png

=GROUPER.PAR(INDIRECT("TBL_CONSO_GAZ[[#Tout];[" & $AM$65 & "]]");TBL_CONSO_GAZ[[#Tout];[conso]:[pdl]];SOMME;1;1;-3)
1737566613341.png


1737566636016.png

=GROUPER.PAR(INDEX(TBL_CONSO_GAZ;;$AW$65);TBL_CONSO_GAZ[conso];SOMME;1;1;-2)
=GROUPER.PAR(INDEX(TBL_CONSO_GAZ;;$AW$65);INDEX(TBL_CONSO_GAZ;;$AZ$65);SOMME;1;1;-2)

1737566646629.png


PARTIE 3 :: FILTRES AVEC SEGMENTS DANS LES TABLEAUX STRUCTURES
On peut passer par les SEGMENTS des tableaux structurés en lieu et place de positionner des filtres dans la fonction GROUPER.PAR via une petite astuce en utilisant la fonction =SOUS.TOTAL(103;[@operateur]).
Il suffit de créer une colonne supplémentaire dans le tableau
1737566931622.png

1737566921591.png

Eventuellement cacher la colonne

Puis on crée les segments
1737566982959.png


=SIERREUR(GROUPER.PAR(TBL_CONSO_2[[#Tout];[operateur]];TBL_CONSO_2[[#Tout];[conso]];SOMME;3;1;2;TBL_CONSO_2[[#Tout];[segment]]);"Aucun élément")
Et on protège la formule si aucun élément ne correspond : SIERREUR
1737567079328.png


AUTRE SOURCE DE DONNEES


1737567138294.png

On a déjà prévu le filtre par segment : =SOUS.TOTAL(103;[@MLE])

1737567213486.png



=SIERREUR(GROUPER.PAR(TBL_EMPLOYES[[#Tout];[SEXE]:[SERVICE]];TBL_EMPLOYES[[#Tout];[SALAIRE]];SOMME;3;2;7;TBL_EMPLOYES[[#Tout];[FILTRE]]=1);"Aucun")

1737567248472.png


1737567367061.png
1737567379645.png


=SIERREUR(GROUPER.PAR(TBL_EMPLOYES[[#Tout];[SEXE]:[SERVICE]];TBL_EMPLOYES[[#Tout];[SALAIRE]];SOMME;3;2;7;((TBL_EMPLOYES[SERVICE]=SEL_SERVICE) * (TBL_EMPLOYES[SEXE]=SEL_SEXE)));"Aucun")

1737567300503.png



Sur les dates
=GROUPER.PAR(ANNEE(TBL_EMPLOYES[[#Tout];[DATE ENTREE]]);TBL_EMPLOYES[[#Tout];[SALAIRE]];SOMME;1;;;((TBL_EMPLOYES[SERVICE]=SEL_SERVICE) * (TBL_EMPLOYES[SEXE]=SEL_SEXE)))

1737567338877.png
 

Pièces jointes

- 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