Zone de recherche en vba

Résolu

Bonjour à tous,

Je fais appel à votre bienveillance pour m'aider à trouver le code adapté. Mes connaissances en vba sont proches de zéro, j'ai eu beau regarder différents forums et fichiers proposés en essayant d'adapter selon mon cas, j'ai toujours une erreur d'exécution en retour.

Même si c'est inutile de préciser, je suis sur Excel 2016...

Dans le fichier joint, je souhaite tout simplement pouvoir afficher dans la ListBox1 les différents résultats trouvés dans la colonne A de la feuil1 en fonction de la recherche de la Textbox1

Les critères de recherche doivent être "dynamiques" - pas sûr que ce soit la bonne expression, mais par exemple que le résultat s'affine au fur et à mesure de la saisie même si le critère de recherche est incomplet (i.e : pari va afficher paris, parigot, parisien etc etc...)

La colonne A est amenée à évoluer en terme de ligne dans le temps

 Fichier ici

https://uploadnow.io/files/1kX1YGx

Merci par avance, j'ai mal au crâne depuis ce matin à force de regarder du code que je ne comprends pas

6 réponses

Résumé de la discussion

Le besoin est d’alimenter ListBox1 avec les valeurs de la colonne A de Feuil1 qui correspondent dynamiquement au texte saisi dans TextBox1, avec une recherche insensible à la casse et sur l’intégralité du contenu. La solution retenue parcourt la plage A2 jusqu’à la dernière ligne et ajoute à ListBox1 les valeurs lorsque InStr(1, UCase(C.Value), UCase(Me.TextBox1.Value)) > 0. À chaque changement, la ListBox1 est vidée avant l’ajout des résultats, et si TextBox1 est vide, la liste est également effacée. Le code s’exécute via l’événement TextBox1_Change sur Feuil1, ce qui rend la recherche intuitive et adaptée à l’évolution dynamique de la colonne A.

Bobot (l’IA à votre service)
  1. Bonjour,

    Désolé, je ne vois pas comment récupérer le fichier sans ouvrir un compte ?

    Daniel


    0
    1. Désolé, j'ai créé le fichier en urgence pour le poster ici avant de partir en week-end, je n'ai pas pensé à vérifier si on pouvait accéder au fichier facilement...

      J'en ai recréé un autre de chez moi du coup et mis chez un autre hébergeur de confiance

      https://www.cjoint.com/c/OBhszzcqI5O

      0
  2. Bonjour

    1) Poste ton fichier sur un site libre d'accès comme cjoint.com

    2) Pour une recherche intuitivité voir les exemples et codes VBA donnés ici : http://boisgontierj.free.fr/

    Cdlmnt

    Via


    0
    1. Bonjour,

      1) Désolé, je n'avais pas accès à cjoint depuis le travail, merci la stratégie d'entreprise. Bref, j'ai uploadé depuis chez moi un autre fichier du même genre

      https://www.cjoint.com/c/OBhszzcqI5O

      2) J'y ai passé la plus grande partie de mon après-midi à comprendre le fonctionnement. Il y a de nombreux exemples vraiment sympa mais je ne cherche pas de userform, juste un champ de recherche sur la feuille de calcul avec les résultats dans une listbox

      0
  3. Fais un clic droit sur Feuil2, clique sur "Visualiser le code" et colle cette macro :

    Private Sub TextBox1_Change()
      Dim C As Range
      Me.ListBox1.Clear
      With Sheets("Feuil1")
        If Me.TextBox1.Value = "" Then
          For Each C In .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
            Me.ListBox1.AddItem C.Value
          Next C
        Else
          For Each C In .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
            If Left(C, Len(Me.TextBox1.Value)) = Me.TextBox1.Value Then
              Me.ListBox1.AddItem C.Value
            End If
          Next C
        End If
      End With
    End Sub
    

    Enregistre.

    La macro sélectionne les enregistrements dont le libellé commence par ce qui est saisi dans le textbox :

    Daniel


    0
    1. Merci beaucoup pour ta rapidité, cela semble si facile :)

      Cela fonctionne bien mais ce n'est pas tout à fait ce dont j'ai besoin. La première chaine de caractère (8364, 8365 etc... dans ton exemple) est justement l'information bien souvent inconnue que je souhaite mettre en avant

      Il faut donc que la recherche puisse se faire sur l'intégralité du contenu du résultat, que ce soit "cuve" ou "B58" par exemple. Et cerise sur le gâteau, avoir un résultat si l'on saisi juste "cuv", comme dans un nb.si(A2;*"cuv"*)

      De même, possible de clear la listbox une fois que la textbox est vidée?

      0
  4. Dans ce cas :

    Private Sub TextBox1_Change()
      Dim C As Range
      Me.ListBox1.Clear
      With Sheets("Feuil1")
        If Me.TextBox1.Value = "" Then
          For Each C In .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
            Me.ListBox1.AddItem C.Value
          Next C
        Else
          For Each C In .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
            If InStr(1, UCase(C.Value), UCase(Me.TextBox1.Value)) > 0 Then
              Me.ListBox1.AddItem C.Value
            End If
          Next C
        End If
      End With
    End Sub
    

    Daniel


    0
    1. Au top pour la recherche, il n'y a que la liste box qui ne se vide pas

      Il faudra que je teste au boulot sur Excel 2016 - là je suis sur 2019 car j'ai eu des erreurs d'exécution cet aprem en testant un if inStr, le débogage pointait sur cette ligne sans savoir si c'était bien l'instruction qui déconnait ou non...

      En tout cas merci pour ton aide, t'es une rockstar

      0
  5. C’est fait exprès quand la textbox est Vide, il n’y a aucune sélection puisqu’il n’y a aucun caractère dans la textbox. Je ferai la modification demain (C’est pas facile avec un téléphone).

    Daniel

    0
    1. Oui oui pas de souci, je testerai la modif lundi matin au boulot ????

      Bon weekend 

      0
  6. Bonjour à tous,

    Voici le code modifié avec des explications en commentaire. Il n'y a aucun souci avec InStr et 2016. J'ai utilisé Excel 2016 pendant sept ans sans aucun problème.

    'se déclenche quand le textbox est modifié
    Private Sub TextBox1_Change()
      Dim C As Range
      'vidage du listbox
      Me.ListBox1.Clear
      'tout ce qui commence par un "." se réfère à "Feuil1"
      With Sheets("Feuil1")
        'si le textbox n'est pas vide
        If Me.TextBox1.Value <> "" Then
          'pour chaque cellule de Feuil1 commençant à A2 jusqu'en bas
          For Each C In .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
            'si la cellule contient la valeur du textbox
            If InStr(1, UCase(C.Value), UCase(Me.TextBox1.Value)) > 0 Then
              'on ajoute la cellule dans le listbox
              Me.ListBox1.AddItem C.Value
            End If
          Next C
        End If
      End With
    End Sub
    

    Daniel


    0
    1. Hello,

      C'est magnifique, merci à toi aussi bien pour le code que pour les explications.

      Tu m'as motivé à me lancer dans l'apprentissage, j'ai souscrit sur Udemy :)

      Merci beaucoup

      0