nombre de lundis ouvert

pascb423

XLDnaute Nouveau
Bonjour,
j'utilise le code suivant pour compter le nombre de lundis qu'il y a entre 2 dates moins les jours fériés, mais ca ne décompte pas les jours fériés?
j'utilise excel 2007, peut etre que le code des jours fériés n'est pas compatible
Code:
Function NB_Lundis_matin(Date_Début As Date, Date_Fin As Date, feries As Range) As Long
If Range("I53") = "2" Then
    n = 0
    For i = Date_Début To Date_Fin
    If Application.WorksheetFunction.Weekday(i) = 2 Then
            n = n + 1
        End If
        If Application.WorksheetFunction.Weekday(i) = 2 And Application.CountIf(feries, i) > 0 Then
            n = n - 1
        End If
    Next
    If Range("d71") = "2" Then
         n = n - 1
    End If
    If Range("b71") = "2" Then
         n = n - 1
    End If
    NB_Lundis_matin = n
    Else
    NB_Lundis_matin = "0"
    End If
    If NB_Lundis_matin < "0" Then
       NB_Lundis_matin = "0"
    End If
    
End Function
 

kjin

XLDnaute Barbatruc
Re : nombre de lundis ouvert

Bonjour,
Dans le cas où il existe une plage nommée "fériés" il n'est pas nécessaire de l'inclure dans les arguments
Code:
Function NB_Lundis_matin(Date_Début As Date, Date_Fin As Date) As Long
For i = Date_Début To Date_Fin
    If Application.WorksheetFunction.Weekday(i) = 2 And Application.CountIf([feries], i) = 0 Then
        n = n + 1
    End If
Next
NB_Lundis_matin = n
End Function
A+
kjin
 

kjin

XLDnaute Barbatruc
Re : nombre de lundis ouvert

bonsoir,
Code:
Function NB_Lundis_matin(Date_Début As Date, Date_Fin As Date, Optional c As Range) As Long
Dim i As Date
If c Is Nothing Then Set c = [feries]
For i = Date_Début To Date_Fin
    If Application.WorksheetFunction.Weekday(i) = 2 And Application.CountIf(c, i) = 0 Then
        n = n + 1
    End If
Next
NB_Lundis_matin = n
End Function
A+
kjin
 

Pièces jointes

  • pascb.xls
    24 KB · Affichages: 45

pascb423

XLDnaute Nouveau
Re : nombre de lundis ouvert

merci,
ca marche avec votre script mais j'ai fait autrement
avec mon exemple join, il y a un bug
effectivement si on choisit un jour fériés en départ ou en fin, (ce qui ne devrait pas arriver mais c'est pour la propreté du programme) il y a une erreur VALEUR, je ne vois pas d'ou ca peut venir?
merci
 

Pièces jointes

  • horaires ouvrés.xlsm
    42.3 KB · Affichages: 45

pascb423

XLDnaute Nouveau
Re : nombre de lundis ouvert

oui, il y a une erreur valeur:
essayez de mettre une date par exemple 12.12.2013 et dans la liste des jours fériés rajouter cette date, ensuite changez l'heure ou il y a la date 12.12.2013 pour mettre une heure inférieur à la plage horaire journalière et la ca fait l'erreur VALEUR, voila
salutations et merci si vous arrivez à résoudre ce problème.
 

pascb423

XLDnaute Nouveau
Re : nombre de lundis ouvert

Je viens aux nouvelles pour voir si vous avez trouvé une solution au problème horaire ouvré?
merci

il doit y avoir un bug pour les jours fériés dans ce bout de code, effectivement si on met une date de fin avec une heure plus petite que l'heure maxi de l'horaire ca fait l'erreur VALEUR, je ne comprend pas ou ca peut etre si vous avez une idée, merci
Code:
Function HeuresOuvr(DateDébut As Date, DateFin As Date, PlagesLM As Range, JoursCongés As Range) As Double
Dim PH, JC, i As Long, j As Long, DaDeb2 As Date, HeureDébut As Double, PlageDeb As Long, DateD As Date
Dim DateF As Date, PlageF As Long, HeureF As Double, DaFin2 As Date, AncPlageDeb As Long
    PH = PlagesLM.Value
    JC = JoursCongés.Value
    For i = 1 To UBound(PH, 1)
        For j = 1 To UBound(PH, 2)
            If Not (i = UBound(PH, 1) And j = UBound(PH, 2) And PH(i, j) = 1) Then
                PH(i, j) = CDate(PH(i, j) - Fix(PH(i, j)))
            End If
        Next j
    Next i
    DaDeb = DateDébut
    HeureDébut = CDbl(DateDébut) - Fix(CDbl(DateDébut))
    PlageDeb = PlageEnCours(HeureDébut, PH, JC)
    DaDeb2 = DaDeb
    HeureDébut = CDbl(DaDeb2) - Fix(CDbl(DaDeb2))
    DateD = Fix(CDbl(DaDeb2))
    DaDeb = DateFin
    HeureF = CDbl(DateFin) - Fix(CDbl(DateFin))
    PlageF = PlageEnCours(HeureF, PH, JC)
    DaFin2 = DaDeb
    HeureF = CDbl(DaFin2) - Fix(CDbl(DaFin2))
    DateF = Fix(CDbl(DaFin2))
    If PlageDeb = PlageF And DateD = DateF Then
        HeuresOuvr = CDbl(DaFin2 - DaDeb2)
    Else
        AncPlageDeb = PlageDeb
        PlageDeb = PlageDeb + 1
        If PlageDeb > UBound(PH, 1) Then
            PlageDeb = 1
            DaDeb2 = ProchainJourOuvré(CDate(Fix(CDbl(DaDeb2))) + 1, JC) + CDbl(PH(1, 1))
        Else
            DaDeb2 = CDate(Fix(CDbl(DaDeb2)) + CDbl(PH(PlageDeb, 1)))
        End If
        
        HeuresOuvr = PH(AncPlageDeb, 2) - HeureDébut + HeuresOuvr(DaDeb2, DaFin2, PlagesLM, JoursCongés)
       
        
    End If
End Function
 

Statistiques des forums

Discussions
312 502
Messages
2 089 024
Membres
104 007
dernier inscrit
Monvieux