... 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
... 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
... 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
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
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 !
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
AV
PS : le coût de l'inscription (modique) de 1 Euro est à me faire parvenir directement !
AV
PS : le coût de l'inscription (modique) de 1 Euro est à me faire parvenir
directement !
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!
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
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 ;-))
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
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 !
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 !
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 !
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.
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 ???
:-))
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.
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 !
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 !
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 !