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

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

  • présence horaire.xlsx
    11.8 KB · Affichages: 15
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...

mapomme

XLDnaute Barbatruc
Supporter XLD
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

  • MUGMRG- présence horaire (VBA)- v3.xlsm
    21.1 KB · Affichages: 3
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
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 :mad:), on a à notre disposition un très vaste éventail de possibilités très efficaces pour se passer de VBA.
 

job75

XLDnaute Barbatruc
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

  • présence horaire VBA(2).xlsm
    19.7 KB · Affichages: 2

MUGMRG

XLDnaute Nouveau
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,
 

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 206
dernier inscrit
diambote