Dimanche :
La plus courte, attention au découpage :
=DATE(An;3;22+MOD(19*MOD(An;19)+24;30)+MOD(2*MOD(An;4)+4 *MOD(An;7)+6*MOD(19*MOD(An;19)+24;30)+5;7))
La plus juste, attention au découpage :
=DATE(An;SI((25-MOD((11*MOD(An-1900;19)+4-ENT((7*MOD(An-1900;19)+1)/19)) ;29)-MOD(An-1900+ENT((An-1900)/4)+31-MOD((11*MOD(An-1900;19)+4- ENT((7*MOD(An-1900;19)+1)/19));29);7))>0;4;3); SI((25-MOD((11*MOD(An-1900;19)+4-ENT((7*MOD(An-1900;19)+1)/19));29)- MOD(An-1900+ENT((An-1900)/4)+31-MOD((11*MOD(An-1900;19)+4- ENT((7*MOD(An-1900;19)+1)/19));29);7))>0;(25-MOD((11*MOD(An-1900;19)+ 4-ENT((7*MOD(An-1900;19)+1)/19));29)-MOD(An-1900+ENT((An-1900)/4)+31- MOD((11*MOD(An-1900;19)+4-ENT((7*MOD(An-1900;19)+1)/19));29);7));31+ (25-MOD((11*MOD(An-1900;19)+4-ENT((7*MOD(An-1900;19)+1)/19));29)- MOD(An-1900+ENT((An-1900)/4)+31-MOD((11*MOD(An-1900;19)+4- ENT((7*MOD(An-1900;19)+1)/19));29);7))))
Ascension + 39 jours - Pentecôte + 49 jours
Public Function Paques(ByVal Année As Long, Optional ByVal Lundi As Boolean = True) As Date Dim Tmp As Long, Tmp1 As Long, Tmp2 As Long, Tmp3 As Long, lMod4 As Long Dim lMod7 As Long, lMod19 As Long, lMod30 As Long Application.Volatile (True) lMod4 = Année Mod 4 lMod7 = Année Mod 7 lMod19 = Année Mod 19 lMod30 = (19 * lMod19 + 24) Mod 30 Tmp1 = (19 * lMod19 + 24) Mod 30 Tmp2 = 2 * lMod4 + 4 * lMod7 + 6 * lMod30 + 5 Tmp3 = Tmp2 Mod 7 'Nbr jours après le 22/03 Tmp = Tmp1 + Tmp3 If Lundi Then Paques = CDate(22 & "/" & 3 & "/" & Année) + Tmp + 1 Else Paques = CDate(22 & "/" & 3 & "/" & Année) + Tmp End If End Function
Attention : le calcul du No de semaine d'Excel est faux (non normé). Le remplacer par :
Public Function SemaineISO(DateExcel As Date) As Long Dim iTmp As Long Application.Volatile DateExcel = Int(DateExcel) iTmp = DateSerial(Year(DateExcel + (8 - WeekDay(DateExcel)) Mod 7 - 3), 1, 1) SemaineISO = ((DateExcel - iTmp - 3 + (WeekDay(iTmp) + 1) Mod 7)) \ 7 + 1 End Function
Public Function Annee_Musulmane(ByVal Annee As Long) As Long Application.Volatile True Annee_Musulmane = ((Annee - 621) * 365.25) / 354.61 End Function Public Function Annee_Occidentale(ByVal Annee As Long) As Long Application.Volatile True Annee_Occidentale = ((Annee * 354.61) / 365.25) + 621 End Function