CALENDRIER, MODE D'EMPLOI

Signaler
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
mdry
Messages postés
33
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
5 mai 2013
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53859-calendrier-mode-d-emploi

mdry
Messages postés
33
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
5 mai 2013

Salut Noone1,

Je te remercie pour le site IMCCE. Bouceaup de lecture en vue.

Merci encore une fois.
noone1
Messages postés
42
Date d'inscription
mardi 29 juin 2004
Statut
Membre
Dernière intervention
12 septembre 2015

bonjour Pasquet78

pas de problème et merci pour la réponse, et en fait désolé pour le dérangement. Je me suis penché un peu pus sur tous les codes, ce qui me posait problème c'était toutes les variables pour l'actualisation des 'form' qu'on ne peut importer en VBA. N'en n'ayant pas besoin pour mon calendrier, j'ai finalement sorti toutes les routines, viré les références aux libélés, etc pour finalement interfacer tout ça à ma sauce dans mon classeur excel. En fait je voulais juste pouvoir récupérer les données sur les dates des fêtes, les phases de la lune (qui me sert à tester mon code) et 2-3 autres choses comme les saisons, la lune rousse, etc.

Finalement tout est impec' et encore bravo pour ce projet bien complet avec ces commentaires très instructifs et aux autres participants pour les corrections apportées.

