Bonjour,

Dans une contribution précédente "Propriétés des tables, requêtes, formulaires, états et contrôles",

https://www.developpez.net/forums/d1...ats-controles/,

je désirais filtrer certains formulaires sur base de la lettre initiale d'un champ texte.

J'ai bien entendu commencé par créer des boutons A, B, C, D, etc. afin de filtrer les items. Travail assez laborieux et répétitif!

Jusqu'à ce que je tombe sur le site www.lebans.com/selectalpha.htm qui reprenait une fonction assez géniale utilisant un seul bouton (ou label indépendant) et 2 lignes de code pour filtrer les enregistrements. Le petit code VBA astucieux "SelectAlpha", a été créé par Lyle Fairfield (lylefairfield@yahoo.com).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Private Sub MonLabel_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As  Single)
      Me.Filter = "ChampFiltre LIKE " & Chr(34) & Chr(64 - Int(-X /Me.MonLabel.Width *26)) & "*" & Chr(34)
      Me.FilterOn = True
End Sub

  • ChampFiltre = champ sur lequel le filtre est appliqué
  • MonLabel = ici label indépendant
  • Chr(34) = code Ascii de double quotes (")
  • Chr(64) = code Ascii de 'A' - 1
  • X = largeur du label
  • Y = hauteur du label utilisé dans frmCodesVertical
  • Chr(48) = code Ascii de '1' - 1 utilisé dans frmCodesVertical
  • 26 = nombre de lettres dans le label
  • 9 = nombre de chiffres dans le label utilisé dans frmCodesVertical
  • Int () = la fonction Int (Ent en français) arrondit au chiffre inférieur > Int(-3,12) = 4


On pourrait critiquer l'esthétique minimaliste de ce bouton mais il n'encombre pas le formulaire (si ce n'est que les lettres doivent être orientées dans une seule direction) et il fait ce qu'on lui demande.

Le bouton doit être rempli par les lettres accolées de l'alphabet et donc ajusté exactement pour les contenir. La fonte utilisée doit être proportionnelle, par exemple Consolas, Courier New, Lucida Console, etc. Un plaisantin avait apprécié la fonction mais désirait utiliser une fonte non-proportionnelle!

En guise de démonstration, la base Access 2016 jointe comprend 4 formulaires:

  1. frmAcne où on retrouve les 26 boutons classiques;
  2. frmCommunes qui filtre les communes soit commençant par la lettre, soit commençant par la lettre et ses suivantes dans l'alphabet;
  3. frmCodes où j'ai modifié le code pour l'appliquer à un champ numérique et qui filtre par codes postaux;
  4. frmCodesVertical qui fait de même mais où le bouton est orienté verticalement et où les enregistrements sont dans un sous-formulaire pour permettre l'affichage du bouton sans étirer inutilement l'en-tête de formulaire.


À noter ici que, dans le cas d'un label orienté verticalement, le choix de la fonte est plus libre. Le plaisantin sera ravi!

frmAcne
Nom : frmAcne.png
Affichages : 266
Taille : 63,4 Ko

frmCommunes
Nom : SelectAlpha.png
Affichages : 256
Taille : 90,3 Ko

frmCodes
Nom : SelectNum.png
Affichages : 262
Taille : 127,0 Ko

frmCodesVertical
Nom : SelectNumVertical.png
Affichages : 269
Taille : 102,4 Ko

Deux questions me restent:
  • pourquoi l'auteur de la fonction a-t-il compliqué son code en partant de chr(64) au lieu de chr(65)?
  • pourquoi utiliser -Int(-X/Me.Monlabel.Width*26) au lieu de +Int(X/Me.Monlabel.Width*26)?


Ce qui donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Private Sub MonLabel_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As  Single)
      Me.Filter = "ChampFiltre LIKE " & Chr(34) & Chr(65 + Int(X /Me.MonLabel.Width *26)) & "*" & Chr(34)
      Me.FilterOn = True
End Sub
et me semble plus simple.

Si vous pouvez répondre à mes questions, merci d'avance!

SelectAlpha.zip