Calcul différence d'heures

Résolu/Fermé
nitrate - 7 avril 2013 à 11:41
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 13 avril 2013 à 22:49
Bonjour,

J'ai un souci sous excel 2007, j'ai deux colonnes N et O, dans la colonne N j'ai une date et une heure du type 2/11/12 8:53 et pareil dans la colonne O.

Je doit calculer le délais de traitement entre N et O sachant que O est toujours supérieur à N.

La ou cela se complique c'est que je doit calculer le délais en jours ouvrés et en heure d'ouverture, donc si N = 2/11/12 8:53 et que O = 03/11/2012 08:40:00 et que mes horaires d'ouvertures sont de 08h30 à 17h30 je devrais normalement avoir un résultat de 08h47 mais comment faire sur excel pour trouver une formule adéquate.

Merci d'avance.





A voir également:

7 réponses

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
Modifié par eriiic le 7/04/2013 à 13:31
Bonjour,

Pas simple par formule...
Une proposition de fonction personnalisée en VBA :
Function delai_H_Ouv(date1 As Date, date2 As Date) As Date 
    Dim date3 As Date, jour As Long, c As Range 
    Dim Hdeb As Date, Hfin As Date 
    Dim Houv As Variant 
    Houv = [Ouverture] 
    For date3 = Int(date1) To Int(date2) 
        Set c = [Fériés].Find(Format(Int(date3), "ddd dd mmm yyyy"), LookIn:=xlValues) 
        jour = Weekday(date3, vbMonday) 
        If c Is Nothing Then 
            If date3 = Int(date1) Then 
                Hdeb = Application.Max(date1 - Int(date1), Houv(jour, 1)) 
                Hfin = Houv(jour, 2) 
            ElseIf date3 = Int(date2) Then 
                Hdeb = Houv(jour, 1) 
                Hfin = Application.Min(date2 - Int(date2), Houv(jour, 2)) 
            Else 
                Hdeb = Houv(jour, 1) 
                Hfin = Houv(jour, 2) 
            End If 
            delai_H_Ouv = delai_H_Ouv + Hfin - Hdeb 
        End If 
    Next date3 
End Function

https://www.cjoint.com/?CDhnzUvWyXQ
Tiens compte des fériés.

eric

PS; je trouve 8:37....

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
0
Bonjour Eriic,

Merci ça fonctionne mais pas à chaque fois, d'ailleurs en calculant de tête je ne comprend pas pourquoi tu trouve 8h37 alors que c'est bien 8h47.

Je t'ai mis un exemple ci dessous avec quelques dates que j'ai à calculer, j'ai l'impression que ca plante lorsque le calcul doit se faire sur le même jour.

http://cjoint.com/?3DhqVAQzMY0
0
tontong Messages postés 2548 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 15 mars 2024 1 054
7 avril 2013 à 17:11
Attention le 3/11/12 était un samedi!
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
7 avril 2013 à 17:36
Re,

Effectivement, ça fait bien 8h47.
Seulement je n'avais pas prévu que tu démarres un samedi pour terminer un dimanche. C'est en effet les jours des 02 et 03/11/2012. Pas de chance.... ;-)
C'est corrigé :
Function delai_H_Ouv(date1 As Date, date2 As Date) As Date
    Dim date3 As Date, jour As Long, c As Range
    Dim Hdeb As Date, Hfin As Date
    Dim Houv As Variant
    Houv = [Ouverture]
    For date3 = Int(date1) To Int(date2)
        Set c = [Fériés].Find(Format(Int(date3), "ddd dd mmm yyyy"), LookIn:=xlValues)
        jour = Weekday(date3)
        If c Is Nothing And IsNumeric(Houv(jour, 1)) And IsNumeric(Houv(jour, 2)) Then
            If Int(date1) = Int(date2) Then
                delai_H_Ouv = date2 - date1
            Else
                If date3 = Int(date1) Then
                    Hdeb = Application.Max(date1 - Int(date1), Houv(jour, 1))
                    Hfin = Houv(jour, 2)
                ElseIf date3 = Int(date2) Then
                    Hdeb = Houv(jour, 1)
                    Hfin = Application.Min(date2 - Int(date2), Houv(jour, 2))
                Else
                    Hdeb = Houv(jour, 1)
                    Hfin = Houv(jour, 2)
                End If
                delai_H_Ouv = delai_H_Ouv + Hfin - Hdeb
            End If
        End If
    Next date3
End Function
De toute façon il y avait également d'autres manques.
J'ai complété pour dates le même jour.
Par contre je ne contrôle pas que les heures saisies soient bien dans les heures d'ouverture. Respecter ces heures.
Je te laisse contrôler de près car la fonction weekday() ne réagit pas comme l'aide le mentionne et ça me gène un peu.
https://www.cjoint.com/?CDhrI5u8B7E

eric


0
Merci Eriic,

C'est mieux, comme tu le dit avec weekday ca pose problème car bizarrement lorsque un jours férié se glisse entre deux dates le délais ne reprend pas après ce jours férié.
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
7 avril 2013 à 19:08
il me faut des exemples concrets...
0

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

Posez votre question
J'ai mis uniquement les lignes posant problèmes.

http://cjoint.com/?3DhtrTmoRtn
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
Modifié par eriiic le 7/04/2013 à 19:58
J'avais écris Par contre je ne contrôle pas que les heures saisies soient bien dans les heures d'ouverture. Respecter ces heures.
Et tu as des débuts à 20:19, 20:47, ...
Je traite ces cas là aussi maintenant.

Et j'ai trouvé le pb avec weekday(). Je devais utiliser le calendrier 2011 et forcément j'avais du mal à être d'accord avec lui avec les paramétrages corrects. Corrigé aussi.

On devrait être proches de la fin :
https://www.cjoint.com/?CDht1OkglOy

eric

PS, le code pour les futurs lecteurs :
Function delai_H_Ouv(date1 As Date, date2 As Date) As Date 
    Dim date3 As Date, jour As Long, c As Range 
    Dim Hdeb As Date, Hfin As Date 
    Dim Houv As Variant 
    Houv = [Ouverture] 
    For date3 = Int(date1) To Int(date2) 
        Set c = [Fériés].Find(Format(Int(date3), "ddd dd mmm yyyy"), LookIn:=xlValues) 
        jour = Weekday(date3, 2) 
        If c Is Nothing And Houv(jour, 1) <> 0 And Houv(jour, 2) <> 0 Then 
            If Int(date1) = Int(date2) Then 
                delai_H_Ouv = date2 - date1 
            Else 
                If date3 = Int(date1) Then 
                    Hdeb = Application.Max(date1 - Int(date1), Houv(jour, 1)) 
                    Hfin = Houv(jour, 2) 
                ElseIf date3 = Int(date2) Then 
                    Hdeb = Houv(jour, 1) 
                    Hfin = Application.Min(date2 - Int(date2), Houv(jour, 2)) 
                Else 
                    Hdeb = Houv(jour, 1) 
                    Hfin = Houv(jour, 2) 
                End If 
                If Hfin > Hdeb Then delai_H_Ouv = delai_H_Ouv + Hfin - Hdeb 
            End If 
        End If 
    Next date3 
End Function


Et n'oublie pas que dans les fériés il n'y a que ceux d'une année....

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
0
Désolé pour la réponse tardive mais j'étais en déplacement toute la semaine.

Merci Eriic, ca fonctionne très bien.
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
13 avril 2013 à 22:49
ok, je met en résolu pour toi (en haut vers ton titre, pour la prochaine fois)
eric
0