=SOMMEPROD(($AB7:$AU7>A$5)*($AB7:$AU7<=A$4))
À étirer vers la droite.=SOMMEPROD(($AB7:$AU7<>0)*($AB7:$AU7<=A$5)*($AB7:$AU7<=A$4))
=(MIN(A$4;N($AC7))-MAX(A$5;$AB7)>1/10000)+(MIN(A$4;N($AG7))-MAX(A$5;$AF7)>1/10000)+(MIN(A$4;N($AK7))-MAX(A$5;$AJ7)>1/10000)+(MIN(A$4;N($AO7))-MAX(A$5;$AN7)>1/10000)+(MIN(A$4;N($AS7))-MAX(A$5;$AR7)>1/10000)
C'est parce que tu as oublié de compter les heures de télétravail.Il y a beaucoup d'erreurs dans les résultats attendus en jaune !!!
=LET(Plage;$AB7:$AU7;Prem;COLONNE($AB:$AB);NB(Plage)/2-SOMME(--SI(MOD(COLONNE(Plage)-Prem;2)=0;SI(Plage<>"";Plage>=INDEX(Fin;COLONNES($A:A));0);0)) - SOMME(--SI(MOD(COLONNE(Plage)-Prem;2)=1;SI(Plage<>"";Plage<=INDEX(Deb;COLONNES($A:A));0);0)))
=NB($AB7:$AU7)/2-SOMME(--SI(MOD(COLONNE($AB7:$AU7)-COLONNE($AB7);2)=0;SI($AB7:$AU7<>"";$AB7:$AU7>=INDEX(FIN;COLONNES($A:A));0);0)) - SOMME(--SI(MOD(COLONNE($AB7:$AU7)-COLONNE($AB7);2)=1;SI($AB7:$AU7<>"";$AB7:$AU7<=INDEX(DEB;COLONNES($A:A));0);0))
Bonjour mapomme,Bonjour à tous,
Que doit-on faire si la période de travail du salarié est 14h00 <=> 15h15 et que nous voulions la présence sur la plage 15h00 <-> 15h30 ? On compte 0 (car il ne travaille pas sur la plage entière), on compte 1 (car il a un peu travaillé sur la plage) ou bien 0,5 (car il a travaillé la moitié de la plage) ou encore autre chose ?
Whoa merci job75 pour cette formule.Bonsoir MUGMRG, bienvenue sur XLD, bonsoir Wayki,
Voyez le fichier joint et cette formule en A7 :
à tirer à droite et vers le bas.Code:=(MIN(A$4;N($AC7))-MAX(A$5;$AB7)>1/10000)+(MIN(A$4;N($AG7))-MAX(A$5;$AF7)>1/10000)+(MIN(A$4;N($AK7))-MAX(A$5;$AJ7)>1/10000)+(MIN(A$4;N($AO7))-MAX(A$5;$AN7)>1/10000)+(MIN(A$4;N($AS7))-MAX(A$5;$AR7)>1/10000)
Il y a beaucoup d'erreurs dans les résultats attendus en jaune !!!
Explication : MIN (xxx)-MAX(yyy) détermine la largeur de chaque intersection de plages horaires.
A+
Bonjour TooFatBoy,Bonjour,
C'est parce que tu as oublié de compter les heures de télétravail.
Du coup, il n'y a pas tant d'erreurs que ça : 10:00 à 10:30 et 15:00 à 15:30.
Une proposition en pièce jointe.
Hein !?! Mais quoi qu'y dit lui ???Il y a cependant un point que vous semblez tous avoir traité à part, c'est celui des TT.
Bien qu'elle fonctionne, je cherche sans doute une version plus élégante qui nécessite de mettre moins les mains dans le camboui en cas de modification.
Merci Mapomme,Re,
Une version réservée à Office 365. On a considéré qu'un salarié qui travaille même partiellement au sein d'une plage horaire sera compté pour cette plage horaire.
Formule en A7 :
- La plage A5:X5 a été nommée DEB
- La plage A4:X4 a été nommée FIN
- La plage courante des horaires a été nomme Plage via le LET (dans la formule)
- Le numéro de la colonne de début des horaires a été nommé PREM via le LET (dans la formule)
- La formule en A7 est à recopier vers la droite et vers le bas (ou le haut)
- Si on ajoute ou ôte des salariés, il suffit dans la formule de modifier la référence de Plage dans le LET (dans la formule)
- Les périodes de télé-travail sont prises en compte
VB:=LET(Plage;$AB7:$AU7;Prem;COLONNE($AB:$AB);NB(Plage)/2-SOMME(--SI(MOD(COLONNE(Plage)-Prem;2)=0;SI(Plage<>"";Plage>=INDEX(Fin;COLONNES($A:A));0);0)) - SOMME(--SI(MOD(COLONNE(Plage)-Prem;2)=1;SI(Plage<>"";Plage<=INDEX(Deb;COLONNES($A:A));0);0)))
C'est logique puisque ladite valeur n'est plus calculée qu'une seule fois.Et d'après la doc cela accélère même le traitement pour les calculs qui reprennent les mêmes valeurs.
En gros dans la formule, on traite d'une part le début des plages horaires puis la fin plages horaires.Je ne comprends pas la partie avec la sélection de la colonne (la première uniquement) : COLONNE($AB:$AB).
SI(MOD(COLONNE(Plage)-Prem;2)=0; ...
SI(MOD(COLONNE(Plage)-Prem;2)=0;SI(Plage<>"";Plage>=INDEX(Fin;COLONNES($A:A));0);0)
SOMME(--SI(MOD(COLONNE(Plage)-Prem;2)=0;SI(Plage<>"";Plage>=INDEX(Fin;COLONNES($A:A));0);0))
NB(Plage)/2
Function Presence%(deb#, fin#, r As Range)
For Each r In r.Areas 'zones disjointes
Presence = Presence - (IIf(fin < r(1, 2), fin, r(1, 2)) - IIf(deb > r(1), deb, r(1)) > 1 / 10000) 'True => -1
Next
End Function
=Presence(A$5;A$4;($AB7:$AC7;$AF7:$AG7;$AJ7:$AK7;$AN7:$AO7;$AR7:$AS7))+Presence(A$5;A$4;($AD7:$AE7;$AH7:$AI7;$AL7:$AM7;$AP7:$AQ7;$AT7:$AU7))