CALENDRIER PAR SEMAINE VBA ACCESS

cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 - 9 mai 2007 à 12:30
poustach Messages postés 4 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 20 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.

https://codes-sources.commentcamarche.net/source/42640-calendrier-par-semaine-vba-access

poustach Messages postés 4 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 20 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és 27 Date d'inscription samedi 27 mai 2006 Statut Membre Derniè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és 21 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 19 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és 27 Date d'inscription samedi 27 mai 2006 Statut Membre Derniè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és 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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és 27 Date d'inscription samedi 27 mai 2006 Statut Membre Derniè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és 27 Date d'inscription samedi 27 mai 2006 Statut Membre Derniè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és 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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és 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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és 27 Date d'inscription samedi 27 mai 2006 Statut Membre Dernière intervention 3 juillet 2007
9 mai 2007 à 16:20
J'avais oublié de dire qu'une version "par mois" du calendrier est dispo ici (seule l'affichage change, certaines fonctions sont juste adaptées mais elles restent les mêmes):
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)
pillsmen Messages postés 27 Date d'inscription samedi 27 mai 2006 Statut Membre Derniè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és 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
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és 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
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és 27 Date d'inscription samedi 27 mai 2006 Statut Membre Derniè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és 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
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

Donc c'est des petites remarques, c'est tout.
Rejoignez-nous