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

IHM Discussion :

Lislte déroulante avec un contenu qui gère le "contient"


Sujet :

IHM

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Lislte déroulante avec un contenu qui gère le "contient"
    Bonjour,

    Dans un formulaire, j'ai une liste déroulante d'on le contenu est alimenté par une requête, classique.

    Mais à l'usage, la liste étant assez longue, la recherche par saisie est bien pratique.
    Sauf qu'elle suppose de connaître le début du texte cherché et au caractère prêt évidement.
    Ce que je voudrais c'est que la recherche par saisie ne se base pas uniquement sur le début du texte, mais également sur l'ensemble.
    Autrement dit, l'équivalent d'un filtre de type "contient".

    Mais je ne sais pas par quel bout prendre se problème et si seulement c'est possible.

    Vous auriez une info, une astuce, une idée svp ?

    Merci d'avance de votre aide
    Les solutions les plus simples sont les plus efficaces

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Bonjour

    Sur le formulaire tu ajoutes une Zone de texte dans laquelle tu renseigneras le mot à chercher
    Dans son événement Sur perte focus tu mets (à adapter)
    Dans ta requête sur laquelle est basée ta liste déroulante tu ajoutes en Critères sur le champ concerné par la recherche de mot (à adapter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Comme "*" & [Formulaires]![NomFormulaire]![NomChamp] & "*"
    Titi95
    Un problème bien posé est à moitié résolu

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut J'avance
    Bon,

    J'ai trouvé un début de solution en remplissant ma liste avec une requête SQL en VBA et .RowSource
    Mais il se passe un truc bizarre.
    Ma liste n'a aucune source contrôle
    Et j'ai placé mon code VBA sur l'évènement "sur changement"
    Au premier test, ça fonctionne :
    - Je saisi un texte
    - Je déroule ma liste
    - Et les éléments affichés sont conformes

    Mais à partir du 2e test, ça marche plus :
    - Je modifie mon texte
    - La liste se ferme automatiquement
    - Je la déroule et la liste n'a pas changé même si le texte à changé

    Une idée svp ?
    Les solutions les plus simples sont les plus efficaces

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Bonjour,

    Exemple , tu as une liste déroulante sur le controle 'nom_naissance' :
    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
     
    Private Sub c_nom_naissance_Change()
        Dim s1 As String, s2 As String
        s1 = Nz(Me.ActiveControl.Text)
         If Len(s1) > 2 Then
            s2 = "SELECT nom_naissance FROM R_dataMain1_slave" _
               & " GROUP BY nom_naissance" _
               & " HAVING nom_naissance LIKE '*" & s1 & "*'"
        Else
            ' on revient à la requete requete d'origine
            s2 = "SELECT nom_naissance FROM R_dataMain1_slave" _
               & " GROUP BY nom_naissance"
        End If
        Debug.Print
        Me.ActiveControl.RowSource = s2
     
    End Sub
    CDLT
    "Always look at the bright side of life." Monty Python.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Merci micniv
    Merci de votre aide,

    J'ai testé le code.
    J'ai un bug sur : s1 = Nz(Me.R_FOR2.Text)
    Message d'erreur : Impossible de faire référence à une propriété ou de la définir pour un contrôle si ce dernier n'est pas activé

    Je précise que dans les propriété de ma liste, elle est activée et non verrouillée

    Merci de votre aide
    Les solutions les plus simples sont les plus efficaces

  6. #6
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut Bonjour Lololebricoleur,
    Est-ce que ce sujet répond à ton besoin ?

    Cordialement,
    Paraffine.
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Merci Paraffine
    La piste semble très intéressante !

    Je test immédiatement
    Merci beaucoup ;-)
    Les solutions les plus simples sont les plus efficaces

  8. #8
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Me code ci-dessus suppose que le controle actif soit le controle de la liste déroulante.
    Et comme on est en train de saisir dedans, il a forcément le focus : aussi le message que tu as obtenu est très étonnant ...

    aussi le code était à placer sur l'evt "sur changement", bizarre ...
    "Always look at the bright side of life." Monty Python.

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Nouveau test
    Voici mon code :
    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
    Private Sub R_FOR_KeyPress(KeyAscii As Integer)
    Dim i As Long
     
    'contrôle les touches
    If KeyAscii = 27 Then strList = ""  'Sur Echap vide le contenu
    If Not (KeyAscii > 64 And KeyAscii < 123) Then Exit Sub 'ce n'est pas un caractère A-Z a-z (à affiner)
     
    strList = strList & Chr(KeyAscii)  'ajoute la touche pressée
     
    For i = 0 To Me.R_FOR.ListCount - 1  'parcours les items
        If Me.R_FOR.Column(1, i) Like "*" & strList & "*" Then 'l'item correspond
           MsgBox "ok"
           Me.R_FOR = Me.R_FOR.Column(0, i)
           Exit For  'et on sort
        Else
            MsgBox "pas ok"
        End If
    Next
    End Sub
    Problème sur : If Me.R_FOR.Column(1, i) Like "*" & strList & "*"
    Aucun item n'est trouvé alors qu'il y en a
    je précise que c'est une chaine de caractère que nous cherchons

    Si vous avez une idée, suis preneur.
    Merci d'avance
    Les solutions les plus simples sont les plus efficaces

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Micniv
    Voici mon code
    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
    Private Sub R_FOR2_Change()
        If Len(Me.R_FOR2) > 2 Then
            Dim s1 As String, s2 As String
            s1 = Nz(Me.R_FOR2.Text)
     
            If Len(s1) > 2 Then
                SQl = "SELECT FOR_Titre, FOR_Num" & _
                " FROM FORmation" & _
                " WHERE ((FOR_Titre) LIKE '*" & s1 & "*');"
            Else
                ' on revient à la requete requete d'origine
                SQl = "SELECT FOR_Titre, FOR_Num" & _
                " FROM Formation;"
            End If
     
            Debug.Print
            Me.ActiveControl.RowSource = SQl
        Else
     
        End If
     
        Me.R_FOR2.RowSource = SQl
    Les solutions les plus simples sont les plus efficaces

  11. #11
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.R_FOR.Column(1, i) Like "*" & strList & "*" Then 'l'item correspond
    Je n'avais pas vu cela; je suppose qu'il vaudrait mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.R_FOR.Column(1, i) Like '*" & strList & "*' Then 'l'item correspond
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.R_FOR.Column(1, i) Like ""*" & strList & "*"" Then 'l'item correspond
    Mais le code de Micniv permet de mieux cibler la recherche (puisque seules les valeurs correspondant à la saisie sont affichées). Un petit essai s'impose...
    Cordialement.
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  12. #12
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    A essayer (j'ai repris mon code ci-dessus)
    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
     
    Private Sub R_FOR2_Change()
            Dim s1 As String, s2 As String
            s1 = Nz(Me.R_FOR2.Text)
     
             If Len(s1) > 2 Then
                s2 = "SELECT FOR_Titre, FOR_Num" & _
                " FROM FORmation" & _
                " WHERE ((FOR_Titre) LIKE '*" & s1 & "*');"
            Else
                ' on revient à la requete d'origine
                s2 = "SELECT FOR_Titre, FOR_Num" & _
                " FROM Formation;"
            End If
     
            Debug.Print s2 
            Me.ActiveControl.RowSource = s2 
     
        End sub
    CDLT
    "Always look at the bright side of life." Monty Python.

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut micniv
    Merci de votre aide,

    J'ai déjà essayé se code mais je j'ai retenté au cas où.
    Toujours le même message sur : s1 = Nz(Me.R_FOR2.Text)

    J'ai aussi essayé de faire simplement s1 = me.R_FOR2 mais la valeur ne change pas malgré les modifications !
    C'est vraiment très curieux.
    Les solutions les plus simples sont les plus efficaces

  14. #14
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut Bonjour Micniv
    ... et bonjour à tous

    Comme j'ai fait une proposition simple dans cette discussion, je me permets de te questionner ici.
    Je suis très intéressé par ton code, mais je ne vois pas comment l'adapter à un contexte (d'où ma solution ci-dessus qui fonctionne).

    Ma liste affiche plusieurs colonnes et la recherche (Like) doit s'effectuer sur la 2ème.
    Comment adapter ton code ?

    Merci !

    Titi95
    Un problème bien posé est à moitié résolu

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Comment expliqué ça
    j'ai fait un test très simple et le résultat est plus que troublant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Txt_Cherche_Change()
            Dim s1 As String
            s1 = Me.Txt_Cherche
            MsgBox s1
    End Sub
    normalement S1 devrait me retourner le texte saisi non ?
    et bien non !
    il me retourne la valeur figée au moment de l'activation du formulaire !?
    et il ne tient aucun compte des changements !?
    j'ai aussi essayé avec la propriété .text et j'ai toujours le même message qui me dit que le champ n'est pas actif
    Les solutions les plus simples sont les plus efficaces

  16. #16
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    alors je re-répète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s1 = Me.Txt_Cherche.text
    C'est bien l'attribut .text qui contient la saisie en cours.
    Donc le code suppose que tu es en train saisir dans ce champ Me.Txt_Cherche et que ce champ est une liste déroulante ...
    Aussi je l'ai faite pour le cas simple d'un champ unique dans une liste déroulante, mais je pense qu'en retouchant la requete et le code, on peut adapter à différentes situations.
    Je suis en ACC2010.
    CDLT
    "Always look at the bright side of life." Monty Python.

  17. #17
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Micniv
    Oui, je viens de me replonger dans ma doc pour mieux comprendre.
    Pour le champ de saisie, la propriété .text fonctionne
    Mais pas pour la liste déroulante
    J'ai essayé de forcer le focus mais ça ne change rien

    Je continue de chercher, merci de votre aide
    Les solutions les plus simples sont les plus efficaces

  18. #18
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    As-tu essayé ma solution ?

    Titi95
    Un problème bien posé est à moitié résolu

  19. #19
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Titi95
    Je test et te tiens au courant
    Les solutions les plus simples sont les plus efficaces

  20. #20
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut Titi95
    Bon,

    Ça fonctionne en passant par un champ de saisie de texte intermédiaire
    C'est pas top et ça n'explique pas pourquoi le .text ne marche pas mais bon, ça marche
    Merci titi95
    Les solutions les plus simples sont les plus efficaces

Discussions similaires

  1. Créer un header bar fixe avec un contenu qui change
    Par nunchaku31 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 22/09/2015, 17h02
  2. Div avec overflow: contenu qui dépasse sous FF
    Par cortex024 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 12/10/2010, 13h30
  3. Remplir un menu déroulant avec le contenu d'un XML
    Par ibson76 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/09/2008, 15h57
  4. Requête union avec group by qui gère les 2 requêtes.
    Par juha dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/10/2007, 09h38
  5. [VBA-E]Erreur avec une combobox qui liste le contenu de cell
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/03/2006, 12h01

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