Calcul sur des dates et des heures

cs_natsuco Messages postés 2 Date d'inscription lundi 22 mai 2006 Statut Membre Dernière intervention 23 mai 2006 - 22 mai 2006 à 21:34
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 23 mai 2006 à 19:05
Bonjour, je ne sais pas tres bien comment exposer mon problème, pour commencer je dispose de deux dates prennons par exemple :

A1=18/05/2006 12:00
A2=22/05/2006 11:00

A1 date de début, A2 date de fin, je dispose également de contraintes qui sont les suivantes, je compte la durée de 8:00 à 18:00 et le samedi de 8:00 à 12:00 et le dimanche, je ne compte pas de durée. Comment faire pour faire simplement ce calcul ? pour mieux comprendre ci-dessous ce que je souhaite.

Prémière durée :
18/05/2006 12:00 -> 18/05/2006 18:00 = 6:00
19/05/2006 8:00 -> 19/05/2006 18:00 = 10:00
20/05/2006 8:00 -> 20/05/2006 13:00 = 5:00
21/05/2006 = dimanche donc 0
22/05/2006 8:00 -> 22/05/2006 11:00 = 3:00

Soit une durée de 6+10+5+0+3 = 24:00

Je vous remercie.

6 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
22 mai 2006 à 22:19
Utilise la fonction DateDiff : elle te renverra la différence entre tes dates/heures.

_
Avant de poster dans le forum,
prière d'aller lire ceci :
http://www.codes-sources.com/reglement.aspx
<s></s>
0
jsem2k1 Messages postés 125 Date d'inscription samedi 11 décembre 2004 Statut Membre Dernière intervention 12 août 2008 1
22 mai 2006 à 22:21
1) il faudrais commancer par savoir quel jour on est Soit a savoir si on est un jour de semaine ou de fin de semaine
la commande  Weekday(Date) permet de savoir quel jour de la semaine on est.

2) Dépandament du jours de la semaine on vérifi le temps. C-a-d on vérifi l'interval de temps soi le nombre d'heur écouler.
    Il faut faire attantion ici car si ce n'est pas le jour de dépar ou de fin  (ou il y a manifestement une heure de départ ou de fin) il faut
    contabiliser la totalité des heurs.

3) On incréamte la date d'une journé et on vérifi ci elle corespond a la date de fin.

4) On refait le tout a partit de la de l'étape 1

C'est une des procédure a suivre il ne reste qu'a codé le tout

Bonne chance

The J
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
22 mai 2006 à 23:05
Salut,

ceci est un essai, je ne sais pas s'il est parfait

le principe est de traiter séparément la date début, le date de fin et les dates comprises

avec un cas particulier si la date de début est la même que la date de fin.

j'ai pris en compte aussi les minutes et les secondes

j'ai aussi compté 5 heures pour le samedi mais pour moi de 8h à 12h ça devrait faire 4h


    Dim dt1   As Date

    Dim dt2   As Date

    Dim d1    As Long

    Dim d2    As Long

    Dim dt    As Long

    Dim t1    As Double

    Dim t2    As Double

    Dim tf    As Double

    Dim hd    As Double

    Dim hf    As Double

    Dim total As Double

   

    dt1 = "18/05/2006 12:00:00"

    dt2 = "22/05/2006 11:00:00"

   

    d1 Int(dt1): t1 Hour(dt1) + Minute(dt1) / 60 + Second(dt1) / 3600

    d2 Int(dt2): t2 Hour(dt2) + Minute(dt2) / 60 + Second(dt2) / 3600


    If t1 > 8 Then hd t1 Else hd t1

    If d1 < d2 Then tf 24 Else tf t2

    Select Case d1 Mod 7

        Case 1:

        Case 0:    If tf < 12 Then hf tf Else hf 12

                  
total = total + hf - hd: MsgBox hf - hd

        Case Else: If tf < 18 Then hf tf Else hf 18

                  
total = total + hf - hd: MsgBox hf - hd

        End Select

   

    For dt = d1 + 1 To d2 - 1

        Select Case dt Mod 7

            Case 1:

            Case 0:    total = total + 5:  MsgBox 5

            Case Else: total = total + 10: MsgBox 10

            End Select

        Next

   

    If d1 <> d2 Then

       Select Case d2 Mod 7

           Case 1:

           Case
0:     If t2 < 12 Then hf t2 Else hf 12

                      
total = total + hf - 8: MsgBox hf - 8

           Case Else:  If t2 < 18 Then hf t2 Else hf 18

                      
total = total + hf - 8: MsgBox hf - 8

           End Select

       End If


    MsgBox "total=" & total

