CALENDRIER, MODE D'EMPLOI

cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015 - 13 déc. 2011 à 09:53
mdry Messages postés 33 Date d'inscription dimanche 25 juillet 2004 Statut Membre Dernière intervention 5 mai 2013 - 7 févr. 2013 à 04:42
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
7 févr. 2013 à 04:42
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
3 févr. 2013 à 11:20
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
3 févr. 2013 à 04:37
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
2 févr. 2013 à 21:42
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
26 janv. 2013 à 11:12
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
18 janv. 2012 à 22:19
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 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
18 janv. 2012 à 09:44
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
17 janv. 2012 à 13:29
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
17 janv. 2012 à 12:16
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
12 janv. 2012 à 12:52
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
11 janv. 2012 à 09:07
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
11 janv. 2012 à 00:39
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
10 janv. 2012 à 07:57
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
9 janv. 2012 à 15:52
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 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
14 déc. 2011 à 08:46
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
13 déc. 2011 à 23:40
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
13 déc. 2011 à 15:19
Bravo, et merci beaucoup pour ce super programme, avec des explications très détaillées et enrichissantes.
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
13 déc. 2011 à 09:53
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.
Rejoignez-nous