Re Guillaume,
Sache que les noms peuvent faire aussi référence à des formules ou des constantes (par exemple tu pourrais créer un nom TVA1 = 0.20)
Quand tu y mets une formule, elle est interprétée comme une formule matricielle (qui renvoie potentiellement plusieurs valeurs.
Une petite explication sur les noms utilisés
_Jour
Le but est de renvoyer le nom du jour qui n'apparaît qu'une colonne sur 2 dans la plage Synthése!$B$1:$O$1
COLONNE() renvoie le N° de la colonne courante
MOD(COLONNE();2) renvoie le reste de la division par 2 de COLONNE() (soit 1, 0 , 1, 0 ... )
On retire 1 pour qu'en B on renvoie 0 et qu'en C on renvoie -1
du coup INDEX(Synthése!$B$1:$O$1,COLONNE()-MOD(COLONNE();2)-1) renvoie B1 en colonne B et C, D1 en colonne D et E, etc ... Ce qui donne Lundi, Lundi, Mardi, Mardi ...
_Horaire_Jour
Va renvoyer la plage horaire du jour considéré (il pourrait y avoir des différences de plages horaire certains jours)
INDIRECT reconstitue une référence à partir d'un texte, le texte est _Jour&"!$B$1:$BB$1" soit pour Lundi : Lundi!$B$1:$BB$1
du coup, en fonction du jour INDIRECT(_Jour&"!$B$1:$BB$1") renvoie la référence à la plage horaire du jour concerné.
_Personnel_Jour
Va renvoyer la liste du personnel du jour concerné, encore une fois il pourrait y avoir des différences d'un jour à l'autre
INDIRECT a le même but mais le texte est différent
_Jour&"!$A$2:$A$"&NBVAL(INDIRECT(_Jour&"!$A:$A"))+1 on compte avec NBVAL le nombre de données dans la colonne A de la feuille _Jour, on y ajoute 1 parce qu'on commence à la ligne 2. s'il y a 6 données dans la colonne on obtient pour Lundi le texte Lundi!$A$2:$A$7
du coup, s'il n'y a aucune ligne vide intercalée, on obtient la liste du personnel pour le jour dit.
_Planning_Jour
C'est la plage située sous _Horaire_Jour et qui compte autant de lignes que la liste du personnel du jour.
On utilise la fonction
DECALER(Plage, Décalage Lgn, Décalage Col, Nb Lgn, Nb Col).
Ici on se décale d'une ligne, de 0 colonne, le nombre de lignes est celui de la liste du personnel, et on garde le même nombre de colonnes (argument vide). Ce qui donne DECALER(_Horaire_Jour;1;0;LIGNES(_Personnel_Jour); )
Du coup on a la plage où tu coches les quarts d'heure de présence ...
_Arrivée_Jour_Personne
Le but est de trouver le n° du premier quart d'heure coché pour une personne et un jour donnés
Il faut déjà trouver le N° de ligne qui correspond à la personne dans le planning du jour :
EQUIV(Synthése!$A12;_Personnel_Jour;0) (pour la ligne 12)
Ensuite renvoyer la ligne du planning qui correspond à ce N° :
INDEX(_Planning_Jour;EQUIV(Synthése!$A12;_Personnel_Jour;0);0)
Ensuite on teste si chacune des cellules de cette plage est vide (par raccourci >0), on aurait pu tester sur la valeur "x" si l'on était sûr que c'était toujours le cas.
INDEX(_Planning_Jour;EQUIV(Synthése!$A12;_Personnel_Jour;0);0)>0
(c'est là que la formule matricielle intervient), on récupère ainsi une matrice de VRAI et de FAUX
Ensuite on renvoie le N° de la première colonne pour laquelle on a VRAI :
EQUIV(VRAI;INDEX(_Planning_Jour;EQUIV(Synthése!$A12;_Personnel_Jour;0);0)>0;0)
Du coup on a le N° du premier quart d'heure coché
_Sortie_Jour_Personne
Le but est de trouver le n° du dernier quart d'heure coché pour une personne et un jour donné,
Même raisonnement mais là on recherche avec une chaîne "supérieure" à "x", on a choisi "zz" en utilisant la fonction EQUIV avec comme dernier argument le 1 : La fonction EQUIV recherche la valeur la plus élevée qui est inférieure ou égale à celle de l’argument valeur_cherchée.
EQUIV("zz";INDEX(_Planning_Jour;EQUIV(Synthése!$A17;_Personnel_Jour;0);0);1)
Ainsi on a le n° du dernier quart d'heure coché (en supposant qu'il n'y ait pas de vide entre deux quarts d'heure cochés)
Du coup les deux formules sont nettement simplifiées
Pour les arrivées =SIERREUR(INDEX(_Horaire_Jour;_Arrivée_Jour_Personne);"")
Pour les départ =SIERREUR(INDEX(_Horaire_Jour;_Sortie_Jour_Personne
+1);"")
(+1 pour avoir l'heure de départ)
Voilà pour les explications complémentaires
Amicalement
Alain
Modif : Et toujours l'orthographe ...