Rapport de message :*
 

Re: Calcul nombre de jours samedi,dimanche et jours fériés entre deux dates

Titre du sujet : Re: Calcul nombre de jours samedi,dimanche et jours fériés entre deux dates
par myDearFriend! le 26/08/2008 00:52:49

Bonsoir lannou, JeanMarie, JCGL, tibo, le Forum,

De retour de congés, je tiens à vous remercier de votre passage sur ce site et de l'aide que vous apportez sans compter aux visiteurs

Je salue particulièrement le bel effort VBAistique de mon ami JeanMarie. Je l'ai toujours dit : le jour où un formuliste tel que toi se mettra vraiment au VBA, il fera un malheur ! Très beau travail, bravo !

Bravo aussi à l'ami tibo pour ce superbe exemple uniquement à base de formules ! Pour que le fil soit complet, je mets le lien sur le classeur dont tu parles pour la formule de calcul du dimanche de Pâques : sauf erreur de ma part, il s'agit de l'excellent classeur Dates et Heures de Cathy, Monique et Celeda qu'on peut retrouver sur XLD.

Comme l'ami lannou semblait demander une solution VBA, je poste donc également ci-dessous ma façon de procéder (qui ne remet absolument pas en cause le très beau travail de JeanMarie tout à fait fonctionnel) :
Option Explicit

Function NbJoursChomes(D1 As Date, D2 As Date) As Long
'myDearFriend! - www.mdf-xlpages.com
Dim DF As New Collection
Dim D As Date
Dim NbJO As Long
Dim An As Integer
Dim Ok As Boolean
    On Error Resume Next
    For An = Year(D1) To Year(D2)
        D = DimPaques(An)
        DF.Add DateSerial(An, 1, 1), CStr(DateSerial(An, 1, 1))     'Jour de l'An
        DF.Add D + 1, CStr(D + 1)                                   'Lundi de Pâques
        DF.Add DateSerial(An, 5, 1), CStr(DateSerial(An, 5, 1))     'Fête du Travail
        DF.Add DateSerial(An, 5, 8), CStr(DateSerial(An, 5, 8))     'Armistice 1945
        DF.Add D + 39, CStr(D + 39)                                 'Jeudi Ascension
        DF.Add D + 50, CStr(D + 50)                                 'Lundi de Pentecôte
        DF.Add DateSerial(An, 7, 14), CStr(DateSerial(An, 7, 14))   'Fête Nationale
        DF.Add DateSerial(An, 8, 15), CStr(DateSerial(An, 8, 15))   'Assomption
        DF.Add DateSerial(An, 11, 1), CStr(DateSerial(An, 11, 1))   'Toussaint
        DF.Add DateSerial(An, 11, 11), CStr(DateSerial(An, 11, 11)) 'Armistice 1918
        DF.Add DateSerial(An, 12, 25), CStr(DateSerial(An, 12, 25)) 'Noël
    Next An
    D = D1
    Do
        If Weekday(D, vbMonday) < 6 Then
            Ok = DF(CStr(D)) <> ""
            If Ok Then
                NbJO = NbJO + 1
                Ok = False
            End If
        Else
            NbJO = NbJO + 1
        End If
        D = D + 1
    Loop Until D > D2
    NbJoursChomes = NbJO
End Function

Private Function DimPaques(ByVal Annee As Integer) As Date
'myDearFriend! - www.mdf-xlpages.com
'(Calcul du dimanche de Pâques d'après un algorithme de Thomas O'Beirne)
Dim n As Integer, c As Integer, a As Byte, b As Byte
    n = Annee - 1900
    a = n Mod 19
    b = (11 * a + 4 - ((a * 7 + 1) \ 19)) Mod 29
    c = 25 - b - ((n - b + 31 + (n \ 4)) Mod 7)
    DimPaques = DateAdd("d", c, DateSerial(Annee, 3, 31))
End Function
La function DimPaques est élaborée par mes soins d'après l'algorithme de Thomas O'Beirne qu'on peut retrouver sur Wikipédia. (j'en profite d'ailleurs pour mettre à jour la FAQ du présent site avec cette fonction personnalisée)

Pour utiliser cette fonction personnalisée, par exemple :
Soit une date de début en A1, une date de fin en B1, dans une cellule C1 on saisit :
=NbJoursChomes(A1;B1)
On obtient ainsi le nombre de jours chômés (incluant les samedis, dimanches et jours fériés) entre ces deux dates.

Cordialement,

EDITION:
PS: lannou, ta BAL est encore pleine... peut-être pourrais-tu laisser une autre adresse Email dans ton profil pour que les notifications du Forum puissent t'être envoyée correctement ? Pour rappel, l'adresse Email peut rester confidentielle et visible uniquement pour le Webmaster.