Dans mon calendrier, je rajoute également les heures de lever/coucher de la lune et du soleil (@MDRV: sources que l'on trouve facilement par ailleurs sur le net mais je n'ai plus les réf. en tête, sinon tu peux tjs récupérer les valeurs sur le site de l'IMCCE, ça dépend de ce que tu souhaites faire), je posterai peut-être un jour le tout quand ce sera terminé car ce projet me sert avant tout à découvrir et me familiariser avec VBA qui est parfois... étrange pour moi :-) (50 façons d'écrire un truc mais pas foutu d'en trouver une qui marche, arf!)

bonne continuation.
mdry
Messages postés
33
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
5 mai 2013

Bonjour,
très beau travail. J'ai inclus les phases de la lune et les saisons dans mon programme de calendrier mural. Est-il possible d'avoir une formule genre "à coucher dehors" sans t'offensé pour inclure les heures des levés et couchés du soleil.
Merci, et bonne programmation.
pasquet78
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2008

Bonjour Noone1,

Tout d’abord, je m’excuse pour ce retard de réponse car je n’ai pas lu mes mails depuis quelques temps.
Je comprends que tu as des difficultés pour une transcription sur VBE, mais tu ne précises pas à quel endroit il y a un problème. Comme le programme comporte plusieurs sujets, il faudrait que tu me précises ce que je dois développer ?

Bonne journée,
Gérard
noone1
Messages postés
42
Date d'inscription
mardi 29 juin 2004
Statut
Membre
Dernière intervention
12 septembre 2015

bonjour,
je débute et essaie de me faire un calendrier mais je n'ai pas visual basic, seulement excel. J'ai pu interfacer les fonctions dans meuss.bas mais pour le reste ça ne marche pas puisque c'est en VB. Pourriez-vous poster une version excel 2000 (VBE)?
merci
pasquet78
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2008

edauzat : Comme quoi les commentaires sont utiles, c’est effectivement 7 et non 17 qu’il fallait écrire. J’ai relu la source de l’algorithme et, lorsque j’ai vu la calligraphie du ‘ l ’ minuscule qui ressemble au ‘ 1 ‘, j’ai compris ma méprise.
Ce qui est étonnant, c’est que j’ai lu plusieurs fois le code, pour comprendre pourquoi j’ai trouvé ces 20 erreurs dans mon test jusqu’à l’an 4100, sans voir que j’avais mis 17 au lieu de 7. J’étais d’autant plus surpris que j’avais écrit le programme dans d’autres langages (C, LMS et Excel) sans problème.

Warny : Effectivement, je ne suis pas un grand spécialiste du langage VB, lorsque j’ai commencé à travailler au service informatique, dans les années 80, les programmes s’écrivaient en langage Pascal puis, UNIX ayant remplacé CPM2.2, on a fini par le langage C sans compter les fois où j’ai écrit des programme en langage machine pour les robots et des bases de données comme DBase, Oracle etc. . Mais je ne désespère pas de maitriser VB comme je l’ai fait auparavant avec les autres langages.

Merci à vous deux.

Cordialement.
Gérard
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Une petite remarque d'importance : quand tu écris
Dim a, n, u, t, e, d, L, j, c, s, p, q, b, h, m As Integer
seul m est un entier, les autres sont tous des variants. En effet, contrairement au C (et à toute intuition), le typage en VB ne s'applique qu'à la seule variable précédent le type.
edauzat
Messages postés
6
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
17 janvier 2012

Bonjour,

encore une remarque, concernant la date de Pâques cette fois-ci. L'algorithme cité par J. Meeus fonctionne sans qu'il y ait de corrections à faire. Je pense que l'erreur vient de l'instruction: c = e + L - 17 * h + 114
dans la procédure Rech_Date_Pâques (Module Comput);
il suffit de la remplacer par: c = e + l - 7h + 114 conformément à ce que tu cites en commentaire au début de la procédure.

Cordialement,
Edmond D.
pasquet78
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2008

Bonjour Edmond D.

J’ai analysé le troisième point, qui te donne entièrement raison.
Je me suis aperçu que j’ai pris la mauvaise version du programme saison, celle ou les calculs de la JDE1 de Mars, Juin, Septembre et Décembre dans les tranches d’années à partir de 1000 ou en dessous avait des erreurs avec les signes moins et plus.
Je post donc la bonne version au plus vite.

Voici les bons tests :

If Année < 1000 Then
'Table 26.A Pour les années -1000 à +1000 Y= year/1000
Y = Année / 1000
'Équinoxe de Mars (début du printemps astronomique) :
JDE1_Mars = 1721139.29189 + 365242.1374 * Y + 0.06134 * Y * Y + 0.00111 * Y * Y * Y - 0.00071 * Y * Y * Y * Y
'Solstice de Juin (début de l'été astronomiques) :
JDE1_Juin = 1721233.25401 + 365241.72562 * Y - 0.05323 * Y * Y + 0.00907 * Y * Y * Y + 0.00025 * Y * Y * Y * Y
'Équinoxe de Septembre (début de l'automne astronomique) :
JDE1_Septembre = 1721325.70455 + 365242.49558 * Y - 0.11677 * Y * Y - 0.00297 * Y * Y * Y + 0.00074 * Y * Y * Y * Y
'Solstice de Décembre (début de l'hiver astronomique) :
JDE1_Décembre = 1721414.39987 + 365242.88257 * Y - 0.00769 * Y * Y - 0.00933 * Y * Y * Y - 0.00006 * Y * Y * Y * Y
Else
'Table 26.B Pour les années +1000 to +3000 Y= (year-2000)/1000
Y = (Année - 2000) / 1000
'Équinoxe de Mars (début du printemps astronomique) :
JDE1_Mars = 2451623.80984 + 365242.37404 * Y + 0.05169 * Y * Y - 0.00411 * Y * Y * Y - 0.00057 * Y * Y * Y * Y
'Solstice de Juin (début de l'été astronomiques) :
JDE1_Juin = 2451716.56767 + 365241.62603 * Y + 0.00325 * Y * Y + 0.00888 * Y * Y * Y - 0.0003 * Y * Y * Y * Y
'Équinoxe de Septembre (début de l'automne astronomique) :
JDE1_Septembre = 2451810.21715 + 365242.01767 * Y - 0.11575 * Y * Y + 0.00337 * Y * Y * Y + 0.00078 * Y * Y * Y * Y
'Solstice de Décembre (début de l'hiver astronomique) :
JDE1_Décembre = 2451900.05952 + 365242.74049 * Y - 0.06223 * Y * Y - 0.00823 * Y * Y * Y + 0.00032 * Y * Y * Y * Y
End If

La leçon qui faut en tirer, c’est de ne jamais conserver de mauvaise versions parce que plusieurs années après, on ne se rappelle plus qui est qui, la poubelle est le meilleurs endroit.

Je te remercie encore et m'en excuse pour tous ceux qui ont téléchargé le programme.

Cordialement.
Gérard.
pasquet78
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2008

Bonjour Edmond D.

J’ai pris la peine de revoir mes archives, et je me suis aperçu que tu as raison pour le test :

