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. 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
  2. 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. J'ai mis uniquement les lignes posant problèmes.

      http://cjoint.com/?3DhtrTmoRtn
      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. 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. 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
          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