OVH Cloud OVH Cloud

Calcule Jour de Pâques

28 réponses
Avatar
JC
Bonjour,
Il me semble avoir vu sur ce forum une formule qui calculait quel était le
jour de pâques, mais je ne la retrouve plus. quelqu'un a une idée

Merci
Joe

8 réponses

1 2 3
Avatar
Daniel.M
Salut Frédéric,

... mais qu'on peut parfaitement s'en passer dans la mesure
où les dates du jour de Pâques sont connues et publiées ("en dur",
en quelque sorte)...


Bonne idée d'utiliser les dates en dur.
Après tout, une petite plage de moins de 1500 lignes.

1.J'aurais tendance à mettre le résultat de .Match dans une variable "Li"
_VARIANT_ et de tester l'erreur ensuite (évite un second .Match identique).

2.Étant donnée que les années de la plage sont triées et uniques, l'utilisation
d'une recherche dichotomique effectuerait beaucoup moins de comparaisons. À
savoir 12 (oui douze!) (au lieu de 1500 dans une recherche linéaire).

Donc au lieu du code suivant,
If IsError(Application.Match(An, .Range("A1:A1418").Value, 0)) Then
...
End If
' ==== j'ai procédé aux modifications qui donnent le suivant:

Dim Li ' Variant
Li = Application.Match(An, .Range("A1:A1418").Value) 'Le 1 est implicite
If IsError(Li) Then ' An trop bas
JOURPAQUES = CVErr(xlValue)
Exit Function
ElseIf .Range("A" & Li).Value <> An Then ' An trop haut
JOURPAQUES = CVErr(xlValue)
Exit Function
End If

' ====
Bien entendu, tu en fais ce que tu veux.

Tout au moins de 1583 à 3000, plage des années pour lesquelles la date du jour
de Pâques est disponible sur leur site à partir de cette page :


J'ai mis la main sur un programme DOS qui peut les générer pour très longtemps
encore.

En anglais, c'est le programme mjd_date.exe disponible là:
http://www.merlyn.demon.co.uk/holydays.htm
Toujours en anglais pour des algos dans d'autres langages et des dates de Pâques
(site bien fait) :
http://users.chariot.net.au/~gmarts/eastcalc.htm


Le tout dans un fichier zippé (avec deux mots d'explication dans un LisezMoi)
de

27 Ko à cette adresse :

http://perso.wanadoo.fr/frederic.sigonneau/exemples/DatesDimanchePaques.zip



Un fichier intéressant de plus sur ton site. :-)

Salutations,

Daniel M.

Avatar
AV
Je profite de cette ficelle pour vous inviter à participer au concours
Planétaire lancé par la SSPM (Société Savante du Plateau de Millevaches) pour
trouver la formule du dimanche de Pâques, valide de 1900 à 9999 !

Parmi les nombreux prix, figure une semaine en pension complète chez JPS !

AV
Avatar
AV
PS : le coût de l'inscription (modique) de 1 Euro est à me faire parvenir
directement !

AV
Avatar
Daniel.M
Salut Alain,

PS : le coût de l'inscription (modique) de 1 Euro est à me faire parvenir
directement !


Ben, ça va me coûter 10 fois le montant juste pour te le faire parvenir ;-)

On va attendre de se voir 'de visu'. :-)

Salutations,

Daniel M.

P.S.: Le challenge est quand même intéressant!

Avatar
AV
Ben, ça va me coûter 10 fois le montant juste pour te le faire parvenir ;-)


Bon...je vais faire une fleur pour les expatriés :
La cotisation (pour eux seulement !) est à envoyer avec la proposition d'une
soluce !
Ca fait un peu cher les frais d'envoi mais quelle Gloire ad vitam aeternam ;-))

AV

Avatar
Frédéric Sigonneau
Bonsoir Daniel,

Et merci de ta contribution.


j'ai procédé aux modifications qui donnent le suivant:

Dim Li ' Variant
Li = Application.Match(An, .Range("A1:A1418").Value) 'Le 1 est implicite
If IsError(Li) Then ' An trop bas
JOURPAQUES = CVErr(xlValue)
Exit Function
ElseIf .Range("A" & Li).Value <> An Then ' An trop haut
JOURPAQUES = CVErr(xlValue)
Exit Function
End If
' ====
On peut même, je pense, continuer encore un peu dans cette voie pour économiser

