Calcul de la date de Pâques en VBA et en Excel



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

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 qui est utilisée comme paramêtre de la fonction.

Exemple d'utilisation: pour déterminer la date du Dimanche de Pâques de 2020 => x = Pâques(2020)

Et voici déjà le code de la fonction prête à l'utilisation…

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 H <= 31 Then
    p_jour = H
    p_mois = 3
Else
    p_jour = r
    p_mois = 4
End If

If d = 29 And e = 6 Then
    p_jour = 19
    p_mois = 4
End If

If d = 28 And e = 6 And (11 * M + 11) / 30 < 19 Then
    p_jour = 18
    p_mois = 4
End If

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, 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 14/4/2019 est un Dimanche de Pâques => EstPaques("14/4/2019")

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 H <= 31 Then
    p_jour = H
    p_mois = 3
Else
    p_jour = r
    p_mois = 4
End If

If d = 29 And e = 6 Then
    p_jour = 19
    p_mois = 4
End If

If d = 28 And e = 6 And (11 * M + 11) / 30 < 19 Then
    p_jour = 18
    p_mois = 4
End If

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(2013)

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 H <= 31 Then
    p_jour = H
    p_mois = 3
Else
    p_jour = r
    p_mois = 4
End If

If d = 29 And e = 6 Then
    p_jour = 19
    p_mois = 4
End If

If d = 28 And e = 6 And (11 * M + 11) / 30 < 19 Then
    p_jour = 18
    p_mois = 4
End If

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("2/4/2018")

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 H <= 31 Then
    p_jour = H
    p_mois = 3
Else
    p_jour = r
    p_mois = 4
End If

If d = 29 And e = 6 Then
    p_jour = 19
    p_mois = 4
End If

If d = 28 And e = 6 And (11 * M + 11) / 30 < 19 Then
    p_jour = 18
    p_mois = 4
End If

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…

Pour aller plus loin en VBA

Et voici quelques autres tutoriels et codes VBA qui pourraient vous être utiles

 

1 0

Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.