begin process at 2008 07 04 00:53:14
1 204 456 membres
3 nouveaux aujourd'hui
14 114 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CALENDRIER PAR SEMAINE VBA ACCESS


Information sur la source

Catégorie :Date & Heure Classé sous : calendrier, semaine, vba, access, férié Niveau : Initié Date de création : 09/05/2007 Date de mise à jour : 09/07/2007 09:47:09 Vu / téléchargé: 24 214 / 1 312

Note :
6 / 10 - par 3 personnes
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Calendrier par semaine entièrement géré par vba.
Il reprend les fonctionnalités du calendrier par mois que j'ai codé (source : http://www.vbfrance.com/code.aspx?ID=42460) à savoir :

Celui-ci reprend l'aspect du contrôle Calendrier xx.x intégré à Microsoft Access :

- Trois zones de liste déroulante permettent de sélectionner le jour, le mois et l'année désirés

- Le calendrier dispose de 7 cases qui comprennent les jours de la semaine du jour sélectionné ainsi que les premiers jours  du mois précédent ou les derniers jours du mois suivant

- Coloration des jours fériés (fixes et mobiles) ainsi que les WE

- Affichage du numéro de la semaine en cours

- La couleur du texte utilisée pour les jours du mois en cours est différente de celle utilisée pour les mois précédent et suivant afin de faire la différence.

- Effet "enfoncé" lors de la sélection d'un jour

- Fonction qui retourne la date sélectionnée

- Les années bissextiles sont prises en compte

- Etc...

A la différence du contrôle calendrier, ce calendrier (entièrement géré en vba) permet de colorer les jours, d'y insérer du texte etc... (les jours sont modélisés par des Etiquettes)

Il est initialisés à la date du jour.

Le code est bien commenté permettant une facile compréhension et facilitant les modifications !!!