quelques lignes de code (j'ai mis la macro à jour sur mon site, même lien
qu'hier) :

Li = Application.Match(An, .Range("A1:A1418").Value)
If IsError(Li) Or An > .Range("A" & Li).Value Then
JOURPAQUES = CVErr(xlValue)
Exit Function
End If

Tout au moins de 1583 à 3000, plage des années pour lesquelles la date du jour
de Pâques est disponible sur leur site à partir de cette page :


Toujours en anglais pour des algos dans d'autres langages et des dates de Pâques
(site bien fait) :
http://users.chariot.net.au/~gmarts/eastcalc.htm


Intéressant en effet, et plus de 1000 ans de dates de plus !.. La fête de Pâques
existera-t-elle encore en 4099 ???
:-))

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Avatar
Daniel.M
Salut Frédéric,

Et merci de ta contribution.


Bienvenue!

On peut même, je pense, continuer encore un peu dans cette voie pour
économiser

quelques lignes de code (j'ai mis la macro à jour sur mon site, même lien
qu'hier) :

Li = Application.Match(An, .Range("A1:A1418").Value)
If IsError(Li) Or An > .Range("A" & Li).Value Then
JOURPAQUES = CVErr(xlValue)
Exit Function
End If


Pour être très stricte, VBA ne le permet pas.
Si tu changes ton message d'erreur pour JOURPAQUES = CVErr(xlErrNum)
tu constateras que ta fonction (avec 1000 comme Année, mettons) CONTINUERA À
RETOURNER #VALEUR!
En fait, elle n'exécutera pas l'instruction suivante. Car cette fois-ci, ce
n'est plus une erreur 'gérée' mais bien la fonction qui plante parce que le OR
de VBA exécute l'ensemble des comparaisons du OR et que la dernière comparaison
( An > ...) pose problème lorsque Li est une valeur d'erreur.


Tout au moins de 1583 à 3000, plage des années pour lesquelles la date du
jour



de Pâques est disponible sur leur site à partir de cette page :


Toujours en anglais pour des algos dans d'autres langages et des dates de
Pâques


(site bien fait) :
http://users.chariot.net.au/~gmarts/eastcalc.htm


Intéressant en effet, et plus de 1000 ans de dates de plus !


Tu essaieras le programme mjd_date, il permet de générer les dimanche des Pâques
jusqu'en l'an 9999 facilement.

Les instructions sont
<retour>
M <retour> 'MiscTests
P <retour> 'Paschal
1 <retour> 'Julian
AnDébut AnFin <retour> 'exemple 1900 9999
MaSortie.txt <retour> ' le nom du fichier de sortie

Je les ai générées (les dates) et peux te les transmettre. Laisse-le moi savoir.
Avec une recherche dichotomique, ça donnera à peine 15 comparaisons au maximum
(pour une recherche infructueuse).

.. La fête de Pâques existera-t-elle encore en 4099 ???
:-))


C'est une très bonne question. :-)

Salutations,

Daniel M.



Avatar
Frédéric Sigonneau
Re Daniel,


Pour être très stricte, VBA ne le permet pas.
Si tu changes ton message d'erreur pour JOURPAQUES = CVErr(xlErrNum)
tu constateras que ta fonction (avec 1000 comme Année, mettons) CONTINUERA À
RETOURNER #VALEUR!
En fait, elle n'exécutera pas l'instruction suivante. Car cette fois-ci, ce
n'est plus une erreur 'gérée' mais bien la fonction qui plante parce que le OR
de VBA exécute l'ensemble des comparaisons du OR et que la dernière comparaison
( An > ...) pose problème lorsque Li est une valeur d'erreur.


Tout à fait vrai. J'avais mis de côté ce comportement de VBA. Il est possible,
toutefois, de convertir la variable en Long pour contourner la difficulté :

Li = Application.Match(An, .Range("A1:A1418").Value)
If IsError(Li) Or An > .Range("A" & CLng(Li)).Value Then
JOURPAQUES = CVErr(xlErrNum)
Exit Function
End If

Je les ai générées (les dates) et peux te les transmettre. Laisse-le moi savoir.
Avec une recherche dichotomique, ça donnera à peine 15 comparaisons au maximum
(pour une recherche infructueuse).


Volontiers (mon adresse est en clair), merci d'avance.

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

1 2 3