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.
|