Je suppose que la condition initiale sur les dates : date en E (ou I ou M) supérieure à 0 (car si la cellule est vide, elle renvoie 0 qui est pris en compte comme date par Excel) et supérieure à la date en X (et colonnes suivantes) ne pose pas problème (même si à la source d'ajustements des références (relatives ou absolues).
C'est cette expression (si la condition initiale est vérifiée) qui doit demander quelques explications :
=SI(MIN(MOD(X$3-$I4-LIGNE(INDIRECT("1:"&$L4/24))+1;$J4))=0;$K4;"");"")
Si l'on ne tient pas compte des répétitions au delà de 24h, l'expression serait simplement :
=SI(MOD(X$3-$I4;$J4))=0;$K4;"");"")
Le cycle partant du jour indiqué en I (ou E ou M) et se répétant selon la périodicité indiqué en J (ou F ou N), lorsque la date en I est atteinte, la différence date jour et date début cycle est 0. Ensuite, chaque fois que la différence de dates est un multiple du cycle, MOD(diffDates;cycle) renverra 0, et dans ce cas on affecte la valeur prévue en K (ou G ou O).
Mais si l'effet concerne plus d'un jour, par ex. 48h, il faut pouvoir tester le jour même et le jour précédent, si 72h, il faut alors tester le jour même et les 2 jours précédents...
Il faut donc faire MOD(diffDates-{0;1};cycle) qui, validé matriciellement, renverra 2 valeurs. Si l'une des deux est 0, c'est que le jour est concerné.
Par exemple le cycle étant de 7, MOD(7-{0;1};7) renverra 0 et 6 ; MOD(8-{0;1};7) renverra 1 et 0 ; les autres différences renverront des couples tels que 2/1, 3/2... 6/5.
En testant si la valeur minimale renvoyée est 0 on s'assure que la date est à prendre en compte.
Dans la formule, la matrice {0;1} ou {0;1;2}... est renvoyée par LIGNE(1:2)-1 ou LIGNE(1:3)-1... Comme on ne sait pas à l'avance quelle est le numéro de la deuxième ligne à indiquer, on le fournit par l'expression répétEnH/24 qui renverra 1, 2 ou 3... et on le passe à la fonction LIGNE au moyen de INDIRECT : LIGNE(INDIRECT("1:"&répétEnH/24))-1
Cette expression étant à soustraire de la différence de dates, cela donne :
MOD(diffDates-LIGNE(INDIRECT("1:"&répétEnH/24))+1;cycle)
Il n'y a plus qu'à tester que le MIN des valeurs renvoyées ci-dessus soit 0...
Cordialement