Calcul différence d'heures

Résolu
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.

7 réponses

  1. Contributeur
    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
    1. 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
      1. Attention le 3/11/12 était un samedi!
        0
    2. Contributeur
      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
      1. 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
        1. Contributeur
          il me faut des exemples concrets...
          0
      2. J'ai mis uniquement les lignes posant problèmes.

        http://cjoint.com/?3DhtrTmoRtn
        0
        1. Contributeur
          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
          1. Désolé pour la réponse tardive mais j'étais en déplacement toute la semaine.

            Merci Eriic, ca fonctionne très bien.
            0
            1. Contributeur
              ok, je met en résolu pour toi (en haut vers ton titre, pour la prochaine fois)
              eric
              0