Daniel
0
cs_natsuco Messages postés 2 Date d'inscription lundi 22 mai 2006 Statut Membre Dernière intervention 23 mai 2006
23 mai 2006 à 16:40
Bonjour et merci pour les réponses, merci Daniel, mais je ne comprends pas tout le code peux tu me l'annoter, car j'ai quelques manques. J'ai essayé de lancer la marco mais le résultat est faux et comme je ne comprends pas tout je ne sais pas trop a quel moment ca flanche.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
23 mai 2006 à 18:22
Re,

dans l'exemple donné je retrouve pourtant la même chose que toi


mais il y a le problème pour samedi, il faut choisir:

c'est de 8h à 12h soit 4 heures

    Case 0:    If tf < 12 Then hf tf Else hf 12
    Case 0:    total = total + 4:  MsgBox 4

    Case 0:     If t2 < 12 Then hf t2 Else hf 12

ou de 8h à 13h soit 5 heures

    Case 0:    If tf < 13 Then hf tf Else hf 13

    Case 0:    total = total + 5:  MsgBox 5

    Case 0:     If t2 < 13 Then hf t2 Else hf 13


le reste ce n'est que du calcul

1ère journée:
    heure de début:

            on
prend la plus grande: si plus grande que 8, on prend 8 sinon on prend
l'heure de début

    heure de fin:

            il n'y a pas d'heure de fin (donc 24 par défaut)

            sauf
s'il n'y a qu'une journée, dans ce cas on prend celle de la deuxième
date comme heure de fin

           
ensuite faut distinguer les 3 cas 1=dimanche, 0=samedi, sinon jour
normal

jounées comprises:
     pas de problème, on prend toute la période

     0 pour dimanche, 4h ou 5h pour samedi, 10h pour les autres

dernière journée:
    seul l'heure de fin est à prendre en compte, l'heure de début est toujours 8h

    on prend la plus petite entre l'heure de fin et l'heure fin période 12h/13h le samedi, 18h jour normal

    0 pour dimanche, heure de fin - 8 pour les autres

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
23 mai 2006 à 19:05
j'ai modifié un peu

j'ai fait une fonction qui renvoie le total en minutes, plus simple d'emploi

et tous les calculs se font en entiers long

les horaires sont mises en constantes donc  plus facilement modifiables.

Const debutHeureSamedi = 8 * 60

Const FinHeureSamedi = 13 * 60

Const debutHeureNormale = 8 * 60

Const FinHeurenormale = 18 * 60


Private Function CalculDuree(dt1 As Date, dt2 As Date) As Long

    Dim d1    As Long

    Dim d2    As Long

    Dim dt    As Long

    Dim t1    As Long

    Dim t2    As Long

    Dim tf    As Long

    Dim hd    As Long

    Dim hf    As Long

    Dim total As Long

   

    d1 Int(dt1): t1 Hour(dt1) * 60 + Minute(dt1)

    d2 Int(dt2): t2 Hour(dt2) * 60 + Minute(dt2)


    If d1 < d2 Then tf 24 * 60 Else tf t2

    Select Case d1 Mod 7

        Case 1:

        Case 0:    If
t1 > debutHeureSamedi Then hd t1 Else hd debutHeureSamedi

                  
If tf < FinHeureSamedi Then hf tf Else hf FinHeureSamedi

                  
total = total + hf - hd

        Case Else: If t1 > debutHeureNormale Then hd t1 Else hd debutHeureNormale

                  
If tf < FinHeurenormale Then hf tf Else hf FinHeurenormale

                  
total = total + hf - hd

        End Select

   

    For dt = d1 + 1 To d2 - 1

        Select Case dt Mod 7

            Case 1:

            Case
0:    total = total + FinHeureSamedi - debutHeureSamedi

            Case
Else: total = total + FinHeurenormale - debutHeureNormale

            End Select

        Next

   

    If d1 <> d2 Then

       Select Case d2 Mod 7

           Case 1:

           Case
0:     If t2 < FinHeureSamedi Then hf = t2 Else
hf = FinHeureSamedi

                      
total = total + hf - debutHeureSamedi

           Case
Else:  If t2 < FinHeurenormale Then hf t2 Else hf
FinHeurenormale

                      
total = total + hf - debutHeureNormale

           End Select

       End If

      

    CalculDuree = total


End Function


Private Sub Command1_Click()

    Dim total As Long

   
' test pour Samedi --> 5 heures
    total = CalculDuree("20/05/2006 00:00", "20/05/2006 18:00")

    MsgBox "total en heures =" & total / 60

   
' test pour Lundi --> 10 heures
    total = CalculDuree("22/05/2006 05:00", "22/05/2006 18:00")

    MsgBox "total en heures =" & total / 60

' test original --> 24 heures
    total = CalculDuree("18/05/2006 12:00", "22/05/2006 11:00")

    MsgBox "total en heures =" & total / 60


End Sub

Daniel
0
Rejoignez-nous