Calcul et utilisation des dates en Excel et en VBA est particulièrement fréquent. Dans le milieu professionnel, il est souvent nécessaire de distinguer les jours ouvrables et les jours fériés. Si on omet les différences entre les pays en matière des jours fériés, la détermination des jours fériés "fixes" est relativement facile. Là où cela devient plus compliqué, c'est pour les jours fériés "variables". Pour commencer, je vous propose quelques fonctions prêtes à l'emploi pour gérer correctement les dates de Pâques en VBA. Le calcul de la date des Pâques est très complexe. C'est pour cela que j'ai choisi ces jours fériés pour commencer (d'autres suivront plus tard).
Sommaire
- A) Fonction VBA: déterminer la date du Dimanche de Pâques pour une année donnée
- B) Fonction VBA: vérifier si une date correspond au Dimanche de Pâques
- C) Fonction VBA: déterminer la date du Lundi de Pâques pour une année donnée
- D) Fonction VBA: vérifier si une date correspond au Lundi de Pâques
- Conclusion
- Pour aller plus loin en VBA
Je vous ai préparé 4 fonctions VBA qu'il vous suffira de copier dans un Module VBA de votre fichier Excel. Vous pourrez ensuite les utiliser purement en VBA ou en tant que "UDF" (User Defined Functions) dans les Feuilles Excel.
Deux de ces fonctions VBA vérifient si une date est un Dimanche ou un Lundi de Pâques et les deux autres vous donnent la date du Dimanche et du Lundi de Pâques pour une année au choix.
A) Fonction VBA: déterminer la date du Dimanche de Pâques pour une année donnée
Cette fonction renvoie la date du Dimanche de Pâques pour une année au choix. C'est donc cette année (en tant que nombre de type Integer
) qui est utilisée comme paramètre de la fonction.
Exemple d'utilisation: pour déterminer la date du Dimanche de Pâques de 2024 => x = Pâques(2024)
Et voici déjà le code de la fonction prête à l'utilisation…
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 |
Public Function Paques(Annee As Integer) 'par Excel-Malin.com ( https://excel-malin.com ) Dim a, b, c, k, p, q, M, O, d, e, H, r, p_jour, p_mois As Integer a = Annee Mod 19 b = Annee Mod 4 c = Annee Mod 7 k = Int(Annee / 100) p = Int((8 * k + 13) / 25) q = Int(k / 4) M = (15 - p + k - q) Mod 30 O = (4 + k - q) Mod 7 d = (19 * a + M) Mod 30 e = (2 * b + 4 * c + 6 * d + O) Mod 7 H = 22 + d + e r = H - 31 If (d = 29 And e = 6) Or (d = 28 And e = 6 And (11 * M + 11) Mod 30 < 19) Then H = H - 7 End If p_mois = Int(H / 32) + 3 p_jour = ((H - 1) Mod 31) + 1 Paques = CDate(p_jour & "/" & p_mois & "/" & Annee) End Function |
B) Fonction VBA: vérifier si une date correspond au Dimanche de Pâques
Si vous avez une date ou une liste des dates et vous voulez vérifier s'il s'agit du Dimanche de Pâques, vous pouvez utiliser la fonction suivante. Elle renvoie un résultat de type Boolean (=VRAI ou FAUX, True
ou False
) selon que la date choisie correspond ou ne correspond pas au Dimanche de Pâques.
Exemple d'utilisation: pour déterminer si 7/4/2023 est un Dimanche de Pâques => EstPaques("7/4/2024")
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 |
Public Function EstPaques(MaDate As Date) 'par Excel-Malin.com ( https://excel-malin.com ) Annee = Year(MaDate) EstPaques = False Dim a, b, c, k, p, q, M, O, d, e, H, r, p_jour, p_mois As Integer a = Annee Mod 19 b = Annee Mod 4 c = Annee Mod 7 k = Int(Annee / 100) p = Int((8 * k + 13) / 25) q = Int(k / 4) M = (15 - p + k - q) Mod 30 O = (4 + k - q) Mod 7 d = (19 * a + M) Mod 30 e = (2 * b + 4 * c + 6 * d + O) Mod 7 H = 22 + d + e r = H - 31 If (d = 29 And e = 6) Or (d = 28 And e = 6 And (11 * M + 11) Mod 30 < 19) Then H = H - 7 End If p_mois = Int(H / 32) + 3 p_jour = ((H - 1) Mod 31) + 1 DatePaques = CDate(p_jour & "/" & p_mois & "/" & Annee) If MaDate = DatePaques Then EstPaques = True End Function |
C) Fonction VBA: déterminer la date du Lundi de Pâques pour une année donnée
Tout comme la fonction "A" plus haut qui renvoie la date du Dimanche de Pâques, la fonction qui suit renvoie la date du Lundi de Pâques pour une année donnée.
Exemple: x = LundiDePaques(2025)
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 |
Public Function LundiDePaques(Annee As Integer) 'par Excel-Malin.com (https://excel-malin.com ) Dim a, b, c, k, p, q, M, O, d, e, H, r, p_jour, p_mois As Integer a = Annee Mod 19 b = Annee Mod 4 c = Annee Mod 7 k = Int(Annee / 100) p = Int((8 * k + 13) / 25) q = Int(k / 4) M = (15 - p + k - q) Mod 30 O = (4 + k - q) Mod 7 d = (19 * a + M) Mod 30 e = (2 * b + 4 * c + 6 * d + O) Mod 7 H = 22 + d + e r = H - 31 If (d = 29 And e = 6) Or (d = 28 And e = 6 And (11 * M + 11) Mod 30 < 19) Then H = H - 7 End If p_mois = Int(H / 32) + 3 p_jour = ((H - 1) Mod 31) + 1 LundiDePaques = CDate(p_jour & "/" & p_mois & "/" & Annee) + 1 End Function |
D) Fonction VBA: vérifier si une date correspond au Lundi de Pâques
Et voici la fonction qui va vérifié si une date donnée correspond au Lundi de Pâques ou pas…
Exemple d'utilisation: y = EstLundiDePaques("1/4/2024")
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 |
Public Function EstLundiDePaques(MaDate As Date) 'par Excel-Malin.com ( https://excel-malin.com ) Annee = Year(MaDate) EstLundiDePaques = False Dim a, b, c, k, p, q, M, O, d, e, H, r, p_jour, p_mois As Integer a = Annee Mod 19 b = Annee Mod 4 c = Annee Mod 7 k = Int(Annee / 100) p = Int((8 * k + 13) / 25) q = Int(k / 4) M = (15 - p + k - q) Mod 30 O = (4 + k - q) Mod 7 d = (19 * a + M) Mod 30 e = (2 * b + 4 * c + 6 * d + O) Mod 7 H = 22 + d + e r = H - 31 If (d = 29 And e = 6) Or (d = 28 And e = 6 And (11 * M + 11) Mod 30 < 19) Then H = H - 7 End If p_mois = Int(H / 32) + 3 p_jour = ((H - 1) Mod 31) + 1 DateLundiDePaques = CDate(p_jour & "/" & p_mois & "/" & Annee) + 1 If MaDate = DateLundiDePaques Then EstLundiDePaques = True End Function |
Conclusion
J'espère que ces fonctions VBA vont bien vous servir. Il s'agit d'un bon exemple de ce que VBA peut faire pour vous rendre la vie plus facile… On peut également bien voir l'utilité de passer par les fonctions VBA – un calcule au code assez complexe peut être appelé très vite et très facilement. Que ce soit à partir d'une procédure VBA ou directement à partir d'une cellule Excel.
Pour aller plus loin en VBA
Et voici quelques autres tutoriels et codes VBA qui pourraient vous être utiles:
- Gestion des dates en VBA
- Toutes les fonctions disponibles en VBA
- Tous les Codes sources VBA par Excel-Malin.com
- Utiliser la fonction RECHERCHEV en VBA
- Comment protéger son code VBA par un mot de passe
6 commentaires sur “Calcul de la date de Pâques en VBA et en Excel”
Ne fonctionne pas pour l'année 2020… Paques tombe au debut decembre 2020…
J'ai trouvé cette formule qui fonctionne pour 2020 (et pour 2018 aussi) :
=DATE(année;3;29,56+0,979*MOD(204-11*MOD(année;19);30)-JOURSEM(DATE(A1;3;28,56+0,979*MOD(204-11*MOD(année;19);30))))
Ce sont les 2 seules années que j'ai eu en problème a date, peut-etre d'autres années sont en probleme aussi… mais fonctionnent avec cette formule.
Cette formule a l'avantage d'être relativement simple mais n'est pas totalement fiable. Cette formule ne fonctionne pas pour ces années dans l'intervalle [1900-2400] 1954 1981 2049 2076 2106 2133 2204 2207 2209 2217 2221 2224 2227 2228 2231 2241 2244 2247 2248 2251 2266 2268 2271 2272 2275 2285 2292 2295 2301 2302 2304 2305 2312 2315 2316 2322 2323 2325 2326 2329 2334 2336 2342 2346 2349 2353 2356 2359 2361 2366 2369 2370 2372 2373 2376 2379 2380 2383 2390 2391 2393 2396 2397 2399
Bonjour Alain,
la fonction fonctionne. Pour 2020, elle retourne le 12/4/2020.
Donc j'imagine que votre date est formatée à l'anglo-saxonne: MM/JJ/AAAA et c'est pour cela que vous voyez 4/12/2020.
Cordialement, Martin
Bonjour
Vous allez penser que je pinaille en vous rappelant qu'une date ne peut pas tenir dans un chiffre et qu'un nombre serait plus adapté.
Bien cordialement
Bonjour Jacques,
merci pour cette remarque pertinente. Je viens de corriger l'erreur dans le texte.
Le français n'est pas ma langue maternelle et parfois, une erreur se faufile encore 🙂
Bien à vous, Martin