Source

  • Option Compare Database
  • Option Explicit
  • 'Sauvegarde de l'élément en cour de selection
  • Public elem_selected As Object
  • 'Sauvegarde de la couleur de fond de l'élément avant sa sélection
  • Public text_color_old As Long
  • 'Couleur de sélection par défaut
  • Const SelectColor = 12632256
  • 'Couleur des jours non ouvrés (WE + fériés) par défaut
  • Const NotWorkedColor = 15987699
  • 'Couleur "normale"
  • Const NormalColor = 16777215
  • Private Sub Form_Load()
  • Dim i As Integer
  • 'On récupère l'argument de l'ouverture du calendrier s'il y en a un et on sélectionne les bonnes valeurs de jour, mois, année.
  • 'S'il n'y a pas d'argument, on initialise le calendrier à la date du jour
  • Dim Jour_init As Date
  • If Not IsNull(Me.OpenArgs) Then Jour_init = Me.OpenArgs Else Jour_init = Date
  • 'Initialisation des listes déroulantes du mois et de l'année
  • Me.Liste_Mois.RowSource = "1;Janvier;2;Février;3;Mars;4;Avril;5;Mai;6;Juin;7;Juillet;8;Août;9;Septembre;10;Octobre;11;Novembre;12;Décembre"
  • Me.Liste_Annee.RowSource = ""
  • For i = 1900 To CInt(Year(Date)) + 100
  • Me.Liste_Annee.AddItem (CStr(i))
  • Next
  • 'Selection du mois et de l'année en cours
  • Liste_Mois = Liste_Mois.ItemData(CInt(Month(Jour_init)) - 1)
  • Liste_Annee = Liste_Annee.ItemData(CInt(Year(Jour_init)) - 1900)
  • 'Initialisation de la liste déroulante des jours
  • Me.Liste_Jour.RowSource = ""
  • For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
  • Me.Liste_Jour.AddItem (i)
  • Next
  • 'Selection du jour en cours
  • Liste_Jour = Liste_Jour.ItemData(CInt(Day(Jour_init)) - 1)
  • 'On met le titre du mois et de l'année à jour ainsi que le numéro de la semaine
  • Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
  • Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
  • 'On calcule le numéro de la case du jour en cours
  • i = (Weekday(Jour_init) - 1)
  • If i = 0 Then i = 7
  • 'On initialise la variable d'élément selectionné au bouton du jour
  • Set elem_selected = NumObject(i)
  • 'On initialise le calcul des jours (jours associés à la date)
  • CalculJours
  • End Sub
  • Private Sub Liste_Annee_AfterUpdate()
  • 'On réactualise le titre (mois + année)
  • Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
  • Dim Num As Integer, i As Integer
  • Num = Me.Liste_Jour.OldValue
  • 'On réactualise la liste des jours (pour les années bissextiles !)
  • Me.Liste_Jour.RowSource = ""
  • For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
  • Me.Liste_Jour.AddItem (i)
  • Next
  • 'Si le mois qui été selectionné précédemment possède plus de jour que le mois que l'on vient de choisir, on prend le dernier jour de ce dernier
  • '(exemple :date sélectionnée = '31/03/07', mois que l'on va sélectionner = 'xx/02/07', on aura '28/02/07'
  • If Me.Liste_Jour.ItemData(Num - 1) > Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) Then Me.Liste_Jour = Me.Liste_Jour.ItemData(Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) - 1) Else Me.Liste_Jour = Me.Liste_Jour.ItemData(Num - 1)
  • 'On réactualise le numéro de semaine
  • Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
  • 'On réinitialise le calcul des jours (jours associés à la date)
  • CalculJours
  • End Sub
  • Private Sub Liste_Mois_Change()
  • 'On réactualise le titre (mois + année)
  • Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
  • Dim Num As Integer, i As Integer
  • Num = Me.Liste_Jour.OldValue
  • 'On réactualise la liste des jours
  • Me.Liste_Jour.RowSource = ""
  • For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
  • Me.Liste_Jour.AddItem (i)
  • Next
  • 'Si le mois qui été selectionné précédemment possède plus de jour que le mois que l'on vient de choisir, on prend le dernier jour de ce dernier
  • '(exemple :date sélectionnée = '31/03/07', mois que l'on va sélectionner = 'xx/02/07', on aura '28/02/07'
  • If Me.Liste_Jour > Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) Then
  • Me.Liste_Jour = Me.Liste_Jour.ItemData(Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) - 1)
  • Else
  • Me.Liste_Jour = Num
  • End If
  • 'On réactualise le numéro de semaine
  • Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
  • 'On réinitialise le calcul des jours (jours associés à la date)
  • CalculJours
  • End Sub
  • Private Sub Liste_jour_Change()
  • 'On réactualise le numéro de semaine
  • Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
  • 'On réinitialise le calcul des jours (jours associés à la date)
  • CalculJours
  • End Sub
  • Private Sub Previous_Click()
  • Dim date_prec As Date
  • date_prec = DateAdd("ww", -1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
  • 'On sélectionne la semaine qui précède la semaine en cours
  • Liste_Annee = Liste_Annee.ItemData(CInt(Year(date_prec)) - 1900)
  • Liste_Mois = Liste_Mois.ItemData(CInt(Month(date_prec)) - 1)
  • Dim Num As Integer, i As Integer
  • Num = Me.Liste_Jour.OldValue
  • 'On réactualise la liste des jours
  • Me.Liste_Jour.RowSource = ""
  • For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
  • Me.Liste_Jour.AddItem (i)
  • Next
  • Me.Liste_Jour = Liste_Jour.ItemData(CInt(Day(date_prec)) - 1)
  • 'On réactualise le titre (mois + année)
  • Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
  • 'On réactualise le numéro de semaine
  • Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
  • 'On réinitialise le calcul des jours (jours associés à la date)
  • CalculJours
  • End Sub
  • Private Sub Next_Click()
  • Dim date_prec As Date
  • date_prec = DateAdd("ww", 1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
  • 'On sélectionne la semaine qui précède la semaine en cours
  • Liste_Annee = Liste_Annee.ItemData(CInt(Year(date_prec)) - 1900)
  • Liste_Mois = Liste_Mois.ItemData(CInt(Month(date_prec)) - 1)
  • Dim Num As Integer, i As Integer
  • Num = Me.Liste_Jour.OldValue
  • 'On réactualise la liste des jours
  • Me.Liste_Jour.RowSource = ""
  • For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
  • Me.Liste_Jour.AddItem (i)
  • Next
  • Me.Liste_Jour = Liste_Jour.ItemData(CInt(Day(date_prec)) - 1)
  • 'On réactualise le titre (mois + année)
  • Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
  • 'On réactualise le numéro de semaine
  • Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
  • 'On réinitialise le calcul des jours (jours associés à la date)
  • CalculJours
  • End Sub
  • 'Procédure évènementielle de chaque case du calendrier
  • 'Lorsque l'on clique, on rend la couleur et l'aspect d'origine à la case qui était selectionnée avant
  • 'et on donne l'aspect "appuyé" et la couleur de fond à la case "en cour"
  • Private Sub J1_Click()
  • If Me.J1.SpecialEffect = 0 Then
  • SelectDay (1)
  • End If
  • End Sub
  • Private Sub J2_Click()
  • If Me.J2.SpecialEffect = 0 Then
  • SelectDay (2)
  • End If
  • End Sub
  • Private Sub J3_Click()
  • If Me.J3.SpecialEffect = 0 Then
  • SelectDay (3)
  • End If
  • End Sub
  • Private Sub J4_Click()
  • If Me.J4.SpecialEffect = 0 Then
  • SelectDay (4)
  • End If
  • End Sub
  • Private Sub J5_Click()
  • If Me.J5.SpecialEffect = 0 Then
  • SelectDay (5)
  • End If
  • End Sub
  • Private Sub J6_Click()
  • If Me.J6.SpecialEffect = 0 Then
  • SelectDay (6)
  • End If
  • End Sub
  • Private Sub J7_Click()
  • If Me.J7.SpecialEffect = 0 Then
  • SelectDay (7)
  • End If
  • End Sub
  • 'Cette fonction permet le calcul des dates par jour, une fois le premier jour du mois ainsi que "sa case" ait été détectés,
  • 'on remplit les premières cases avec les numéros des jours du mois précédent, puis on continue avec les cases du mois en cours
  • 'pour finir avec les jours du mois suivant
  • Private Function CalculJours()
  • Dim i As Integer
  • Dim DateDebutSemaine As Date
  • Dim k As Integer
  • 'On calcule le numéro du premier jour de la semaine selon la date selectionnée grâce aux listes
  • DateDebutSemaine = DateAdd("d", -IIf(Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1 = 0, 7, Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1) + 1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
  • 'Pour chaque jours de la semaine
  • For i = 0 To 6
  • 'On affecte à la case en cours le numéro de son jour
  • NumObject(i + 1).Caption = Day(DateAdd("d", i, DateDebutSemaine))
  • 'Et on colore la police des cases du mois en cours différemment des cases du mois précédent et suivant
  • If CInt(Month(DateAdd("d", i, DateDebutSemaine))) <> Liste_Mois Then
  • NumObject(i + 1).ForeColor = 8421504
  • Else
  • NumObject(i + 1).ForeColor = 10485760
  • End If
  • 'On colore l'arrière plan des cases qui sont des samedi, dimanche, ou des jours fériés
  • If (i = 5) Or (i = 6) Or IsFerie(DateAdd("d", i, DateDebutSemaine)) Then
  • NumObject(i + 1).BackColor = NotWorkedColor
  • Else
  • NumObject(i + 1).BackColor = NormalColor
  • End If
  • Next
  • 'Dans le cas d'une case "WE" ou fériée, on sauvegarde la bonne couleur
  • If ((CInt(elem_selected.Caption) = 6) Or (CInt(elem_selected.Caption) = 7)) Then
  • text_color_old = NotWorkedColor
  • Else
  • text_color_old = elem_selected.BackColor
  • End If
  • 'On donne au bouton selectionné les attributs de la selection (couleur, aspect, etc...)
  • elem_selected.BackColor = SelectColor
  • End Function
  • Public Function SelectDay(num_case As Integer)
  • DeSelectPreviousDay
  • 'Sauvegarde de la couleur de la case
  • text_color_old = NumObject(num_case).BackColor
  • NumObject(num_case).BackColor = SelectColor
  • NumObject(num_case).SpecialEffect = 2
  • 'Mise à jour de la variable case en cour de sélection
  • Set elem_selected = NumObject(num_case)
  • MsgBox ReturnDate
  • End Function
  • Private Function DeSelectPreviousDay()
  • elem_selected.SpecialEffect = 0
  • elem_selected.BackColor = text_color_old
  • Set elem_selected = Nothing
  • End Function
  • 'Cette fonction permet de contourner l'interdiction d'avoir une variable tableau public
  • 'Elle retourne un objet qui désigne une case du calendrier en fonction de sa position (facilement calculable)
  • Private Function NumObject(j As Integer) As Object
  • Dim Bouton_Jour(42) As Object
  • 'On initialise le tableau d'objets
  • Set Bouton_Jour(1) = Me.J1
  • Set Bouton_Jour(2) = Me.J2
  • Set Bouton_Jour(3) = Me.J3
  • Set Bouton_Jour(4) = Me.J4
  • Set Bouton_Jour(5) = Me.J5
  • Set Bouton_Jour(6) = Me.J6
  • Set Bouton_Jour(7) = Me.J7
  • 'On retourne l'objet correspondant au paramètre
  • Set NumObject = Bouton_Jour(j)
  • End Function
  • 'Fonction inverse
  • Private Function ObjectNum(Bouton_Jour As Object) As Integer
  • 'On initialise le tableau d'objets
  • With Bouton_Jour
  • Select Case Bouton_Jour.Name
  • Case "J1"
  • ObjectNum = 1
  • Case "J2"
  • ObjectNum = 2
  • Case "J3"
  • ObjectNum = 3
  • Case "J4"
  • ObjectNum = 4
  • Case "J5"
  • ObjectNum = 5
  • Case "J6"
  • ObjectNum = 6
  • Case "J7"
  • ObjectNum = 7
  • End Select
  • End With
  • End Function
  • 'Fonction qui retourne la date de la case sélectionnée sous le format jj/mm/aaaa
  • Private Function ReturnDate() As Date
  • Dim DateDebutSemaine As Date
  • Dim i As Integer
  • 'On calcule le numéro du premier jour de la semaine selon la date selectionnée grâce aux listes
  • DateDebutSemaine = DateAdd("d", -IIf(Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1 = 0, 7, Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1) + 1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
  • 'On récupère le numéro de la case
  • i = ObjectNum(elem_selected)
  • 'On calcule la date de la case selectionnée et on la renvoie
  • ReturnDate = DateAdd("d", i - 1, DateDebutSemaine)
  • End Function
  • 'Fonction trouvée sur www.codes-sources.fr/www.vbfrance.com
  • 'http://www.vbfrance.com/code.aspx?ID=1251
  • Private Function IsFerie(Date_testee As Date) As Boolean
  • Dim JJ As Integer, AA As Integer, MM As Integer
  • Dim NbOr As Integer, Epacte As Integer
  • Dim PLune As Date, Paques As Date, Ascension As Date, Pentecote As Date
  • JJ = Day(Date_testee)
  • MM = Month(Date_testee)
  • AA = Year(Date_testee)
  • 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
  • NbOr = (AA Mod 19) + 1
  • Epacte = (11 * NbOr - (3 + Int((2 + Int(AA / 100)) * 3 / 7))) Mod 30
  • PLune = DateSerial(AA, 4, 19) - ((Epacte + 6) Mod 30)
  • If Epacte = 24 Then PLune = PLune - 1
  • If Epacte = 25 And (AA >= 1900 And AA < 2000) Then PLune = PLune - 1
  • Paques = PLune - Weekday(PLune) + vbMonday + 7 'Paques
  • If JJ = Day(Paques) And MM = Month(Paques) Then IsFerie = True: Exit Function
  • Ascension = Paques + 38 'Ascension
  • If JJ = Day(Ascension) And MM = Month(Ascension) Then IsFerie = True: Exit Function
  • Pentecote = Ascension + 11 'Pentecote
  • If JJ = Day(Pentecote) And MM = Month(Pentecote) Then IsFerie = True: Exit Function
  • IsFerie = False
  • End Function
  • 'Fonction qui retourne le numéro de la semaine selon une date donnée
  • Private Function NumeroSemaine(date_jour As Date) As Integer
  • 'Algorithme adapté à vb trouvé sur http://www.univ-lemans.fr/~hainry/articles/semaine.html
  • Dim i As Integer, j As Integer, N As Integer, S As Integer, A As Integer
  • N = 0
  • For i = 1 To CInt(Month(date_jour)) - 1
  • N = N + Nbjour_mois(i, CInt(Year(date_jour)))
  • Next
  • N = N + CInt(Day(date_jour))
  • S = Fix(CInt(Year(date_jour)) / 100)
  • A = CInt(Year(date_jour)) - S
  • If Nbjour_mois(2, Year(date_jour)) <= 28 Then j = (5 * S + S / 4 + A + A / 4) Mod 7 Else j = (5 * S + S / 4 + A + A / 4 + 6) Mod 7
  • NumeroSemaine = (j + N + 5) / 7 - (j / 5)
  • End Function
  • 'Fonction qui retourne le nombre de jour par mois (années bissextiles prises en compte)
  • Private Function Nbjour_mois(Mois As Integer, Annee 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((Annee Mod 100) = 0, Annee Mod 400, Annee Mod 4)) Xor 1
  • End If
  • End Function
Option Compare Database
Option Explicit
'Sauvegarde de l'élément en cour de selection
Public elem_selected As Object
'Sauvegarde de la couleur de fond de l'élément avant sa sélection
Public text_color_old As Long
'Couleur de sélection par défaut
Const SelectColor = 12632256
'Couleur des jours non ouvrés (WE + fériés) par défaut
Const NotWorkedColor = 15987699
'Couleur "normale"
Const NormalColor = 16777215

Private Sub Form_Load()
    Dim i As Integer
    
    'On récupère l'argument de l'ouverture du calendrier s'il y en a un et on sélectionne les bonnes valeurs de jour, mois, année.
    'S'il n'y a pas d'argument, on initialise le calendrier à la date du jour
    Dim Jour_init As Date
    If Not IsNull(Me.OpenArgs) Then Jour_init = Me.OpenArgs Else Jour_init = Date
    
    'Initialisation des listes déroulantes du mois et de l'année
    Me.Liste_Mois.RowSource = "1;Janvier;2;Février;3;Mars;4;Avril;5;Mai;6;Juin;7;Juillet;8;Août;9;Septembre;10;Octobre;11;Novembre;12;Décembre"
    Me.Liste_Annee.RowSource = ""
    For i = 1900 To CInt(Year(Date)) + 100
        Me.Liste_Annee.AddItem (CStr(i))
    Next
    
    'Selection du mois et de l'année en cours
    Liste_Mois = Liste_Mois.ItemData(CInt(Month(Jour_init)) - 1)
    Liste_Annee = Liste_Annee.ItemData(CInt(Year(Jour_init)) - 1900)
    
    'Initialisation de la liste déroulante des jours
    Me.Liste_Jour.RowSource = ""
    For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
        Me.Liste_Jour.AddItem (i)
    Next
        
    'Selection du jour en cours
    Liste_Jour = Liste_Jour.ItemData(CInt(Day(Jour_init)) - 1)
        
    'On met le titre du mois et de l'année à jour ainsi que le numéro de la semaine
    Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
    Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
    
        
    'On calcule le numéro de la case du jour en cours
    i = (Weekday(Jour_init) - 1)
    If i = 0 Then i = 7

    'On initialise la variable d'élément selectionné au bouton du jour
    Set elem_selected = NumObject(i)

    'On initialise le calcul des jours (jours associés à la date)
    CalculJours
    
End Sub

Private Sub Liste_Annee_AfterUpdate()
    'On réactualise le titre (mois + année)
    Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
    
    Dim Num As Integer, i As Integer
    Num = Me.Liste_Jour.OldValue
    'On réactualise la liste des jours (pour les années bissextiles !)
    Me.Liste_Jour.RowSource = ""
    For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
        Me.Liste_Jour.AddItem (i)
    Next
    'Si le mois qui été selectionné précédemment possède plus de jour que le mois que l'on vient de choisir, on prend le dernier jour de ce dernier
    '(exemple :date sélectionnée = '31/03/07', mois que l'on va sélectionner = 'xx/02/07', on aura '28/02/07'
    If Me.Liste_Jour.ItemData(Num - 1) > Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) Then Me.Liste_Jour = Me.Liste_Jour.ItemData(Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) - 1) Else Me.Liste_Jour = Me.Liste_Jour.ItemData(Num - 1)
    
    'On réactualise le numéro de semaine
    Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
    'On réinitialise le calcul des jours (jours associés à la date)
    CalculJours
    
End Sub

Private Sub Liste_Mois_Change()
    'On réactualise le titre (mois + année)
    Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee

    Dim Num As Integer, i As Integer
    Num = Me.Liste_Jour.OldValue
    'On réactualise la liste des jours
    Me.Liste_Jour.RowSource = ""
    For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
        Me.Liste_Jour.AddItem (i)
    Next
    'Si le mois qui été selectionné précédemment possède plus de jour que le mois que l'on vient de choisir, on prend le dernier jour de ce dernier
    '(exemple :date sélectionnée = '31/03/07', mois que l'on va sélectionner = 'xx/02/07', on aura '28/02/07'
    If Me.Liste_Jour > Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) Then
        Me.Liste_Jour = Me.Liste_Jour.ItemData(Nbjour_mois(Me.Liste_Mois, Me.Liste_Annee) - 1)
    Else
        Me.Liste_Jour = Num
    End If
    'On réactualise le numéro de semaine
    Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
    
    'On réinitialise le calcul des jours (jours associés à la date)
    CalculJours
End Sub

Private Sub Liste_jour_Change()
    'On réactualise le numéro de semaine
    Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
    
    'On réinitialise le calcul des jours (jours associés à la date)
    CalculJours
End Sub

Private Sub Previous_Click()
    Dim date_prec As Date
    date_prec = DateAdd("ww", -1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
    
    'On sélectionne la semaine qui précède la semaine en cours
    Liste_Annee = Liste_Annee.ItemData(CInt(Year(date_prec)) - 1900)
    Liste_Mois = Liste_Mois.ItemData(CInt(Month(date_prec)) - 1)
    Dim Num As Integer, i As Integer
    Num = Me.Liste_Jour.OldValue
    'On réactualise la liste des jours
    Me.Liste_Jour.RowSource = ""
    For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
        Me.Liste_Jour.AddItem (i)
    Next
    Me.Liste_Jour = Liste_Jour.ItemData(CInt(Day(date_prec)) - 1)
    'On réactualise le titre (mois + année)
    Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
    'On réactualise le numéro de semaine
    Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
    
    'On réinitialise le calcul des jours (jours associés à la date)
    CalculJours
    
End Sub

Private Sub Next_Click()
    Dim date_prec As Date
    date_prec = DateAdd("ww", 1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
    
    'On sélectionne la semaine qui précède la semaine en cours
    Liste_Annee = Liste_Annee.ItemData(CInt(Year(date_prec)) - 1900)
    Liste_Mois = Liste_Mois.ItemData(CInt(Month(date_prec)) - 1)
    Dim Num As Integer, i As Integer
    Num = Me.Liste_Jour.OldValue
    'On réactualise la liste des jours
    Me.Liste_Jour.RowSource = ""
    For i = 1 To Nbjour_mois(Liste_Mois, Liste_Annee)
        Me.Liste_Jour.AddItem (i)
    Next
    Me.Liste_Jour = Liste_Jour.ItemData(CInt(Day(date_prec)) - 1)
    'On réactualise le titre (mois + année)
    Me.MonthYear.Caption = Me.Liste_Mois.Column(1) & " " & Me.Liste_Annee
    'On réactualise le numéro de semaine
    Me.WeekNum.Caption = "Semaine " & DatePart("ww", DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour), vbMonday, vbFirstFourDays)
    
    
    'On réinitialise le calcul des jours (jours associés à la date)
    CalculJours
    
End Sub

'Procédure évènementielle de chaque case du calendrier
'Lorsque l'on clique, on rend la couleur et l'aspect d'origine à la case qui était selectionnée avant
'et on donne l'aspect "appuyé" et la couleur de fond à la case "en cour"

Private Sub J1_Click()
    If Me.J1.SpecialEffect = 0 Then
        SelectDay (1)
    End If
End Sub
Private Sub J2_Click()
    If Me.J2.SpecialEffect = 0 Then
        SelectDay (2)
    End If
End Sub
Private Sub J3_Click()
    If Me.J3.SpecialEffect = 0 Then
        SelectDay (3)
    End If
End Sub
Private Sub J4_Click()
    If Me.J4.SpecialEffect = 0 Then
        SelectDay (4)
    End If
End Sub
Private Sub J5_Click()
    If Me.J5.SpecialEffect = 0 Then
        SelectDay (5)
    End If
End Sub
Private Sub J6_Click()
    If Me.J6.SpecialEffect = 0 Then
        SelectDay (6)
    End If
End Sub
Private Sub J7_Click()
    If Me.J7.SpecialEffect = 0 Then
        SelectDay (7)
    End If
End Sub
'Cette fonction permet le calcul des dates par jour, une fois le premier jour du mois ainsi que "sa case" ait été détectés,
'on remplit les premières cases avec les numéros des jours du mois précédent, puis on continue avec les cases du mois en cours
'pour finir avec les jours du mois suivant
Private Function CalculJours()
    Dim i As Integer
    Dim DateDebutSemaine As Date
    Dim k As Integer
    
    'On calcule le numéro du premier jour de la semaine selon la date selectionnée grâce aux listes
    DateDebutSemaine = DateAdd("d", -IIf(Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1 = 0, 7, Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1) + 1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
    
    'Pour chaque jours de la semaine
    For i = 0 To 6
        'On affecte à la case en cours le numéro de son jour
        NumObject(i + 1).Caption = Day(DateAdd("d", i, DateDebutSemaine))
        
        'Et on colore la police des cases du mois en cours différemment des cases du mois précédent et suivant
        If CInt(Month(DateAdd("d", i, DateDebutSemaine))) <> Liste_Mois Then
            NumObject(i + 1).ForeColor = 8421504
        Else
            NumObject(i + 1).ForeColor = 10485760
            
        End If
        
        'On colore l'arrière plan des cases qui sont des samedi, dimanche, ou des jours fériés
        If (i = 5) Or (i = 6) Or IsFerie(DateAdd("d", i, DateDebutSemaine)) Then
            NumObject(i + 1).BackColor = NotWorkedColor
        Else
            NumObject(i + 1).BackColor = NormalColor
        End If
    Next
    'Dans le cas d'une case "WE" ou fériée, on sauvegarde la bonne couleur
    If ((CInt(elem_selected.Caption) = 6) Or (CInt(elem_selected.Caption) = 7)) Then
        text_color_old = NotWorkedColor
    Else
        text_color_old = elem_selected.BackColor
    End If
    'On donne au bouton selectionné les attributs de la selection (couleur, aspect, etc...)
    elem_selected.BackColor = SelectColor
End Function

Public Function SelectDay(num_case As Integer)
    DeSelectPreviousDay
    'Sauvegarde de la couleur de la case
    text_color_old = NumObject(num_case).BackColor
    NumObject(num_case).BackColor = SelectColor
    NumObject(num_case).SpecialEffect = 2
    'Mise à jour de la variable case en cour de sélection
    Set elem_selected = NumObject(num_case)
    MsgBox ReturnDate
End Function

Private Function DeSelectPreviousDay()
    elem_selected.SpecialEffect = 0
    elem_selected.BackColor = text_color_old
    Set elem_selected = Nothing
End Function


'Cette fonction permet de contourner l'interdiction d'avoir une variable tableau public
'Elle retourne un objet qui désigne une case du calendrier en fonction de sa position (facilement calculable)
Private Function NumObject(j As Integer) As Object
    Dim Bouton_Jour(42) As Object
    
    'On initialise le tableau d'objets
    Set Bouton_Jour(1) = Me.J1
    Set Bouton_Jour(2) = Me.J2
    Set Bouton_Jour(3) = Me.J3
    Set Bouton_Jour(4) = Me.J4
    Set Bouton_Jour(5) = Me.J5
    Set Bouton_Jour(6) = Me.J6
    Set Bouton_Jour(7) = Me.J7
    
    'On retourne l'objet correspondant au paramètre
    Set NumObject = Bouton_Jour(j)
End Function

'Fonction inverse
Private Function ObjectNum(Bouton_Jour As Object) As Integer
        
    'On initialise le tableau d'objets
    With Bouton_Jour
        Select Case Bouton_Jour.Name
            Case "J1"
                ObjectNum = 1
            Case "J2"
                ObjectNum = 2
            Case "J3"
                ObjectNum = 3
            Case "J4"
                ObjectNum = 4
            Case "J5"
                ObjectNum = 5
            Case "J6"
                ObjectNum = 6
            Case "J7"
                ObjectNum = 7
        End Select
    End With
End Function

'Fonction qui retourne la date de la case sélectionnée sous le format jj/mm/aaaa
Private Function ReturnDate() As Date
    Dim DateDebutSemaine As Date
    Dim i As Integer
    'On calcule le numéro du premier jour de la semaine selon la date selectionnée grâce aux listes
    DateDebutSemaine = DateAdd("d", -IIf(Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1 = 0, 7, Weekday(DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour)) - 1) + 1, DateSerial(Me.Liste_Annee, Me.Liste_Mois, Me.Liste_Jour))
    'On récupère le numéro de la case
    i = ObjectNum(elem_selected)
    'On calcule la date de la case selectionnée et on la renvoie
    ReturnDate = DateAdd("d", i - 1, DateDebutSemaine)
End Function

'Fonction trouvée sur www.codes-sources.fr/www.vbfrance.com
'http://www.vbfrance.com/code.aspx?ID=1251
Private Function IsFerie(Date_testee As Date) As Boolean
    Dim JJ As Integer, AA As Integer, MM As Integer
    Dim NbOr As Integer, Epacte As Integer
    Dim PLune As Date, Paques As Date, Ascension As Date, Pentecote As Date
    JJ = Day(Date_testee)
    MM = Month(Date_testee)
    AA = Year(Date_testee)
    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
    NbOr = (AA Mod 19) + 1
    Epacte = (11 * NbOr - (3 + Int((2 + Int(AA / 100)) * 3 / 7))) Mod 30
    PLune = DateSerial(AA, 4, 19) - ((Epacte + 6) Mod 30)
    If Epacte = 24 Then PLune = PLune - 1
    If Epacte = 25 And (AA >= 1900 And AA < 2000) Then PLune = PLune - 1
    Paques = PLune - Weekday(PLune) + vbMonday + 7 'Paques
    If JJ = Day(Paques) And MM = Month(Paques) Then IsFerie = True: Exit Function
    Ascension = Paques + 38 'Ascension
    If JJ = Day(Ascension) And MM = Month(Ascension) Then IsFerie = True: Exit Function
    Pentecote = Ascension + 11 'Pentecote
    If JJ = Day(Pentecote) And MM = Month(Pentecote) Then IsFerie = True: Exit Function
    IsFerie = False
End Function

'Fonction qui retourne le numéro de la semaine selon une date donnée
Private Function NumeroSemaine(date_jour As Date) As Integer
    'Algorithme adapté à vb trouvé sur http://www.univ-lemans.fr/~hainry/articles/semaine.html
    Dim i As Integer, j As Integer, N As Integer, S As Integer, A As Integer
    N = 0
    For i = 1 To CInt(Month(date_jour)) - 1
        N = N + Nbjour_mois(i, CInt(Year(date_jour)))
    Next
    N = N + CInt(Day(date_jour))
    S = Fix(CInt(Year(date_jour)) / 100)
    A = CInt(Year(date_jour)) - S
    If Nbjour_mois(2, Year(date_jour)) <= 28 Then j = (5 * S + S / 4 + A + A / 4) Mod 7 Else j = (5 * S + S / 4 + A + A / 4 + 6) Mod 7
    NumeroSemaine = (j + N + 5) / 7 - (j / 5)
End Function

'Fonction qui retourne le nombre de jour par mois (années bissextiles prises en compte)
Private Function Nbjour_mois(Mois As Integer, Annee 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((Annee Mod 100) = 0, Annee Mod 400, Annee Mod 4)) Xor 1
    End If
End Function
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

09 mai 2007 11:06:21 :
Gestion des jours fériés
09 juillet 2007 09:47:09 :
Prise en compte des remarques, portabilité vers des formats de dates différents (pays étrangers)
  • signaler à un administrateur
    Commentaire de Nicko11 le 09/05/2007 12:30:49

    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.

  • signaler à un administrateur
    Commentaire de pillsmen le 09/05/2007 13:21:16

    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),

    [code]
    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
    [/code]

    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 ?!

  • signaler à un administrateur
    Commentaire de Nicko11 le 09/05/2007 14:20:10

    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+

  • signaler à un administrateur
    Commentaire de Nicko11 le 09/05/2007 14:22:34

    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.

  • signaler à un administrateur
    Commentaire de pillsmen le 09/05/2007 16:15:30

    "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 ;)

    [code]
    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
    [/code]

  • signaler à un administrateur
    Commentaire de pillsmen le 09/05/2007 16:20:25

    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)

  • signaler à un administrateur
    Commentaire de PCPT le 10/05/2007 11:11:57 administrateur CS

    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

  • signaler à un administrateur
    Commentaire de MPi le 10/05/2007 11:17:29

    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

  • signaler à un administrateur
    Commentaire de pillsmen le 10/05/2007 11:54:36

    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 :)

  • signaler à un administrateur
    Commentaire de pillsmen le 10/05/2007 13:45:05

    @ PCPT

    "il re reste la possibilité de le faire par option"

    Qu'entends-tu par le faire par option ?

  • signaler à un administrateur
    Commentaire de PCPT le 10/05/2007 22:53:31 administrateur CS

    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


    ++

  • signaler à un administrateur
    Commentaire de pillsmen le 11/05/2007 08:05:23

    Ahh cool je connaisais pas cette syntaxe :), ça peut être bien pratique !

  • signaler à un administrateur
    Commentaire de pasquet78 le 11/05/2007 22:47:07

    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

  • signaler à un administrateur
    Commentaire de pillsmen le 21/05/2007 09:01:09

    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 !

  • signaler à un administrateur
    Commentaire de poustach le 20/11/2007 00:08:14

    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.

Ajouter un commentaire