Bonjour à tous,

Ayant besoin pour un projet de gérer une notion de jours travaillés (= jours ouvrés), j'ai voulu exclure de cette liste les jours fériés.

La plupart des jours fériés ont un positionnement fixe dans l'année (1 janvier, 1er mai, 14 juillet, 15 août...) mais pour d'autres c'est plus compliqué car la date change chaque année (Jour de Pâques en particulier car pour l'Ascension et la Pencôte ils sont placés un nombre de jours constant après le jour de pâques... le problème revient donc à calculer cette date).

En fouillant sur Internet j'ai trouvé la formule ci-joint pour le calcul du jour de pâques, qui est une formule pour EXCEL
(trouvée sur le site de Microsoft http://support.microsoft.com/kb/459735/fr)

=SI(MOD(19*MOD(année;19)+24;30)+MOD(2*MOD(année;4)+4*MOD(année;7)+6*MOD(19*MOD(année;19)+24;30)+5;7)-9<=0;DATE(année;3;22+MOD(19*MOD(année;19)+24;30)+MOD(2*MOD(année;4)+4*MOD(année;7)+6*MOD(19*MOD(année;19)+24;30)+5;7));DATE(année;4;MOD(19*MOD(année;19)+24;30)+MOD(2*MOD(année;4)+4*MOD(année;7)+6*MOD(19*MOD(année;19)+24;30)+5;7)-9))

Comme elle m'a paru un peu compliquée à adapter j'ai continué à chercher et trouvé une adaptation plus simple (auteur inconnu) qui donne le même résultat (allez comprendre...).

Cette formule 'simplifiée' est la suivante :

=DATE(année;3;29,56+0,979*MOD(204-11*MOD(année;19);30)-JOURSEM(DATE(année;3;28,56+0,979*MOD(204-11*MOD(année;19);30))))

C'est de cette dernière formule que je me suis donc inspiré, en l'adaptant en VBA pour les besoins de mon projet.

C'est cette adaptation en VBA que je vous livre ici pour le cas où cela pourrait servir à certains :

Une petite précision... il s'agit du code d'une CLASSE de mon projet... c'est la classe qui effectue le calcul des différents jours fériés de l'année et les stocke dans une collection de JoursFériés... le code qui gère la collection n'ayant pas d'intérêt ici je ne rentre pas dans ces détails et je vous livre donc cette classe telle quelle, en vous laissant le soin de l'adapter à vos besoins. Si besoin d'autres précisions faites le savoir je pourrai compléter...

CODE DE LA CLASSE "CLstJoursFeries"

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
Option Explicit
 
Private Const kJourDeLAn As String = "Jour de l'an"
Private Const kLundiDePaques As String = "Lundi de Pâques"
Private Const kFeteDuTravail As String = "Fête du travail"
Private Const kVictoireDe1945 As String = "Victoire de 1945"
Private Const kAscension As String = "Ascension"
Private Const kPentecote As String = "Pentecôte"
Private Const kFeteNationale As String = "Fête nationale"
Private Const kAssomption As String = "Assomption"
Private Const kToussaint As String = "Toussaint"
Private Const kArmistice As String = "Armistice"
Private Const kNoel As String = "Noël"
 
Private m_AnneeDeReference As Integer
 
Private m_theLstJoursFeries As USortedCollection
 
Public Property Let AnneeDeReference(pintAnnee As Integer)
    If pintAnnee <> m_AnneeDeReference Then
        ' Modification de l'année => Il faut recalculer la liste des jours fériés
        Let m_AnneeDeReference = pintAnnee
        Set m_theLstJoursFeries = New USortedCollection ' On recrée la collection
        Call zzCalculeLesDifferentsJoursFeries
    End If
End Property
 
Public Property Get AnneeDeReference() As Integer
    Let AnneeDeReference = m_AnneeDeReference
End Property
 
Public Function EstJourFerie(pDate As Date) As Boolean
Dim i As Integer
Dim ltmpJourFerie As CJourFerie
    'Begin
    For i = 1 To m_theLstJoursFeries.Count
    Set ltmpJourFerie = m_theLstJoursFeries.Item(i)
        If ltmpJourFerie.theDate = pDate Then
            Let EstJourFerie = True
            Exit For
        End If
    Next i
End Function
 
Public Function DescriptionListeJoursFeries() As String
Dim i As Integer
Dim lJourFerie As CJourFerie
Dim lstrResult As String
    'Begin
    Let lstrResult = "En excluant les jours fériés suivants :"
    For i = 1 To m_theLstJoursFeries.Count
        Set lJourFerie = m_theLstJoursFeries.Item(i)
        Let lstrResult = lstrResult & vbLf & " " & lJourFerie.theDate & " : " & lJourFerie.Description
    Next i
    Let DescriptionListeJoursFeries = lstrResult
End Function
 
Private Sub zzCalculeLesDifferentsJoursFeries()
Dim lJourFerie As CJourFerie
Dim lMod1 As Integer ' Pour calcul jour de Pâques
Dim lMod2 As Integer ' Pour calcul jour de Pâques
Dim lPremierMars As Date ' Pour calcul jour de Pâques
Dim lOffset2856 As Byte ' Pour calcul jour de Pâques
Dim lOffset2956 As Byte ' Pour calcul jour de Pâques
Dim ldateJourDePaques As Date
Dim lItemIndex As Byte
    'Begin
    Let lItemIndex = 1
    ' CALCUL JOUR DE L'AN
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kJourDeLAn
    Let lJourFerie.theDate = CDate("01/01/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DU LUNDI DE PAQUES... C'EST LE PLUS COMPLIQUÉ
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kLundiDePaques
    Let lMod1 = m_AnneeDeReference Mod 19
    Let lMod2 = (204 - (11 * lMod1)) Mod 30
    Let lPremierMars = CDate("01/03/" & Str$(m_AnneeDeReference))
    Let lOffset2856 = Val(28.56 + 0.979 * lMod2)
    Let lOffset2956 = Val(29.56 + 0.979 * lMod2 - Weekday(DateAdd("d", lOffset2856, lPremierMars)))
    Let ldateJourDePaques = DateAdd("d", lOffset2956, lPremierMars)
    Let lJourFerie.theDate = DateAdd("d", 1, ldateJourDePaques) ' NB : le LUNDI de pâques est le lendemain du JOUR de pâques
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL FÊTE DU TRAVAIL (1er MAI)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kFeteDuTravail
    Let lJourFerie.theDate = CDate("01/05/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL VICTOIRE DE 1945 (8 MAI)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kVictoireDe1945
    Let lJourFerie.theDate = CDate("08/05/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DE L'ASCENSION (39 jours après le lundi de pâques)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kAscension
    Let lJourFerie.theDate = DateAdd("d", 39, ldateJourDePaques)
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DE LA PENTECÔTE (50 jours après le lundi de pâques)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kPentecote
    Let lJourFerie.theDate = DateAdd("d", 50, ldateJourDePaques)
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DE LA FÊTE NATIONALE (14 JUILLET)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kFeteNationale
    Let lJourFerie.theDate = CDate("14/07/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DE L'ASSOMPTION (15 AOÛT)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kAssomption
    Let lJourFerie.theDate = CDate("15/08/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DE LA TOUSSAINT (1er NOVEMBRE)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kToussaint
    Let lJourFerie.theDate = CDate("01/11/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DE L'ARMISTICE (11 NOVEMBRE)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kArmistice
    Let lJourFerie.theDate = CDate("11/11/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
    Let lItemIndex = lItemIndex + 1
    ' CALCUL DU JOUR DE NOEL (25 DECEMBRE)
    Set lJourFerie = New CJourFerie
    Let lJourFerie.Code = lItemIndex
    Let lJourFerie.Description = kNoel
    Let lJourFerie.theDate = CDate("25/12/" & Str$(m_AnneeDeReference))
    Call m_theLstJoursFeries.AddUnique(lJourFerie)
End Sub
Bonne chance pour vos projets respectifs