Microsoft 365 Décompte du nombre de présents par plage horaire

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

MUGMRG

XLDnaute Nouveau
Bonjour,

J'essaye de faire quelque chose que je pensais simple, mais qui s'avère compliqué sans doute parce que je m'y prends mal.
J'ai un fichier avec les heures d'arrivée et de départ des salariés (mais avec une particularité, c'est qu'ils peuvent faire du télétravail par demi journée, donc il peuvent être présent sur site (sur site), ou chez eux (TT) pour cela).
Pour déterminer les présences, j'ai repris des tranches de 30 minutes tout au long de la journée, et j'essaye (vainement) de déterminer combien sont présents.
Le résultat que je souhaite obtenir pour la ligne 7 (mercredi 2 novembre) figure en fluo dans le tableau en ligne 6.

J'ai tenté de rentrer une formule du genre dans les cellules A7:X7 mais en vain :
Code:
=SOMMEPROD(($AB7:$AU7>A$5)*($AB7:$AU7<=A$4))
Mais je suis loin d'obtenir le résultat attendu.

Quelqu'un voit ce que je ne vois pas ?

Bonne journée,
 

Pièces jointes

Solution
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 1 pour cette plage horaire.

  • 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...
Bonjour à tous 🙂,

Tout comme @job75 (que je salue 😉), j'avais aussi fait une version VBA avec une fonction personnalisée qui fait ce que font mes formules. Donc je la publie.
La fonction personnalisée est : NbrParDemiHeure ( Debut , Fin , PlageTravaillee ) où :
  • Debut est la cellule de début de la plage d'une demi-heure
  • Fin est la cellule de fin de la plage d'une demi-heure
  • PlageTravaillee est la rangée des plages travaillées

La formule en A7 est à recopier vers le bas et la droite :
VB:
=NbrParDemiHeure(A$5;A$4; $AB7:$AU7)

Le code est dans Module1.
 

Pièces jointes

Dernière édition:
Perso, je pencherais aussi pour l'utilisation d'une fonction personnalisée pour avoir des formules plus simples.👍
Bonjour @TooFatBoy 🙂,

Il y a certaines organisations qui désactivent l'utilisation des macros. On en revient donc à des formules.
Et là, O365 prend son tout son sens. D'autant plus qu'associé avec Power Query (je ne m'y suis toujours pas mis 😡), on a à notre disposition un très vaste éventail de possibilités très efficaces pour se passer de VBA.
 
Fichier (2) avec une autre fonction VBA qui permet l'ajout de salariés :
VB:
Function Presence%(deb#, fin#, titre As Range, plage As Range)
Dim c As Range, a As Range
For Each c In Intersect(titre, titre.Parent.UsedRange)
    If c <> "" Then
        Set a = Intersect(c.EntireColumn, plage)
        Presence = Presence - (IIf(fin < a(1, 2), fin, a(1, 2)) - IIf(deb > a, deb, a) > 1 / 10000) 'True => -1
    End If
Next
End Function
La formule en A7 est très simple :
Code:
=Presence(A$5;A$4;$3:$3;7:7)
 

Pièces jointes

Bonjour MUGMRG, Wayky, TooFatBoy, mapomme,

Oui je n'avais pas tenu compte des plages avec TT.

Pour éviter d'avoir des formules trop longues on peut utiliser cette fonction VBA :
VB:
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
Elle fait le travail MIN-MAX de mon post #3.

Le code doit être placé impérativement dans un module standard.

La formule en A7 :
Code:
=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))
A+
Bonjour Job75,

c'est super sympa de t'être penché dessus.
C'est fou comme toutes les formules et solutions proposées sont beaucoup plus complexes que ce que je pensais nécessaire de faire.
Ta solution, que je n'ai pas testé, sort un peu du cadre Excel pur que je souhaite utiliser. Sinon je me doute qu'en allant sur un forum vba j'aurais eu des réponses similaires à la tienne.

Merci encore d'avoir pensé à moi et de t'être prêté à l'exercice intellectuel.

Bonne journée,
 
- 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
Retour