XL 2013 calcul d'heure tranche horaires

kjin

XLDnaute Barbatruc
salut
J'espère que vous avez tous pris la mesure du pb qui nous arrive et adopté les mesures nécessaires, sans morale aucune
Ca fait bien longtemps que ne suis plus sur XLD, mais cette fois c'est moi qui pose la question
Une pensée pour toutes celles et ceux remarquables que j'ai pu croiser ici, et qui qqfois sont allés vers d'autres cieux
En vba s'il vous plait, je mettrai dans un onglet la plage heures de nuit - 22h-06h00 qui peut évoluer
2 cellules horaires - début - fin
Monique et Céléda avait travaillé remarquablement sur le sujet...par formules
A partir de ces 2 uniques cellules !
merci beaucoup pour votre aide
Et le fichier en Pj
 

Pièces jointes

  • pb xld.xls
    26 KB · Affichages: 49

Dranreb

XLDnaute Barbatruc
La volonté du demandeur c'est surtout sans formule.
VB:
Sub Test()
   Dim T(), L As Long, HDéb As Double, HFin As Double, Sec As Long
   T = ActiveSheet.[A2:B2].Resize(ActiveSheet.[A65000].End(xlUp).Row - 1).Value
   For L = 1 To UBound(T, 1)
      HDéb = Int(T(L, 1) * 86400 + 0.5): HFin = Int(T(L, 2) * 86400 + 0.5)
      Sec = Borné(HDéb, 79200, HFin) - Borné(HDéb, 21600, HFin): If Sec < 0 Then Sec = Sec + 57600
      T(L, 1) = IIf(Sec, Sec / 3600, Empty)
      Sec = HFin - HDéb - Sec: If Sec < 0 Then Sec = Sec + 86400
      T(L, 2) = IIf(Sec, Sec / 3600, Empty)
      Next L
   ActiveSheet.[C2:D2].Resize(UBound(T, 1)).Value = T
   End Sub
Private Function Borné(ByVal LimInf As Double, ByVal V As Double, ByVal LimSup As Double) As Double
   Borné = (LimInf + Abs(V - LimInf) - Abs(LimSup - V) + LimSup) / 2
   End Function
 

Dranreb

XLDnaute Barbatruc
21:00 à 8:00 avec mon calcul donne 3 h. normales et 8 h. de nuit.
Pour utilisation au coup par coup dans un UserForm :
VB:
Option Explicit
Private HNorm, HNuit
' …
Sub CalcHNormHNuit(ByVal HDéb As Double, ByVal HFin As Double)
   Dim Sec As Long
   HDéb = Int(HDéb * 86400# + 0.5): HFin = Int(HFin * 86400# + 0.5)
   Sec = Borné(HDéb, 79200#, HFin) - Borné(HDéb, 21600#, HFin): If Sec < 0 Then Sec = Sec + 57600
   HNorm = IIf(Sec, Sec / 3600, Empty)
   Sec = HFin - HDéb - Sec: If Sec < 0 Then Sec = Sec + 86400
   HNuit = IIf(Sec, Sec / 3600, Empty)
   End Sub
Private Function Borné(ByVal LimInf As Double, ByVal V As Double, ByVal LimSup As Double) As Double
   Borné = (LimInf + Abs(V - LimInf) - Abs(LimSup - V) + LimSup) / 2
   End Function
 

kjin

XLDnaute Barbatruc
Bonjour à tous,
Je ne reçois toujours pas de notification...
Xenondeele, merci beaucoup pour votre réponse mais je préfère sans formule...et je suis toujours sous excel2003 !
Dranreb, toutes mes excuses, je ne vous avais pas oublié, je souhaitais juste comprendre la proposition avant de répondre; la dernière mouture semble bien fonctionner et répondre à mon pb aussi (bien que je ne la comprenne pas...), mais je dois revoir ma méthode de saisie des horaires et ventiler les résultats dans les bonnes cellules en gérant les erreurs éventuelles. Mille merci
Je reviendrai vers vous si je n'y parviens pas
Encore merci à tous
 

Dranreb

XLDnaute Barbatruc
Le problème c'est que ce n'est pas vraiment facile à expliquer. Je vais essayer quand même.
Ma fonction Borné(LimInf, V, LimSup) renvoie si possible la valeur V, si elle ne sort pas des limites LimInf à LimSup, auquel cas c'est la limite dépassée qui est renvoyée.
Là où ça se complique c'est que j'ai eu l'idée de l'employer un peu à l'envers, les limites spécifiées étant les heures de début et de fin spécifiés, et la valeur bornée par ces limites étant respectivement 6:00 et 22:00 qui délimitent les heures de jour. Ainsi ce sont ces heures là qui sont reproduites si HDéb et HFin sont en dehors. Il ne reste qu'à en calculer la différence pour avoir les heures de jour. Là où ça se complique encore plus c'est que la fonction trouve aussi un résultat pas idiot lorsque l'ordre des limites est inversé. Je vous avouerais que c'est un peu empiriquement que j'ai découvert qu'il suffisait d'ajouter 16h dans ce cas …
Les heures de nuit, bien sûr, c'est la différence totale - les heures de jour.
 

jmfmarques

XLDnaute Accro
Bonjour Dranreb
Tes 16 heures "empiriques" sont tout simplement ce qui reste de 24 heures lorsqu'on leur enlève les 8 heures de la période arrêtée pour le travail "de nuit".
On ne peut valablement parler de durée entre deux relevés d'heures non complétées par la date correspondante.
Et celle-ci peut varier selon que l'on passe ou non au lendemain.
 

Statistiques des forums

Discussions
312 165
Messages
2 085 883
Membres
103 013
dernier inscrit
cicro