Trier avec le contrôle Calendar

Retour vers Access
Trier avec le contrôle Calendar - 30 Juin 2005

But : Utiliser un contrôle calendrier pour filtrer des enregistrements en définissant une date de début et une date de fin. Ceci est une astuce pour Access 2003, sur Access2010, le fait de définir un champ de type date permet d'obtenir automatiquement un contrôle calendar

Nos outils :

  • Deux tables : T_Personnes et T_RDV, une relation de un à plusieurs entre ces tables (une personne peut avoir plusieurs RDV)
  • Une requête : R_RDV, où les renseignements des deux tables sont regroupés
  • Deux formulaires : F_RDV et F_Calendrier

Voici comment se présente F_RDV

Comment fonctionne-t-il ?
Il y a d'abord 2 champs indépendants "DateDebut" et "DateFin" qui réagiront lorsque l'on double-clic à l'intérieur en affichant le F_Calendrier. Le but est de les remplir en choisissant une date dans le F_Calendrier et de provoquer le tri lors de la fermeture de celui-ci (Attention ! vous devez sélectionner le jour - erreur que l'on commet souvent - une année et un mois NE sont PAS suffisants)
Le code du premier champ "DateDebut"
Private Sub DateDebut_DblClick(Cancel As Integer)
DoCmd.OpenForm "F_Calendrier", acNormal
End Sub
Le code du second champ "DateFin"
Private Sub DateFin_DblClick(Cancel As Integer)
DoCmd.OpenForm "F_Calendrier", acNormal
End Sub
Comme on peut le constater ils accomplissent la même action, en fait, c'est pour permettre à l'utilisateur de commencer sa "manœuvre" à partir de n'importe quel point

J'ai nommé l'objet "Calendrier" (qui l'eût crû !); puis deux boutons "Commande1" et "Commande2" qui réagiront bien sûr sur l'événement " sur clic"
Le code des deux boutons, ils envoient la date que vous avez choisie dans les champs indépendants de l'autre formulaire
Private Sub Commande1_Click()
Form_F_RDV("DateDebut") = Calendrier
Form_F_RDV.Refresh 'ceci est indispensable, sinon la date ne sera pas prise en compte
End Sub
Private Sub Commande2_Click()</b>
Form_F_RDV("DateFin") = Calendrier
Form_F_RDV.Refresh
End Sub
Lors de la fermeture de F_Calendrier, nous avons le code suivant (ceci va positionner le focus sur le bouton "Tri par dates")
Private Sub Form_Close()
Form_F_RDV.TriParDates.SetFocus
End Sub
Cette réception de focus va provoquer le filtre automatique des enregistrements, mais pour ne pas répéter le code à divers endroits nous allons l'appeller comme si nous cliquions sur le bouton (car on peut évidemment aussi provoquer le filtre par ce bouton à condition d'avoir des dates valides)
Private Sub TriParDates_GotFocus()
Call TriParDates_Click
End Sub

Private Sub TriParDates_Click()

If [DateDebut] <> "" Then
Dim vDebut, vFin, vfiltre As String
vDebut = "#" & Month(DateDebut) & "/" & Day(DateDebut) & "/" & Year(DateDebut) & "#"
vFin = "#" & Month(DateFin) & "/" & Day(DateFin) & "/" & Year(DateFin) & "#"
vfiltre = "[DATE DU RDV] between " & vDebut & " and " & vFin & ""
DoCmd.ApplyFilter , vfiltre
End If
End Sub
Les élucubrations avec les fonctions month, day, year sont obligatoires car le VBA traite les dates dans leur forme anglaise et nous francophones, nous devons donc présenter nos dates dans cette forme, sans cela on obtient de résultats inadéquats, voir des bugs du code en cours d'éxécution
Enfin , le dernier bouton nous permet de réafficher tous nos enregistrements
Private Sub TousLesEnr_Click()
DoCmd.ShowAllRecords
End Sub
Pour éviter quelques anomalies d'affichage en cours d'utilisation, la procédure TriParDates_Click est rappelée à différents endroits lors de la réception de focus, je vous laisse découvrir ceux-ci dans le fichier exemple
Cliquez ici pour télécharger le fichier zip TriCalendrier

Fin