Année_ = IIf(Mois > 2, c - 4716, c - 4715

Il faut bien le remplacer par

Année_ = IIf(Mois_ > 2, c - 4716, c - 4715

Ceci est l’éternel problème du copier-coller, je l’ai effectivement fait d’un programme qui n’avait pas, comme c’est le cas pour celui là, de variables jour, mois et année déclarées en public.
Je te remercie pour tes remarques et m’en excuse pour tous ceux qui ont téléchargé le programme. Je ferai plus attention dorénavant avec le copier-coller.

Pour le troisième point, j’analyse tes remarques et je te réponds au plus vite.

J’attends la fin de l’analyse du troisième point pour poster la version corrigé du programme.

Cordialement.
Gérard.
edauzat
Messages postés
6
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
17 janvier 2012

Bonjour,

pour le point n°2: j'ai fait le test, ton programme donne pour janvier ou février 2012 des dates de début de saison en 2013. Je pense que le problème vient de la formule de calcul de l'année Année_ = IIf(Mois > 2, c - 4716, c - 4715

pour le point n°3, il y a effectivement des formules différentes selon que l'année est inférieure ou supérieure à 1000, mais elles devraient donner pour la valeur 1000 des valeurs quasi identiques; par exemple, pour JDE1_mars, avec les formules que tu utilises, on obtient 2086381.49103 et 2086381.48281
alors qu'avec les formules disponibles à l'adresse
http://www.hermetic.ch/cal_stud/cassidy/calquest.htm
on obtient 2086381.49103 et 2086381.49103, ce qui semble plus correct.
Cela dit, les différences de signe portent sur des termes qui ont des coefficients très petits et n'affectent pas vraiment les résultats finaux.

Cordialement
pasquet78
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2008

Bonjour Edmond D.

1) Le premier Quartier du 1er janvier 1993 n’apparait pas en effet, ceci n’est pas dû à l’algorithme de J. Meeus, mais tous simplement dans la synchronisation des phases lunaires de l’année.
J’ai voulu faire partir les phases à partir du premier janvier, c’est pour ca que j’ai pris comme point de départ le jour julien du 1er janvier. Mais, j’ai calculé trop juste pour éviter d’arriver au 31 décembre de l’année précédente. A la vue de l’année 1993, je m’aperçois que c’est une erreur et qu’il n’y aurait aucune incidence si le 31 décembre apparaissait.
- Voyons 1993 de plus près :
Le jour julien du 1er janvier 1993 à 0 heure est 2448988,5. La nouvelle lune de janvier 1993 tombe le 22 janvier à 18h27 avec un jour julien de 2449010,26930832. Ce qui me fait un écart de 21,7693083197809. J’avais mis comme paramètre de test la valeur 22,147941639, donc un manque de 0,378633319219023 qui me fait un peut plus de 9h.

La correction à apporter, est tous simplement de soustraire 12 heures, c'est-à-dire 0,5 en JJ, aux 4 tests, à savoir :

7.382647213 devient 6.882647213
14.765294426 devient 14.265294426
22.147941639 devient 21.64794164
29.530588852 devient 29.03058885

2) Année_ = IIf(Mois > 2, c - 4716, c – 4715
Je n’ai pas typé toutes les variables, et c’est une grosse erreur de ma part, ceci est déjà signalé par Warny et je corrige donc cette erreur. Par contre, la variable Mois à été déclarée avec : Public Mois As Integer, et si l’on change le nom de la variable Mois le résultat ne sera pas celui escompté.

3) pour la procédure Saisons, je ne comprends pas bien ta demande. Il y a en effet deux formules de calcul selon que l’année soit inférieure ou supérieure à 1000. Pour ce qui est du détail de la formule, je veux bien poster un programme avec plus de détails.

Pour conclure, je me penche sur tes remarques ainsi que celles de Warny et je corrige donc les variables à déclarer ainsi que les valeurs de tests pour synchroniser les phases lunaires.

Cordialement.

Gérard.
edauzat
Messages postés
6
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
17 janvier 2012

Le commentaire précédedent a été rédigé de mémoire et j'ai fait quelques erreurs.

C'est pour l'année 1993 par exemple que la première phase,PQ le 01/01/1993 n'apparait pas si on sélectionne l'année 1993 (elle apparait en dernier si on sélectionne l'année 1992).

Pour les formules de calculs des équinoxes et solstices, c'est pour l'année 1000 (soit y=1 pour la première série de formules et y=-1 pour la deuxième série) que les résultats devraient être quasi identiques.
Au cours de mes recherches sur internet, j'ai trouvé 3 ensembles de formules qui diffèrent par les valeurs des coefficient des termes en y^2, y^3 et y^4. N'ayant pas l'ouvrage de J. Meeus, je ne sais pas quelles sont les bonnes formules.
edauzat
Messages postés
6
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
17 janvier 2012

Bonjour,

J'ai téléchargé la source et fait quelques essais:
il me semble que pour l'année 2012, la première phase, PQ le 01/01/2012 n'apparait pas (on la trouve en sélectionnant l'année 2011).
D'autre part, dans le module Meeus.bas, procédure CmdJJversDate, il faut remplacer
Année_ = IIf(Mois > 2, c - 4716, c - 4715
par
Année_ = IIf(Mois_ > 2, c - 4716, c - 4715
autrement, on obtient des résultats erronés pour les deux premiers mois de l'année.
Je pense aussi que les variables doivent être typées et que les procédures et variables publiques doivent être évitées dans la mesure du possible.
Enfin, toujours dans le module Meeus.bas, procédure Saisons, il y a probablement des erreurs de signe dans les formules de calcul: elles devraient donner des résultats très proches pour y=1000, ce qui n'est pas le cas.
Après quelques recherches sur internet, j'ai trouvé d'autres formules qui semblent vérifier cette condition à l'adresse suivante:
http://www.hermetic.ch/cal_stud/cassidy/calquest.htm
En espérant que ces quelques remarques pourront vous être utiles.
Cordialement,
Edmond D.
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Salut pasquet, les const existent aussi en .NET (heureusement) et ton code devrait se convertir.
En fait, le vrai avantage des enum, c'est que tu peux déclarer une (dès le vb6) un argument de procédure en ton nom d'enumération. Ensuite, la saisie assistée te propose les valeurs de constantes possibles.
Par exemple :
Enum FeteEnum
JourAn = 1,
FetteTravail = 2,
(...)
End Enum

Puis Ensuite tu déclare ta fonction
Function DateFete(Fete as FeteEnum)
(...)
End Function

Quand tu appeleras DateFete, il te proposera toute les constantes possibles.
Autre remarques qui peut être d'importance, essaye de typer toutes tes variables et tous tes arguments. Sinon, ceux-ci seront considérés par défaut comme des Variant. Le problème des Variant, c'est que leur type doit être vérifié à l'execution et ceci prend beaucoup de temps. De même, affecter une valeur typée à un variant est relativement couteux.
Je te conseille d'utiliser "Option Explicit" systématiquement en début de module. Si tu peux prendre ça comme une contrainte dans un premier temps, ceci permet en réalité trois choses : détecter certains bugs bêtes dès la compilation, améliorer considérablement les performances des programmes, utiliser l'aide à la saisie.

Sinon, ton code n'en reste pas moins extrèmement intérressant, je vais tenter la conversion vers le .NET.
pasquet78
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2008

Bonjour WARNY : J’aurai effectivement pu regrouper les constantes dans un Enum, mais ne connaissant pas le .NET, je ne savais pas qu’il y avait une grande importance.
Par-contre, en VB6, la lecture de l’un comme l’autre est équivalente, seule contrainte je dois donner une valeur à chaque constante. Pour ce qui est du thème, il n’y en a qu’un seul puisque il n’y a qu’une seule variable de 30 éléments : Date_Fête(30).
La lecture de ton commentaire m’a donné envie de me mettre au vb.NET, je vais donc étudier la question au plus vite.
Très cordialement.

Gérard
Sechaud
Messages postés
288
Date d'inscription
jeudi 28 octobre 2004
Statut
Membre
Dernière intervention
3 janvier 2017

Bravo, et merci beaucoup pour ce super programme, avec des explications très détaillées et enrichissantes.
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Je m'était toujours dit que je ferai ce truc un jour sans jamais oser commencer.
Tout est géré, passage du calendrier julien au calendrier grégorien, déclenchement des fêtes à partir d'une année donnée.

Juste pour l'amélioration de la lecture du code et éventuellement faciliter la conversion en .NET, au lieu d'utiliser plein de Const, tu peux regrouper les contantes liées à un même thème dans un Enum.