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

Macros et VBA Excel Discussion :

[VBA-E]Rechercher (textbox) dans une listbox


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut [VBA-E]Rechercher (textbox) dans une listbox
    Bonjour ,

    J'ai une listbox qui est remplis grace a des données excels . La listbox contient plusieurs colones . J'ai ajouter une textbox1 et une bouton pour lancer une recherche .

    Ce que j'aimerais : lorsque je clique sur le bouton , VBA recherche le TextBox1 dans la ListBox1 pour m'afficher la ligne qui contient , dans la premiere colone uniquement , le TextBox1 ou une partie de celui-ci . Lorsque je reclique sur le bouton , ca cherche le suivant .

    J'ai trouvé ca :

    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
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ 
            ByVal hwnd As Long, ByVal wMsg As Long, _ 
            ByVal wParam As Long, lParam As Any) As Long 
     
    Private Const LB_FINDSTRINGEXACT As Long = &H1A2 
    Private Const LB_FINDSTRING As Long = &H18F 
    Private Const LB_ERR As Long = -1 
    ' 
    ' Entrées : 
    '  LstBox        : La ListBox dans laquelle on fait la recherche 
    '  searchPattern : La chaine de caractère recherchée 
    '  startIndex    : (optionnel) Index de départ de la recherche 
    '  exactMatch    : (optionnel) Si True,  la fonction recherche un item exactement égal à searchPattern 
    '                              Si False, la fonction recherche le premier item commençant par searchPattern 
    ' 
    ' Sorties : 
    '  retourne l'index dans la liste de la première occurrence de l'élément recherché 
    '  si rien n'est trouvé, la fonction retouren LB_ERR (-1) 
    ' 
    Private Function SearchListBox(lstBox As ListBox, ByVal searchPattern As String, _ 
                                   Optional ByVal startIndex As Long = -1, _ 
                                   Optional ByVal exactMatch As Boolean = False) As Long 
        Dim searchType As Long 
     
        If exactMatch Then 
            searchType = LB_FINDSTRINGEXACT 
        Else 
            searchType = LB_FINDSTRING 
        End If 
     
        SearchListBox = SendMessage(lstBox.hwnd, searchType, startIndex, ByVal searchPattern) 
     
    End Function
    Appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = SearchListBox(Listbox1, TextBox1)
    Sauf que VBA ne connais pas hwnd et je n'arrive de toute facon pas à bien parametrer la recherche en question .

    Pouriez-vous m'aider svp ?

    Une image pour clarifier

    Cordialement.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Ton code ne serait-il pas du copier coller d'un autre code.

    La fonction SendMessage est une Api et hwnd est le handle d'une fenêtre.

    Ce bout de code te donnera la position dans la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Dim i As Integer
        Dim intPosition As Integer
        For i = 0 To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.matextbox.Value Then
                intPosition = i
            End If
        Next i
        MsgBox i
    A toi de l'adapter pour récupérer d'autre données de ta liste.
    A mettre sur le l'évènement Click de ton bouton.
    Regarde dans l'aide VBA toutes les propriétés et méthodes des listbox.

    La touche est indispensable

    Starec

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Oui c'est un copier/coller mais j'ai dit que je l'avais trouver sur internet

    Ton code m'indique simplement la position de la derniere ligne remplie de la listbox :/ et ce peu importe la valeur de ma textbox.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re

    Je t'ai dit que c'est à adapter.

    1 - As-tu regardé l'aide pour savoir comment fonctionnait les éléments d'une listbox
    2 - le 0 dans column correspond à la première colonne, si ta recherche est dans la deuxième mettre 1, etc.. (la numérotation des colonnes commencant à 0).

    Starec

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Hum.. je doit être trop mauvais mais j'y arrive pas vraiment la :/

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re

    As-tu regardé l'aide et les exemples de l'aide pour les instructions utilisés comme : column ?

    Je t'ai dis de mettre à la place du 0 la colonne que tu veux tester, si c'est la première c'est 0, si c'est la deuxième c'est 1.

    As-tu changé les nom dans le code que je t'ai donné avec tes noms à toi ?

    Montre le code que tu as écris.

    Starec

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Oui j'ai bien regarde les proprietes + methodes . Je pense avoir compris ce que tu voulais . Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub CommandButton7_Click()
    Dim i As Integer
        Dim intPosition As Integer
        For i = 0 To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.TextBox1.ValueThen
                intPosition = i
            End If
     ListBox1.ListIndex = i
        Next i
    End Sub

  8. #8
    Invité
    Invité(e)
    Par défaut
    Re

    Et alors ça marche ?

    Starec

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Lorsque je reclique sur le bouton , ca cherche le suivant .
    Pour avoir le suivant, tu sois pouvoir mémoriser listindex. Déclare une variable Public en tête de la feuille de code de l'userform (Lindex dans l'exemple suivant) et crée une macro paramétrée
    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
    Dim Lindex as integer 'ou Byte... en tête de la feuille de code ds Général
     
    Private Sub CommandButton7_Click()
        IndexSuivant(Lindex)
    End Sub
     
    Sub IndexSuivant(Debut)
    Dim i As Integer
        Dim intPosition As Integer
        For i = Debut To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.TextBox1.ValueThen
                intPosition = i
            End If
            ListBox1.ListIndex = i
            Lindex = i + 1 'la prochaine recherche commencera à i + 1
            Exit for
        Next i
    End sub
    Si tu ne sors pas de la boucle quand tu as trouvé une correspondance, tu auras toujours l'index de la dernière correspondance de la liste

  10. #10
    Membre régulier
    Homme Profil pro
    Contrôleur des Systèmes d'Information
    Inscrit en
    Mars 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Contrôleur des Systèmes d'Information
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2007
    Messages : 72
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par ouskel'n'or
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        For i = Debut To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.TextBox1.ValueThen
                intPosition = i
            End If
            ListBox1.ListIndex = i
            Lindex = i + 1 'la prochaine recherche commencera à i + 1
            Exit for
        Next i
    Si tu ne sors pas de la boucle quand tu as trouvé une correspondance, tu auras toujours l'index de la dernière correspondance de la liste
    Je pense que le "Exit For" doit se trouver entre If ... et End If, non? Comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        For i = Debut To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.TextBox1.ValueThen
                intPosition = i
                Exit for
            End If
            ListBox1.ListIndex = i
            Lindex = i + 1 'la prochaine recherche commencera à i + 1
        Next i

  11. #11
    Invité
    Invité(e)
    Par défaut
    Re
    Je pense que le "Exit For" doit se trouver entre If ... et End If, non? Comme suit
    Non

    Ousk à raison, sinon tu ne pourras pas incrémenter pour la prochaine recherche, là où tu l'as mis tu sors dés que tu as trouvé.

    Starec

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    J'ai teste le code de Ouskel , alors en fait voila ce que ca fait :

    Peut importe le texte que je met dans textbox1 , lorsque je clique sur le bouton , ca selectionne la premiere ligne de ma listbox et lorsque je reclique , ca passe a la seconde et ainsi de suite . La boucle marche donc bien mais pas la recherche .

    J'espere avoir été assez clair . En tout cas merci beaucoup de votre aide .

    Cordialement.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour

    As-tu déclaré en début de ton module la variable Lindex tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Lindex as Integer
    De plus sur l'événement After_Update de ta textbox met
    Fait le test

    Starec

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    J'avais déclare Lindex en effet .

    Le fait de remetre TextBox a 0 apres update fait que je remonte a ma premiere ligne de la listbox mais la recherche ne fonctionne pas ( donc en fait je tape textbox , je clique sur le bouton , ca selectione la premiere ligne de la listbox , je clique sur next , ca selectione la deuxieme ligne , je clique sur next , ca selectione la troisieme ligne....... , arrive a la derniere ligne , ca ne bouge plus , sauf si je change la textbox et a ce moment ca reprend le roulement ( 1ere ligne , 2 eme ligne etc.. ) ) .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For i = Debut To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.TextBox1.Text Then
                intPosition = i
    Je suppose que cette ligne , qui devait etre la recherche , ne fonctionne pas correctement ( sachant que la colone 0 est la bonne colone pour ma recherche ) .

    Cordialement.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Re

    Essaye une modif comme ceci, bien laisse le reste du code qui est avant et aprés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim i As Integer
        Dim intPosition As Integer
        For i = Debut To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.TextBox1.ValueThen
                intPosition = i
                Lindex = i + 1 'la prochaine recherche commencera à i + 1
                Exit for        
             End If    
        Next i
    End sub
    Je pense que jkodio avait raison, mais il faut inclure la récupération de l'index avant le for

    Je n'est pas testé

    Starec

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Un grand merci ! Ca marche impeccablement bien !! Merci a vous tous qui m'avez aide

    Je reposte le code complet pour ceux qui en aurait besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Lindex As Integer 'ou Byte... en tête de la feuille de code ds Général
    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
    Private Sub TextBox1_AfterUpdate()
    Lindex = 0
    End Sub
     
    Private Sub CommandButton7_Click()
    IndexSuivant (Lindex)
    End Sub
     
    Sub IndexSuivant(Debut)
    Dim i As Integer
        Dim intPosition As Integer
        For i = Debut To Me.ListBox1.ListCount - 1
            If Me.ListBox1.Column(0, i) = Me.TextBox1.Text Then
                intPosition = i
     
            ListBox1.ListIndex = i
            Lindex = i + 1 'la prochaine recherche commencera à i + 1
            Exit For
            End If
        Next i
    End Sub

  17. #17
    Invité
    Invité(e)
    Par défaut
    Re

    L'important c'est que tu es compris ce qui c'est passé, c'est que l'on sortait de la boucle que l'on trouve ou non quelque chose.

    C'est un bout d'Ouskel'n'or, un zest de jkodio qui a fait un déclic dans mon petit cerveau fatigué ce vendredi et de votre serviteur.

    Starec

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Desole de réouvrir le sujet mais j'aurais une petite question :

    Grace a ce code , je retrouve le texte dans ma listbox . Mais , comment faire lorsque je n'ai qu'une partie du texte a chercher ? Du style les deux premieres lettres seulement ?

    Cordialement.

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu recherches ces deux lettres et comme ces deux lettres peuvent se retrouver n'importe où dans d'autres mots, tu vérifies que ce sont bien les premiers. Mais ces deux caractères doivent bien être les premiers du mot cherché.
    Bon, je ne vais pas tout relire mais pour le principe, tu modifies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            If instr(Me.ListBox1.Column(0, i), Me.TextBox1.Text) = 1 Then
                intPosition = i
     
            ListBox1.ListIndex = i
            Lindex = i + 1 'la prochaine recherche commencera à i + 1
            Exit For
    A+

    Je viens de reûfléchir... Tu peux taper tes deux caractères en minuscules alors que ton mot commence par une majuscule, alors tu modifies encore...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            If instr(Lcase(Me.ListBox1.Column(0, i)), lcase(Me.TextBox1.Text)) = 1 Then
                intPosition = i
    A+

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Impeccable je te remercie !

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

Discussions similaires

  1. recherche mot dans une listbox
    Par devhafid dans le forum C#
    Réponses: 10
    Dernier message: 18/02/2016, 11h35
  2. [XL-2010] VBA Pointeur - Recherche Données dans une plage
    Par Coxtox dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/04/2015, 09h37
  3. [XL-2013] Recherche dans une listbox à partir d'un textbox ou optionbutton
    Par keithingel dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/11/2014, 15h36
  4. [vba excel] Recherche valeur d'une textbox dans une feuille
    Par vanessaferraz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/08/2006, 10h55
  5. recherche dans une listbox
    Par micknic dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 23/02/2005, 21h39

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