Calcul différence d'heures
Résolu
nitrate
-
eriiic Messages postés 25847 Statut Contributeur -
eriiic Messages postés 25847 Statut Contributeur -
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.
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:
- Calcul différence d'heures
- Difference tcp udp - Guide
- Difference million milliard - Accueil - Technologies
- Calcul moyenne excel - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Différence entre gb et go - Forum Mobile
7 réponses
Bonjour,
Pas simple par formule...
Une proposition de fonction personnalisée en VBA :
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.
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.
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
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
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é :
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
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
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é.
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é.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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.
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.