IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Filtrage formulaire continu [AC-2019]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 19
    Par défaut Filtrage formulaire continu
    Bonjour

    J'ai un formulaire basé sur une requête "rqt_operations" et qui contient 2 champs indépendants (une zone de liste déroulante "champfiltre" basée sur une requête "rqt_zoneliste" qui liste les champs à filtrer et une zone de texte "textefiltre").

    Dans la zone de liste déroulante, je choisis le champ sur lequel je souhaite filtrer mes enregistrements. Il est composé de "Date", "Type" et "Numdocument". Ensuite, je tape lettre par lettre la valeur dans le champ "textefiltre".

    Le filtre fonctionne plus ou moins : j'ai un souci avec le Focus. Après avoir tapé la 1ère lettre dans le champ "textefiltre", le focus se met sur l'objet suivant suivant l'ordre de tabulation. Je suis contraint de replacer le focus dans le champ après la lettre que j'ai tapée.

    Si vous pourriez m'aider à régler ce problème, çà serait vraiment sympa.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Form_Load()
    Me.champfiltre.Value = "Date"
    Me.textefiltre.SetFocus
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Sub textefiltre_KeyUp(KeyCode As Integer, Shift As Integer)
    Dim i As Integer
     
    i = KeyCode
     
    Select Case i
    Case 8
    If Len(lettres) = 1 Or Len(lettres) = 0 Then
    lettres = ""
    Else
    lettres = Left(lettres, Len(lettres) - 1)
    End If
    GoTo filtrer
    Case 37, 39
    SendKeys "{END}"
    Case 32, 48 To 57, 65 To 90, 97 To 122
    lettres = lettres & Chr(i)
    Me![textefiltre] = lettres
    GoTo filtrer
    End Select
     
    Exit Sub
     
    filtrer:
    If Len(lettres) = 0 Then
    Me.FilterOn = False
    Else
    Me.Filter = "[" & Me![champfiltre] & "]" & "like '" & lettres & "*'"
    Me.FilterOn = True
    End If
    Me.OrderBy = "[" & Me!champfiltre & "] " & "ASC"
    Me.OrderByOn = True
    Me.textefiltre.SetFocus
    SendKeys "{END}"
     
    End Sub
    rqt_operations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tbl_operations.o_date AS [Date], tbl_operations.o_type AS Type, tbl_operations.o_nom AS Nom, tbl_operations.o_document AS Document, tbl_operations.o_numdocument AS [N° document], tbl_operations.o_libelle AS Libellé, tbl_operations.o_categorie AS Catégorie, tbl_operations.o_prixHTVA AS [Prix HTVA], tbl_operations.o_TVA AS TVA, [o_prixHTVA]+[o_TVA] AS [Prix TVAC], tbl_operations.o_description AS Description
    FROM tbl_operations
    ORDER BY tbl_operations.o_date, tbl_operations.o_type, tbl_operations.o_nom;
    rqt_zoneliste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tbl_operations.o_date AS [Date], tbl_operations.o_type AS Type, tbl_operations.o_numdocument AS [N° document]
    FROM tbl_operations;

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Salut,

    Quelques mises au point s'imposent.
    Le paramètre KeyCode des evennement KeyDown et KeyUp correspond à une touche du clavier, et n'a rien à voir avec les caractères entrés au clavier. Par exemple, les fleches directionelles ont une code (KeyCode), mais pas de caractère ASCII (KeyASCII) associé.
    L'evennement KeyPress sera plus approprié, il te donne un code ASCII.

    Ensuite ton code est incompréhensible.
    lettres c'est quoi ? Une variable globale ?
    Ne veux-tu pas plutôt la valeur courrante de textefiltre ? (textefiltre.value ou textefiltre.text).

    Quand je voit cet horrible sendkey , je me dit qu'il ne faut pas chercher plus loin.
    Sauf gestionnaires d'erreurs, l'instruction GoTo est à bannir

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 19
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Salut,

    Quelques mises au point s'imposent.
    Le paramètre KeyCode des evennement KeyDown et KeyUp correspond à une touche du clavier, et n'a rien à voir avec les caractères entrés au clavier. Par exemple, les fleches directionelles ont une code (KeyCode), mais pas de caractère ASCII (KeyASCII) associé.
    L'evennement KeyPress sera plus approprié, il te donne un code ASCII.

    Ensuite ton code est incompréhensible.
    lettres c'est quoi ? Une variable globale ?
    Ne veux-tu pas plutôt la valeur courrante de textefiltre ? (textefiltre.value ou textefiltre.text).

    Quand je voit cet horrible sendkey , je me dit qu'il ne faut pas chercher plus loin.
    Sauf gestionnaires d'erreurs, l'instruction GoTo est à bannir
    Merci d'abord pour ta réponse.
    Oui lettres est une variable.
    Je souhaite taper lettre par lettre la valeur que je souhaite chercher dans le champ "textfile" et qu'au fur et à mesure des caractères, les enregistrements soient filtrés.
    J'ai copié ce code de ce site : https://www.bonbache.fr/filtrer-un-f...pees-1164.html

  4. #4
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 957
    Par défaut
    bonsoir,
    Citation Envoyé par Lolofr
    Je souhaite taper lettre par lettre la valeur que je souhaite chercher dans le champ "textfile" et qu'au fur et à mesure des caractères, les enregistrements soient filtrés.
    as-tu essayé l'évènement Change de ta zone de texte ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 19
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonsoir,

    as-tu essayé l'évènement Change de ta zone de texte ?
    Non je n'ai pas essayé, peux-tu m'en dire plus ?

    En fait, le code fonctionne quasi j'arrive à filtrer mais ce champ indépendant garde en mémoire ce que j'ai tapé précédemment alors que je supprime la valeur via un bouton de commande.

  6. #6
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 957
    Par défaut
    l'évènement Change se produit à chaque changement du contrôle, donc à chaque lettre ou chiffre saisi, par contre il faut travailler avec la propriété Text et pas Value qui n'est pas encore valorisé à ce stade.
    le code pourrait ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub textefiltre_Change()
    Me.Filter = "[" & Me![champfiltre] & "] Like '" & Me.textefiltre.Text & "*'"
    Me.FilterOn = True
     
    Me.OrderBy = "[" & Me!champfiltre & "]"  ' inutile de préciser ASC, le tri ascendant est par défaut 
    Me.OrderByOn = True
    End Sub
    ATTENTION ! "Date" est un mot réservé, il est déconseillé de nommer un champ ainsi (sauf si on utilise des crochets mais il ne faut pas oublier à chaque fois qu'on utilise le champ) il est préférable de le suffixer (DateValeur, DateFin, DateContrat)
    et personnellement, je déplacerais le tri sur l'évènement After_Update du contrôle car il ne s'exécutera qu'une seule fois après la fin de la saisie.

    Par contre:
    Citation Envoyé par Lolofr
    Ensuite, je tape lettre par lettre la valeur dans le champ "textefiltre"
    est-ce vraiment ce que tu veux faire ? c'est étonnant (et même déconseillé) de faire cela pour une date ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/01/2006, 09h22
  2. Access Formulaire continu à l'horizontal ?
    Par fabrice518 dans le forum IHM
    Réponses: 2
    Dernier message: 22/11/2005, 16h16
  3. [Formulaire continu] une ligne sur deux en gris
    Par genius99 dans le forum IHM
    Réponses: 7
    Dernier message: 30/10/2005, 18h52
  4. Réponses: 6
    Dernier message: 04/11/2004, 17h35
  5. Figer colonnes dans formulaire continu
    Par Mr.Gus dans le forum IHM
    Réponses: 10
    Dernier message: 30/11/2003, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo