oguruma
XLDnaute Occasionnel
Bonjour le Forum,
dans un précédent post j'avais démontré comment obtenir le détail d'une ligne qui a été regroupée par la fonction GROUPER.PAR.
Dans la même idée ce post a pour but de pouvoir obtenir le détail d'une ligne et d'une colonne quand un tableau est construit par la fonction PIVOTER.PAR.
Voici un exemple. Le processus pour y arriver sera documenté largement dans les lignes suivantes. Je vous avoue qu'il y a quelques complexités sans aller trop loin néanmoins. Cela demande la maîtrise des fonctions LET, INDIRECT et DECALER.
La fonction LET en K10 gère intégralement la gestion de paramètres, leur contrôle et l'affichage.
Cela passe aussi par des paramètres généraux dans un onglet spécifique :
La base PIVOT c'est la 1ère ligne du regroupement des données. Ca sera le point de départ pour la fonction DECALER dans tout le code.
Préalables : créer les noms de champs des cellules sur fond VERT car ceux sont utilisé dans la fonction LET principale.
Certes, il est possible d'utiliser d'autres noms de champs à votre convenance mais ce cas il faudra intervenir dans toutes les formules !
Code de la fonction LET
dans un précédent post j'avais démontré comment obtenir le détail d'une ligne qui a été regroupée par la fonction GROUPER.PAR.
Dans la même idée ce post a pour but de pouvoir obtenir le détail d'une ligne et d'une colonne quand un tableau est construit par la fonction PIVOTER.PAR.
Voici un exemple. Le processus pour y arriver sera documenté largement dans les lignes suivantes. Je vous avoue qu'il y a quelques complexités sans aller trop loin néanmoins. Cela demande la maîtrise des fonctions LET, INDIRECT et DECALER.
La fonction LET en K10 gère intégralement la gestion de paramètres, leur contrôle et l'affichage.
Cela passe aussi par des paramètres généraux dans un onglet spécifique :
La base PIVOT c'est la 1ère ligne du regroupement des données. Ca sera le point de départ pour la fonction DECALER dans tout le code.
Préalables : créer les noms de champs des cellules sur fond VERT car ceux sont utilisé dans la fonction LET principale.
Certes, il est possible d'utiliser d'autres noms de champs à votre convenance mais ce cas il faudra intervenir dans toutes les formules !
Code de la fonction LET
Code:
=
=LET(
TBLE;NOM_TABLE_PIV;
FIELDV;"[" & PIVOTER_LIGNE & "]";
FIELDH;"[" & PIVOTER_COL & "]";
BASE_PIVOT;CELLULE_REF;
INDPIVOT;INDIRECT(BASE_PIVOT);
DEBUT_COL_DET;DEBUT_COL_DET;
FIN_COL_DET;FIN_COL_DET;
FIELDDISPLAY;"[[" & DEBUT_COL_DET & "]:[" & FIN_COL_DET &"]]";
INDFIELDV;TBLE&FIELDV;
INDFIELDH;TBLE&FIELDH;
INDISPLAY;TBLE&FIELDDISPLAY;
ENTETES;TBLE&"[[#En-têtes];["&DEBUT_COL_DET&"]:["&FIN_COL_DET&"]]";
TBLE_ENTETES;INDIRECT(ENTETES);
NB_COLS_ENTETES;NBVAL(TBLE_ENTETES);
NbLignes;NBVAL(UNIQUE(INDIRECT(INDFIELDV)));
NbCols;NBVAL(UNIQUE(INDIRECT(INDFIELDH)));
ListeLig;TRIER(UNIQUE(INDIRECT(INDFIELDV)));
ListeCols;TRIER(UNIQUE(INDIRECT(INDFIELDH)));
CheckBoxLignes;DECALER(INDPIVOT;;NbCols+2;NbLignes);
CheckBoxCols;TRANSPOSE(DECALER(INDPIVOT;-2;1;1;NbCols));
NbrCasesV;NBVAL(CheckBoxLignes);
NbrCasesH;NBVAL(CheckBoxCols);
NbrCasesHFalse;NB.SI(DECALER(INDPIVOT;-2;1;1;NbCols);FAUX);
NbrCasesHTrue;NB.SI(DECALER(INDPIVOT;-2;1;1;NbCols);VRAI);
NbrCasesVFalse;NB.SI(DECALER(INDPIVOT;;NbCols+2;NbLignes);FAUX);
NbrCasesVTrue;NB.SI(DECALER(INDPIVOT;;NbCols+2;NbLignes);VRAI);
CheckNbTrueOK;SI(OU(NbrCasesVTrue=0;NbrCasesHTrue=0);FAUX;VRAI);
CheckNbTrueUnic;SI(ET(NbrCasesVTrue=1;NbrCasesHTrue=1);VRAI;FAUX);
CheckNbFalseUnic;SI(OU(NbrCasesVTrue=0;NbrCasesHTrue=0);FAUX;VRAI);
CheckFinalOK;ET(CheckNbTrueOK;CheckNbTrueUnic);
currentRow;SIERREUR(EQUIVX(VRAI;CheckBoxLignes;0);-1);
currentColumn;SIERREUR(EQUIVX(VRAI;CheckBoxCols;0);-1);
currentValueLig;SIERREUR(INDEX(DECALER(INDPIVOT;;;NbLignes);currentRow);"ERREUR");
currentValueCol;SIERREUR(INDEX(DECALER(INDPIVOT;-1;1;1;NbCols);currentColumn);"ERREUR");
currentResult;INDEX(DECALER(INDPIVOT;;1;NbLignes;NbCols);currentRow;currentColumn);
tbl;SIERREUR(TRIER(FILTRE(INDIRECT(INDISPLAY);((INDIRECT(INDFIELDV)=currentValueLig)*(INDIRECT(INDFIELDH)=currentValueCol));""));"Erreur de traitement");
SI.CONDITIONS(
PIVOTER_LIGNE="";"Renseigner le champ en ligne dans les paramètres";
PIVOTER_COL="";"Renseigner le champ en colonne dans les paramètres";
CELLULE_REF="";"Renseigner la cellule pivot dans les paramètres";
DEBUT_COL_DET="";"Renseigner le champs début détail dans les paramètres";
FIN_COL_DET="";"Renseigner le champ fin détail dans les paramètres";
TBLE="";"Renseigner la table dans les paramètres";
NbrCasesVTrue>1;"Choisir une seule ligne";
NbrCasesHTrue>1;"Choisir une seule colonne";
currentRow=-1;"Selectionner une ligne";
currentColumn=-1;"Sélectionner une colonne";
currentResult="";"Aucun résultat à détailler";
CheckFinalOK;ASSEMB.V(TBLE_ENTETES;tbl))
)/CODE]
Pièces jointes
Dernière édition: