cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 2007
-
9 mai 2007 à 12:30
poustach
Messages postés4Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention20 novembre 2007
-
20 nov. 2007 à 00:08
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
poustach
Messages postés4Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention20 novembre 2007 20 nov. 2007 à 00:08
hello,
bon... avant de lire plus loin je vous prévien que je suis un noob là dedans.
j'aimerais, à partir de ce code, extraire la date (de début de semaine ou si possible des jours 1 à 7) et de l'utiliser pour filtrer une liste ou un sous formulaire.
donc en gros je voudrais remplir les grandes cases blanches du calendrier avec des données triées en fonction du jour.
en programation de calculatrice casio :) je dirais qu'il faudrai enreristrer le jour, moi et année sous 3 variables, pis de filtrer à partir de ses variables... mais là... pfff je suis perdu.
bon je voie bien que les derniers commentaires datent de mai dernier, mais j'espère que vous preterez malgres tout attention à ma requete. et merci d'avance.
pillsmen
Messages postés27Date d'inscriptionsamedi 27 mai 2006StatutMembreDernière intervention 3 juillet 2007 21 mai 2007 à 09:01
Merci Gérard pour l'infos de Pâques!=Pâque, je ne savais pas!
De même pour l'optimisation de la fonction "Nbjour_mois". Il existe tellement de solutions...
Je me demandais si en terme de timing, cela changeait vraiment quelquechose (admettons le cas d'une boucle for i=0 to 1000000), mais probablement qu'avec l'appel à la fonction "Estbissextile", ma solution est (beaucoup?) plus longue :).
Quoiqu'il en soit merci pour le bout de code !
pasquet78
Messages postés21Date d'inscriptionvendredi 3 janvier 2003StatutMembreDernière intervention19 juin 2008 11 mai 2007 à 22:47
Petite remarque, vu le contenu de ton code, je vois qu'il s'agit de fêtes catholiques alors il faut écrire pâques au pluriel pour ne pas confondre avec la pâque juive qui, elle, est au singulier.
Je n'ai pas encore étudié tout le code mais je vois que la fonction Nbjour() contient beaucoup trop de lignes avec le select case alors qu'il suffit de deux lignes.
Private Function Nbjour_mois(Mois As Integer, An As Integer) As Integer
Nbjour_mois = IIf(Mois > 7, 31 - Mois Mod 2, 30 + Mois Mod 2)
If Mois 2 Then Nbjour_mois 28 + Sgn(IIf((An Mod 100) = 0, _
An Mod 400, An Mod 4)) Xor 1
End Function
Avec ces lignes, plus besoin de la fonction EstBissextile()
Cordialement.
Gérard
pillsmen
Messages postés27Date d'inscriptionsamedi 27 mai 2006StatutMembreDernière intervention 3 juillet 2007 11 mai 2007 à 08:05
Ahh cool je connaisais pas cette syntaxe :), ça peut être bien pratique !
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 10 mai 2007 à 22:53
sous le "option explicit" tu définies le type des variables commençant par une lettre, ou dans un équart de lettres incluses, ce par DEFTYPE
(SOUS option, d'où mon raccourci d'explication)
attention, cette action n'implique pas que les variables, également les propriétés fonctions etc..., à condition que ces dernières ne soient pas typées
Option Explicit
DefInt I-M 'ENTIERS
DefStr S 'CHAINES
Private Sub Form_Load()
Dim i, j, k, l, m 'seront des entiers
Dim n 'sera un variant
Dim sMess, sCool 'seront des chaînes
' type de j ENTIER = 2
MsgBox "J -> " & VarType(j)
' type de l ENTIER = 2
MsgBox "L -> " & VarType(l)
' type de n VARIANT 12, mais variant vide donc EMPTY 0
MsgBox "N -> " & VarType(n)
' type de sCool CHAINE = 8
MsgBox "SCOOL -> " & VarType(sCool)
Unload Me
End Sub
++
pillsmen
Messages postés27Date d'inscriptionsamedi 27 mai 2006StatutMembreDernière intervention 3 juillet 2007 10 mai 2007 à 13:45
@ PCPT
"il re reste la possibilité de le faire par option"
Qu'entends-tu par le faire par option ?
pillsmen
Messages postés27Date d'inscriptionsamedi 27 mai 2006StatutMembreDernière intervention 3 juillet 2007 10 mai 2007 à 11:54
Arf effectivement, je viens de vérifier l'aide de l'instruction Dim...
' Plusieurs déclarations sur une même ligne. AnotherVar
' est de type Variant car son type n'est pas précisé.
Dim AnotherVar, Choice As Boolean, BirthDate As Date
L'habitude de la déclaration des variables en C ..., je modifierais ça , pas de pb :)
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 10 mai 2007 à 11:17
Salut,
Tu dois mettre les Exit Function pour éviter que tous les IF soient lus. Ça accélère légèrement le code...
Ici, tu devrais déclarer chaque variable avec un type. Seuls les derniers items (Pentecote et paque) sont des Integer; le reste est Variant
Dim jour, Mois, Annee, Ascension, Pentecote As Integer
Dim G, C, C_4, E, H, k, P, Q, i, B, J1, J2, paque As Integer
MPi
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 10 mai 2007 à 11:11
que de "variant"...
faudrait commencer par revoir comment faire des déclarations correctement
si tu n'a pas le courage de typer chaque variable, même avec les raccourcis, il re reste la possibilité de le faire par option
pillsmen
Messages postés27Date d'inscriptionsamedi 27 mai 2006StatutMembreDernière intervention 3 juillet 2007 9 mai 2007 à 16:20
De plus, j'ai corrigé un petit bug apparu lors de l'optimisation des fonctions, mais j'ai oublié de changer l'imprim écran de la source où il apparaît clairement (les samedi et dimanche ne sont pas colorés :p)
pillsmen
Messages postés27Date d'inscriptionsamedi 27 mai 2006StatutMembreDernière intervention 3 juillet 2007 9 mai 2007 à 16:15
"En effet, il ne faut pas que tu parcours plusieurs if car des que tu as un true, il faut que tu sortes car tu pourrais retourner false apres donc rien a redire la dessus."
En fait, en vba le retour de fonction se fait par la syntaxe suivante :
Private Function NomFonction (Parametre_fonction As TypeParametre) As TypeRetourFonction
Nomfonction = Variable
End Fonction
Et je suis quasiment sûr qu'à partir du moment où la fonction retourne quelque chose, le code qui suit n'est pas exécuté :).
D'ailleur dans ma version de la fonction IsFerie, les "Exit Function" n'y sont pas ;)
Private Function IsFerie(datetoanalyse As Date) As Boolean
Dim jour, Mois, Annee, Ascension, Pentecote As Integer
Dim G, C, C_4, E, H, k, P, Q, i, B, J1, J2, paque As Integer
jour = Day(datetoanalyse)
Mois = Month(datetoanalyse)
Annee = Year(datetoanalyse)
'Calcul des jours fériés "non fixes" (Lundi de Pâque, Ascension, Pentecôte)
'Lundi de Pâque (Algorithme de Oudin)
G = (Annee Mod 19)
C = Fix(Annee / 100)
C_4 = Fix(C / 4)
E = Fix((8 * C + 13) / 25)
H = Fix((19 * G + C - C_4 - E + 15) Mod 30)
k = Fix(H / 28)
P = Fix(29 / (H + 1))
Q = Fix((21 - G) / 11)
i = ((k * P * Q - 1) * k + H)
B = (Fix(Annee / 4) + Annee)
J1 = (B + i + 2 + C_4 - C)
J2 = (J1 Mod 7)
'Ici on obtient le jour de paque (dimanche), on lui ajoute 1 pour avoir le jour du lundi
paque = 28 + i - J2 + 1
'Ascension
Ascension = paque - 23
'Pentecôte
Pentecote = paque - 12
Select Case Mois
Case 1
'Jour de l'an
If jour 1 Then IsFerie True
Case 3
'Pâque si paque<=31
If paque <= 31 Then
If jour paque Then IsFerie True
End If
Case 4
'Pâque si paque>31
If paque > 31 Then
paque = paque - 31
If jour paque Then IsFerie True
End If
Case 5
'Fête du travail, Victoire, Ascension et Pentecôte
If jour 1 Or jour 8 Or jour = Ascension Or jour = Pentecote Then IsFerie = True
Case 7
'Fête Nationale
If jour 14 Then IsFerie True
Case 8
'Assomption
If jour 15 Then IsFerie True
Case 11
'Toussaint et Armistice
If jour 1 Or jour 11 Then IsFerie = True
Case 12
'Noël
If jour 25 Then IsFerie True
Case Else
IsFerie = False
End Select
End Function
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 9 mai 2007 à 14:22
Je viens de voir qu'il y avait une note de 1, j'espere que c'est pas moi par mégarde (je pense pas) car je ne peux éxecuter donc j'ai pas voulu mettre de note.
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 9 mai 2007 à 14:20
Trop bete, j'ai pas fait attention au exit fonction donc oublie ce que j'ai dis sur les if.
En effet, il ne faut pas que tu parcours plusieurs if car des que tu as un true, il faut que tu sortes car tu pourrais retourner false apres donc rien a redire la dessus.
Quant au fait que mettre true fait sortir de ta fonction, je n'en sais rien mais ca m'etonnerait (a voir donc).
Le seul truc, c'est que tu pourrais en regrouper certains pour gagner du temps d'exe mais la lecture serait mais sympa, à toi de voir donc.
Malheureusement, je peux pas executer ton code, donc je n'aurais pas d'autres remarques à te faire à part que je trouve ton code bien commenté.
A+
pillsmen
Messages postés27Date d'inscriptionsamedi 27 mai 2006StatutMembreDernière intervention 3 juillet 2007 9 mai 2007 à 13:21
Pour le select c'est pas faux :p
j'y avais pas pensé bien que je connais la syntaxe :p.
Pour la fonction IsFerie (je rapelle qu'elle n'est pas de moi, je ne l'ai pas modifiée),
If JJ 1 And MM 1 Then IsFerie = True: Exit Function '1 Janvier
If JJ 1 And MM 5 Then IsFerie = True: Exit Function '1 Mai
If JJ 8 And MM 5 Then IsFerie = True: Exit Function '8 Mai
If JJ 14 And MM 7 Then IsFerie = True: Exit Function '14 Juillet If JJ = 15 And MM = 8 Then IsFerie = True: Exit Function '15 Août
If JJ 1 And MM 11 Then IsFerie = True: Exit Function '1 Novembre
If JJ 11 And MM 11 Then IsFerie = True: Exit Function '11 Novembre
If JJ 25 And MM 12 Then IsFerie = True: Exit Function '25 Décembre
Les 'IsFerie = True: Exit Function' font sortir de la fonction, par conséquent la suite du code n'est pas lu.
Je me demande par contre si le ':Exit Function' est vraiment utile puisque le 'IsFerie = True' devrait interrompre la fonction ?!
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 9 mai 2007 à 12:30
Salut, c'est pas grand chose (je suis pas spécialiste d'optimisation de code) mais par contre je pense que tu peux simplifier ton Select Case de Function Nbjour_mois.
Il me semble qu'il existe une synthaxe du genre
Case 1,3,5,7,8,10,12
Nbjour_mois = 31
Et aussi pour la fonction IsFerie:
Il y a des if qui pourrait etre des elsif car sinon tu fais tout les if à moi que je n'ai pas bien saisi le sequencement du code:
If JJ 1 And (MM 1 or MM = 5) Then IsFerie = True: Exit Function '1 Janvier et 1 Mai
elseIf JJ 8 And MM 5 Then IsFerie = True: Exit Function '8 Mai
20 nov. 2007 à 00:08
bon... avant de lire plus loin je vous prévien que je suis un noob là dedans.
j'aimerais, à partir de ce code, extraire la date (de début de semaine ou si possible des jours 1 à 7) et de l'utiliser pour filtrer une liste ou un sous formulaire.
donc en gros je voudrais remplir les grandes cases blanches du calendrier avec des données triées en fonction du jour.
en programation de calculatrice casio :) je dirais qu'il faudrai enreristrer le jour, moi et année sous 3 variables, pis de filtrer à partir de ses variables... mais là... pfff je suis perdu.
bon je voie bien que les derniers commentaires datent de mai dernier, mais j'espère que vous preterez malgres tout attention à ma requete. et merci d'avance.
21 mai 2007 à 09:01
De même pour l'optimisation de la fonction "Nbjour_mois". Il existe tellement de solutions...
Je me demandais si en terme de timing, cela changeait vraiment quelquechose (admettons le cas d'une boucle for i=0 to 1000000), mais probablement qu'avec l'appel à la fonction "Estbissextile", ma solution est (beaucoup?) plus longue :).
Quoiqu'il en soit merci pour le bout de code !
11 mai 2007 à 22:47
Je n'ai pas encore étudié tout le code mais je vois que la fonction Nbjour() contient beaucoup trop de lignes avec le select case alors qu'il suffit de deux lignes.
Private Function Nbjour_mois(Mois As Integer, An As Integer) As Integer
Nbjour_mois = IIf(Mois > 7, 31 - Mois Mod 2, 30 + Mois Mod 2)
If Mois 2 Then Nbjour_mois 28 + Sgn(IIf((An Mod 100) = 0, _
An Mod 400, An Mod 4)) Xor 1
End Function
Avec ces lignes, plus besoin de la fonction EstBissextile()
Cordialement.
Gérard
11 mai 2007 à 08:05
10 mai 2007 à 22:53
(SOUS option, d'où mon raccourci d'explication)
attention, cette action n'implique pas que les variables, également les propriétés fonctions etc..., à condition que ces dernières ne soient pas typées
Option Explicit
DefInt I-M 'ENTIERS
DefStr S 'CHAINES
Private Sub Form_Load()
Dim i, j, k, l, m 'seront des entiers
Dim n 'sera un variant
Dim sMess, sCool 'seront des chaînes
' type de j ENTIER = 2
MsgBox "J -> " & VarType(j)
' type de l ENTIER = 2
MsgBox "L -> " & VarType(l)
' type de n VARIANT 12, mais variant vide donc EMPTY 0
MsgBox "N -> " & VarType(n)
' type de sCool CHAINE = 8
MsgBox "SCOOL -> " & VarType(sCool)
Unload Me
End Sub
++
10 mai 2007 à 13:45
"il re reste la possibilité de le faire par option"
Qu'entends-tu par le faire par option ?
10 mai 2007 à 11:54
' Plusieurs déclarations sur une même ligne. AnotherVar
' est de type Variant car son type n'est pas précisé.
Dim AnotherVar, Choice As Boolean, BirthDate As Date
L'habitude de la déclaration des variables en C ..., je modifierais ça , pas de pb :)
10 mai 2007 à 11:17
Tu dois mettre les Exit Function pour éviter que tous les IF soient lus. Ça accélère légèrement le code...
Ici, tu devrais déclarer chaque variable avec un type. Seuls les derniers items (Pentecote et paque) sont des Integer; le reste est Variant
Dim jour, Mois, Annee, Ascension, Pentecote As Integer
Dim G, C, C_4, E, H, k, P, Q, i, B, J1, J2, paque As Integer
MPi
10 mai 2007 à 11:11
faudrait commencer par revoir comment faire des déclarations correctement
si tu n'a pas le courage de typer chaque variable, même avec les raccourcis, il re reste la possibilité de le faire par option
9 mai 2007 à 16:20
http://www.vbfrance.com/codes/CALENDRIER-MOIS-VBA-ACCESS_42460.aspx
De plus, j'ai corrigé un petit bug apparu lors de l'optimisation des fonctions, mais j'ai oublié de changer l'imprim écran de la source où il apparaît clairement (les samedi et dimanche ne sont pas colorés :p)
9 mai 2007 à 16:15
En fait, en vba le retour de fonction se fait par la syntaxe suivante :
Private Function NomFonction (Parametre_fonction As TypeParametre) As TypeRetourFonction
Nomfonction = Variable
End Fonction
Et je suis quasiment sûr qu'à partir du moment où la fonction retourne quelque chose, le code qui suit n'est pas exécuté :).
D'ailleur dans ma version de la fonction IsFerie, les "Exit Function" n'y sont pas ;)
9 mai 2007 à 14:22
9 mai 2007 à 14:20
En effet, il ne faut pas que tu parcours plusieurs if car des que tu as un true, il faut que tu sortes car tu pourrais retourner false apres donc rien a redire la dessus.
Quant au fait que mettre true fait sortir de ta fonction, je n'en sais rien mais ca m'etonnerait (a voir donc).
Le seul truc, c'est que tu pourrais en regrouper certains pour gagner du temps d'exe mais la lecture serait mais sympa, à toi de voir donc.
Malheureusement, je peux pas executer ton code, donc je n'aurais pas d'autres remarques à te faire à part que je trouve ton code bien commenté.
A+
9 mai 2007 à 13:21
j'y avais pas pensé bien que je connais la syntaxe :p.
Pour la fonction IsFerie (je rapelle qu'elle n'est pas de moi, je ne l'ai pas modifiée),
Les 'IsFerie = True: Exit Function' font sortir de la fonction, par conséquent la suite du code n'est pas lu.
Je me demande par contre si le ':Exit Function' est vraiment utile puisque le 'IsFerie = True' devrait interrompre la fonction ?!
9 mai 2007 à 12:30
Il me semble qu'il existe une synthaxe du genre
Case 1,3,5,7,8,10,12
Nbjour_mois = 31
Et aussi pour la fonction IsFerie:
Il y a des if qui pourrait etre des elsif car sinon tu fais tout les if à moi que je n'ai pas bien saisi le sequencement du code:
If JJ 1 And (MM 1 or MM = 5) Then IsFerie = True: Exit Function '1 Janvier et 1 Mai
elseIf JJ 8 And MM 5 Then IsFerie = True: Exit Function '8 Mai
Donc c'est des petites remarques, c'est tout.