Comment réaliser un filtre alphabétique par bouton ?

    From The Document Foundation Wiki
    < Macros‎ | Base


    Description

    On souhaite réaliser quelque chose ressemblant à ceci :

    copie d'écran formulaire
    Filtrer par clic sur un bouton (lettre G dans cet exemple)

    Des boutons de A à Z permettent en cliquant sur la lettre G, par exemple, de ne conserver que les noms de clients commençant par G.

    La solution présentée ici consiste à utiliser une seule macro associée à chaque bouton (la même macro).

    Son principe est simple :

    • "Remonter" de l'événement appelant (le clic sur le bouton) au "parent", c'est-à-dire le bouton sur lequel on a cliqué et son parent "à lui", c'est-à-dire le formulaire. Les boutons sont nommés BtnA, BtnB, etc. jusque BtnZ. Il suffit donc d'extraire le dernier caractère à droite et de l'utiliser dans l'instruction SQL pour...
    • Filtrer puis recharger le formulaire.

    Pour parfaire la présentation on définit la propriété Basculer des boutons à Oui et le programme ne garde enfoncé que le bouton du filtre courant. La propriété correspondante est State[1].

    Code

    La procédure est associée à l'événement Exécuter l'action des boutons :

    option explicit
    
    Sub PysFiltrer(oEvent)
    
    dim oParent as object, oUnCtrl as object
    
    oParent = oEvent.Source.Model.Parent
    
    for each oUnCtrl in oParent
    	if left(oUnCtrl.name, 3) = "Btn" and oUnCtrl.name <> oEvent.Source.Model.Name then
    		oUnCtrl.State = 0
    	end if
    next oUnCtrl
    
    select case oEvent.Source.Model.Name
    	case "BtnTout"
    		oParent.Command = "SELECT * FROM ""Clients"" ORDER BY ""Nom"" ASC, ""Prénom"" ASC"
    	case else
    		oParent.Command = "SELECT * FROM ""Clients"" WHERE ""Nom"" LIKE '" & right(oEvent.Source.Model.Name,1) & "%'" & _
    							"ORDER BY ""Nom"" ASC, ""Prénom"" ASC"
    end select
    
    oParent.reload
    
    End Sub

    Document exemple

    Notes