Zone de recherche en vba

Résolu
gl0ugl0u Messages postés 41 Statut Membre -  
gl0ugl0u Messages postés 41 Statut Membre -

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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. danielc0 Messages postés 2181 Date d'inscription   Statut Membre Dernière intervention   287
     

    Bonjour,

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

    Daniel


    0
    1. gl0ugl0u Messages postés 41 Statut Membre
       

      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. via38 Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   24
     

    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. gl0ugl0u Messages postés 41 Statut Membre
       

      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. danielc0 Messages postés 2181 Date d'inscription   Statut Membre Dernière intervention   287
     

    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. gl0ugl0u Messages postés 41 Statut Membre
       

      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. danielc0 Messages postés 2181 Date d'inscription   Statut Membre Dernière intervention   287
     

    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. gl0ugl0u Messages postés 41 Statut Membre
       

      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. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Danielco
     

    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. gl0ugl0u Messages postés 41 Statut Membre
       

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

      Bon weekend 

      0
  7. danielc0 Messages postés 2181 Date d'inscription   Statut Membre Dernière intervention   287
     

    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. gl0ugl0u Messages postés 41 Statut Membre
       

      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