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"
Bonne chance pour vos projets respectifs
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
Partager