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 :

Filtrer une listbox sur base de mots saisis dans un textbox [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Par défaut Filtrer une listbox sur base de mots saisis dans un textbox
    Bonjour

    L’intitulé est incompréhensible je dirai, désolé, je vais tenter de m'expliquer plus clairement.

    Voila, j'ai besoin, pour mon travail, de créer un petit outil pour rechercher une référence (à laide d'un mot clef) dans
    une liste de plusieurs millier de lignes.
    J'ai trouvé cette macro ici même ,qui fait plus ou moins le travail, et me donne les résultats de ma recherche dans une listbox.
    Mon soucis, est qu'il me donne toutes les lignes ou apparait le mot dans l'ensemble de la chaine de caractère.
    Par exemple, si je cherche "Lan" tout simplement , la macro ne fera pas la différence avec "Lancer" ou encore "Lana" .
    Au début, la macro était associé à l'Event "change" de ma textbox, mais j'ai essayé de le déclencher avec "Enter" pour ainsi avoir le mot
    souhaité avant de lancer la recherche, mais rien n'y fait
    J'ai essayé par la suite d'associer des espaces avant et après la valeur de la textbox, mais là aussi, rien.

    Auriez vous une piste à me proposer svp, je suis dans une impasse là.

    Merci infiniment pour le temps que vous voulez bien m'accorder

    Voici la macro de base avec laquelle je travaille:

    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
    If keycode <> 13 Then Exit Sub
     
    If Me.TextBox1 <> "" Then
         '---
         Set d = CreateObject("scripting.dictionary")
         mots = Split(Trim(Me.TextBox1), ",")
         For Each m In mots
           mots2 = Split(Trim(m), " ")
           Tbl = choix
           For i = LBound(mots2) To UBound(mots2)
             Tbl = Filter(Tbl, mots2(i), True, vbTextCompare)
           Next i
           For i = LBound(Tbl) To UBound(Tbl): d(Tbl(i)) = "": Next i
         Next m
         Tbl = d.keys
         '----
         n = UBound(Tbl) + 1
         If n > 0 Then
           ReDim Tbl2(LBound(Tbl) To n + 1, 1 To NbCol)
           For j = LBound(Tbl) To UBound(Tbl)
             a = Split(Tbl(j), "|")
             For k = 0 To NbCol - 1: Tbl2(j, k + 1) = a(k): Next k
           Next j
           Me.ListBox1.List = Tbl2
          Else
           Me.ListBox1.Clear
          End If
        Else
          Me.ListBox1.List = TblBD
        End If

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 122
    Par défaut
    Bonjour NulenExcel77

    Merci de fournir toute la procédure et ces sous-procédures, de déclarer les variables (avec une ligne "Option explicit" en tête de module), de fournir un jeu de test (les milliers de lignes en fichier joint) sinon ce sera difficile de t'aider.

    Un textbox c'est un objet d'un formulaire issu d'un objet range Excel?
    Comment ce textbox est t'il initialisé?
    Y aura t'il une boucle avec plusieurs textbox?

    Fraflt69

  3. #3
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Par défaut
    Bonjour fraflt69,

    Merci de répondre aussi vite je m'y attendais pas
    Je suis aller trop vite semble t'il, lol
    Je reformulerai ma demande ce soir avec les éléments que tu me demande

    Merci encore et à plus tard.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Au passage, le choix de la virgule comme séparateur dans la zone de saisie des mots recherchés et assez moyen puisque certaines descriptions contiennent une virgule. Celui qui va chercher 0,1% va en fait chercher les lignes qui contiennent le "mot" 0 et le "mot" 1%

    J'dis ça, j'dis rien...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Au passage, le choix de la virgule comme séparateur dans la zone de saisie des mots recherchés et assez moyen puisque certaines descriptions contiennent une virgule. Celui qui va chercher 0,1% va en fait chercher les lignes qui contiennent le "mot" 0 et le "mot" 1%
    J'dis ça, j'dis rien...
    Effectivement un ; serait plus judicieux

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je ne pense pas qu'il soit utile de fournir tout le code pour cela

    Normalement, on s'appuie sur un tableau structuré, nommé dans mon exemple Tableau2.

    Un simple Application.Match, l'équivalent d'un EQUIV en Excel, permet de rechercher la ligne de l'intitulé saisi dans le textbox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub CommandButton1_Click()
      Dim Index
     
      Index = Application.Match(TextBox1.Value, Range("tableau2[Intitulé]"), 0)
      If Not IsError(Index) Then
        MsgBox "La ligne du tableau est la ligne " & Index
      Else
        MsgBox "L'intitulé n'a pas été trouvé"
      End If
    End Sub
    Nom : 2021-10-14_115719.png
Affichages : 829
Taille : 17,6 Ko


    A adapter à ton besoin.

    A adopter: les tableaux structurés qui vont grandement simplifier ton approche du code.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Par défaut
    Bonsoir,

    Désolé pour cette réponse tardive, j'ai cherché de mon coté, sans y arriver
    Merci Pierre Fauconnier de te pencher sur mon problème.
    J'ai essayé d'utiliser ta méthode, d'adapter mon code avec mais rien n'y fait
    je mérite mon pseudo je crois.

    En l'état, mon fichier marche très bien, j'aimerai pouvoir garder cette base.
    le seul problème est qu'il recherche la valeur du textbox mème dans les mot plus long.
    Je souhaiterai qu'il regarde seulement le mot dans son entier.

    Étape par étape, j'ouvre l'USF, la listbox est rempli avec les données que j'ai délimité sur ma feuille XL (tableau2)
    je veux filtrer le tout grâce à ma textbox1, un espace pour peaufiner la recherche et valider avec "enter"
    je vous joint un fichier, ce sera plus simple, les explications et moi ça fait 15 :/
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    hello,
    c'est normal qu'avec le code que tu utilises, tu aies ce comportement, et d'ailleurs dans l'étiquette du champ de recherche c'est écrit :
    Entrer des mots séparés par un espace et , pour un OU
    Il faut enlever la partie qui éclate les mots séparés par des espaces comme ceci par exemple :
    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
    Private Sub TextBox1_keydown(ByVal keycode As MSForms.ReturnInteger, ByVal shift As Integer)
    Dim Tbl, Tbl2, m, mots, a
    Dim n, k As Integer
    Dim d As Object
    If keycode <> 13 Then Exit Sub
    If Me.TextBox1 <> "" Then
         '---
         Set d = CreateObject("scripting.dictionary")
         mots = Split(Trim(Me.TextBox1), ",")
         For Each m In mots
           Tbl = choix
           Tbl = Filter(Tbl, m, True, vbTextCompare)
           For Each res In Tbl: d(res) = "": Next
         Next m
         Tbl = d.keys
         '----
         n = UBound(Tbl) + 1
         If n > 0 Then
           ReDim Tbl2(LBound(Tbl) To n + 1, 1 To NbCol)
           For j = LBound(Tbl) To UBound(Tbl)
             a = Split(Tbl(j), "|")
             For k = 0 To NbCol - 1: Tbl2(j, k + 1) = a(k): Next k
           Next j
           Me.ListBox1.List = Tbl2
          Else
           Me.ListBox1.Clear
          End If
        Else
          Me.ListBox1.List = TblBD
        End If
    End Sub
    et puis changer les libellés avec :
    1 - Recherche référence grâce à plusieurs expressions
    2 - Entrez des expressions séparées par des ,

    Ami calmant, J.P

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    JP,

    Je vais investiguer sur ce truc. 78Chris avait déjà soulevé ce problème dans une discussion mais je n'ai pas remis la main dessus. J'en ferai un billet de blog ou une contribution (pourquoi pas collective...?). Il est certain que ces différences de version (à but purement commercial) ne nous aident pas pour les solutions que nous tentons d'apporter sur le forum, et il est malaisé de maintenir des VM avec des versions différentes (de 2007 à 365 en passant par 2019 et bientôt 2021) pour tester une solution avant de la proposer sur le forum, puisque apparemment "quand on ne sait pas donc on doit laisser dire ceux qui savent"...



    Comme dit plus haut, ici, je passe. J'en ai plus que marre des mecs tels que NulEnExcel77 qui ne sont pas capables d'évoluer (en 9 ans!!) et qui sont toujours aussi grossiers avec les gens qui leur viennent en aide. Je n'ai vraiment pas envie de perdre du temps avec eux. D'autres personnes posent des questions sur le forum et sont aimables avec les gens qui leur répondent. Perso, je préfère leur répondre à eux que de jeter des perles aux pourceaux qui n'en valent pas la peine.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Par défaut
    Bonsoir à tous,


    Bon le pierrot, il serait temps de tirer la chasse non? tes petites attaques à 2 sous, ça va un moment, faut grandir un peu prof.

    Je n'ai fait que critiquer ta pédagogie et ta façon d'imposer un moyen de faire sans comprendre la demande à la base.

    Et quand on te suis pas, on est de la m.......

    En plus, monsieur est plutôt rancunier je vois, un message un pic, t'as tout pour plaire, bonjour les complexes.

    Bah ouais, en 9 ans je n’ai pas évolué en vba ni sur les bases d'excel, je sais pas ce que je vais faire de moi

    Toi ça fait des années, et tu sais pas expliqué les choses à un débutant, ya qu'avec toi que ça bloque.

    Tu ne connais rien de ma vie ou de mon travail, je ne suis pas formateur comme toi, Excel est un outil et pas un métier à part entière.

    Je n'ai parlé que de ta solution et ta façon d'expliquer, je n'ai pas toucher au bonhomme derrière, alors je te prierai d'en faire autant.

    Et c'est surtout un peu trop facile non ?? devant son petit écran, on est tellement courageux.

    Il n'y a pas eu d'insultes de ma part ( ou alors dans ta tête ), à part quelques pics ici (je rends ce que je reçois ) , tes sous entendus

    en revanche, c'était autre chose.

    Déconnecte un peu, il y a autre chose derrière ces grilles.


    De mon coté, pour ceux que ça intéresse j'ai recommencé de la base comme Pierrot l'avait suggéré (pardon, imposé) mais je l'ai plus

    vite assimilé ( parce que mieux expliqué on va dire) le tout commandé par USF bien sur.

    Un des problèmes apparus en cours de route, à savoir trouver/filtrer "1k" et non "1k5" ainsi que 1% et non 0,1%, il suffisait d'assurer

    le critère sous cette forme :

    *1k * pour les valeurs et * 1%* pour les tolérances , chez moi ça a suffit, ça marche.

    Et une simple macro pour afficher les données filtrées dans une listbox.


    Voilà, merci à ceux qui ont bien voulu humblement m'aider et cela sans préjugé.

    Dsl aussi pour cette foire, cette querelle de cours d'école, mais face à autant d'ego en quelques phrases...... j'ai craqué

    Le pourceau d'XL vous salue, bonne nuit

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par NulenExcel77 Voir le message
    [...]Quand on sait pas, on dit "je sais pas" et on laisse répondre ceux qui peuvent aider.[...]
    Citation Envoyé par NulenExcel77 Voir le message
    [...]
    Je pense avoir fait montre d'une certaine patience quant à ta façon plutôt hautaine de répondre à mes demandes, la plupart des gens qui comptent sur vous n'ont pas forcement le langage Excel ( mon pseudo était bien trouvé je trouve).
    Pédagogie, ça je sais l'écrire et en plus je comprend la signification de ce mot,
    et toi ??

    Je t'ai accordé des points alors que tu ne m'a rien appris, je ne referai plus cette erreur .


    Cordialement

    ps: ne prend pas la peine de me répondre, je ne te relierai pas.
    Manifestement, 9 ans après ton message insolent à l'intention d'AlainTech qui avait pourtant fait preuve de patience, à part le terme pédagogie pour dénigrer ceux qui t'aident, tu n'as toujours rien appris, ni en Excel, ni en politesse, ni sur le fonctionnement d'un forum d'entraide.

    Perso, je passe. Les mecs de ton espèce, j'en ai par dessus la tête!
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je n'avais manifestement pas compris la demande... Désolé
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 122
    Par défaut
    Bonjour à tous

    je me suis lancé dans un filtrage spécifique , à tester
    Mon code pour le USF_Recherche

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
     
    Option Compare Text
    Dim TblBD(), choix(), NomTableau, NbCol
     
     
     
    Private Sub TextBox1_keydown(ByVal keycode As MSForms.ReturnInteger, ByVal shift As Integer)
    If keycode <> 13 Then Exit Sub
     
    If Me.TextBox1 <> "" Then
         '---
         Set d = CreateObject("scripting.dictionary")
         mots = Split(Trim(Me.TextBox1), ",")
         For Each m In mots
           mots2 = Split(Trim(m), " ")
     
           Tbl = choix
           For i = LBound(mots2) To UBound(mots2)
             Tbl = Filter(Tbl, mots2(i), True, vbTextCompare)
           Next i
           For i = LBound(Tbl) To UBound(Tbl): d(Tbl(i)) = "": Next i
         Next m
         Tbl = d.keys
         '----
         n = UBound(Tbl) + 1
         If n > 0 Then
           ReDim TblInclude(NbCol)
           ReDim Tbl2(LBound(Tbl) To n + 1, 1 To NbCol)
           For j = LBound(Tbl) To UBound(Tbl)
             a = Split(Tbl(j), "|")
             For k = 0 To NbCol - 1
              Tbl2(j, k + 1) = a(k)
              If k = 2 And a(k) <> "" Then
                pos = InStr(1, a(k), TextBox1.Text)
                If InStr(1, a(k), TextBox1.Text & " ") Or InStr(1, a(k), TextBox1.Text & ",") Or (InStr(1, a(k), TextBox1.Text) And pos + Len(TextBox1.Text) = Len(a(k))) Then
                   TblInclude(j) = 1
                   nInclude = nInclude + 1
                End If
              End If
            Next k
           Next j
           Dim Tbl3
           indTab3 = 0
           ReDim Tbl3(LBound(Tbl) To nInclude, 1 To NbCol)
           For j = LBound(Tbl) To UBound(Tbl)
             a = Split(Tbl(j), "|")
             For k = 0 To NbCol - 1
                If TblInclude(j) = 1 Then
                    Tbl3(indTab3, k + 1) = a(k)
                End If
                If k = NbCol - 1 And TblInclude(j) = 1 Then
                  indTab3 = indTab3 + 1
                End If
            Next
           Next
     
           Me.ListBox1.List = Tbl3
          Else
           Me.ListBox1.Clear
          End If
        Else
          Me.ListBox1.List = TblBD
        End If
    End Sub
     
     
     
    Private Sub UserForm_Initialize()
     
      NomTableau = "tableau3"
      TblBD = Range(NomTableau).Value
      ReDim choix(1 To UBound(TblBD))
      For i = LBound(TblBD) To UBound(TblBD)
         NbCol = Range(NomTableau).Columns.Count
         For k = 1 To NbCol: choix(i) = choix(i) & TblBD(i, k) & "|": Next k
      Next i
      Me.ListBox1.List = TblBD
      'TblBD.Columns.AutoFit
      EnteteListBox
    End Sub
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    '###################### En cours de travaux #########################################
     
     
    Sub EnteteListBox()
    'Exit Sub
      NbCol = Range(NomTableau).Columns.Count
      x = Me.ListBox1.Left + 8
      Y = Me.ListBox1.Top - 12
      For i = 1 To NbCol
        Set Lab = Me.Controls.Add("Forms.Label.1")
     
        If i = 1 Then
        Lab.Caption = "Part number :"
        End If
        If i = 2 Then
        Lab.Caption = ""
     
        End If
        If i = 3 Then
        Lab.Caption = "Déscription :"
        'Lab.Left = x
        x = x + 5
        End If
     
        If i = 5 Then
        Lab.Caption = "Référence :"
        x = x - 285
        End If
     
        If i = 6 Then
        Lab.Caption = "Fabriquant :"
        x = x + 3
     
        End If
     
     
        Lab.Top = Y
        Lab.Left = x
        x = x + Range(NomTableau).Columns(i).Width * 0.9
        temp = temp & Range(NomTableau).Columns(i).Width * 0.9 & ";"
     
      Next
      Me.ListBox1.ColumnCount = NbCol
      temp = Left(temp, Len(temp) - 1)
      Me.ListBox1.ColumnWidths = temp
     
      USF_Recherche.ListBox1.ColumnWidths = "80;0;290;0;0;110;0;80"
     
     
    End Sub
    Fichiers attachés Fichiers attachés

  14. #14
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Par défaut
    Bonjour,

    Merci jurassic pork de t’être penché la dessus , j'ai intégré ta macro, le filtre se fait bien avec le premier mot
    mais avec le second ou un troisième, il reste inchangé ( j'ai bien assuré une séparation avec une ","
    ils ne sont pas pris en compte

    J'ai regardé vite fait, j'y regarderai de plus prés après le taff
    Merci encore pour les efforts.

    Merci Pierre Fauconnier, non tkt, c'est moi aussi avec mes explications par contre, je vais m’intéresser un peu aux tableaux
    structurés pour un autre projet

    Super, j'ai vu ton message avant de partir, je teste ça ce soir, merci fraflt69

    Bonne journée

  15. #15
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    hello
    Citation Envoyé par NulenExcel77 Voir le message
    Bonjour,
    Merci jurassic pork de t’être penché la dessus , j'ai intégré ta macro, le filtre se fait bien avec le premier mot
    mais avec le second ou un troisième, il reste inchangé ( j'ai bien assuré une séparation avec une ","
    ils ne sont pas pris en compte
    c'est bizarre parce que chez moi avec une recherche du style :
    SMD 1206,SMD 0805
    j'obtiens bien deux résultats. Il ne faut pas mettre d'espaces autour de la virgule.
    Sinon essaie la solution à Pierre, cela doit être plus fiable.
    Ami calmant, J.P

  16. #16
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Par défaut
    Bonsoir les pros,

    Désolé jurassic pork, quand ça veut pas , j'ai bien assuré aucuns espaces autour de la virgule, mais rien.
    Est ce que le fait de sauvegarder le fichier en mode "Classeur prenant en charge les macros" est un problème pour la bonne marche du USF??
    Je ne sais plus quoi tenter

    Pierre, j’avoue n'avoir rien compris à ton fichier :/, ça n'a pas marché chez moi, peu importe le ou les mots du textbox, tout s'efface dans la listbox, ne reste
    que l’entête de mon tableau.
    Par contre, le truc de passer par XL et ses outils m'interpelle, j'ai survolé tes tutos, et il y a une vérité qui me parle dans ce que j'ai
    retenu, tu peux avoir une macro réglé au poil, si ton fichier évolue (ligne/colonne supprimé ou ajouté etc...) bah la macro/l'outil plante.

    Avec ton fichier fraflt69, je dirai 99% de ma demande est assuré sauf (bizarrement) avec la recherche "0603", ça plante (et j'ai pas testé avec mes
    10000 lignes de données, donc potentiellement, j'ai le doute pour d'autres mot clef
    Et il y a aussi, lorsque je met dans le désordre les mots clefs, il ne trouve pas la ligne pourtant existante (499k 0603 il trouve pas alors que 0603 499k, il trouve)
    C'est peut être 3x rien, le résultat est presque là

    Je continuerai à bidouiller vos codes et idées en attendant

    Encore merci pour vos efforts

    Bonne soirée

  17. #17
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 122
    Par défaut
    Pardon NulenExcel77

    Je crois avoir vu mon erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Il faut changer
         If n > 0 Then
           ReDim TblInclude(NbCol)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         If n > 0 Then
           ReDim TblInclude(UBound(Tbl))

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    [EDIT] Mis à jour [/EDIT]

    Je propose une manière de travailler avec des filtres avancés pilotés en VBA. Ca évite le dictionary, qui n'est pas du VBA pur, et ça évite de coder les critères en dur, ce qui n'est pas forcément simple pour un non programmeur. Ca correspond mieux à mon avis à une démarche Excel, le dictionary et l'expression de critères en VBA étant plus des techniques de "programmeur" que d'utilisateur Excel (vu ton pseudo, en plus, comme tu le dis toi-même ).

    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
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode = 13 Then AdaptListBox
    End Sub
     
    Sub AdaptListBox()
      Dim Words
      Dim i As Long
     
      If Not Range("t_Mots").ListObject.DataBodyRange Is Nothing Then Range("t_Mots").ListObject.DataBodyRange.Delete
      Words = Split(TextBox1.Value, ",")
      If UBound(Words) <> -1 Then
        For i = 0 To UBound(Words)
          Range("t_mots")(i + 1).Value = Words(i)
        Next
      End If
      Feuil1.Range("m1:T" & Feuil1.Range("m1048576").End(xlUp).Row).AdvancedFilter xlFilterCopy, Range("Critère"), Range("résultat")
      ListBox1.List = Feuil5.Range("e2:l" & Feuil5.Range("e1048576").End(xlUp).Row).Value
    End Sub
    Dans une feuille annexe, on crée la conception du filtre:
    • un tableau pour récupérer les mots choisis;
    • une zone de critères formulés pour extraire les données;
    • une zone de résultats.



    J'ai adapté la listbox car c'était un peu foireux sur le nombre de colonnes...

    Je répète que normalement, on devrait travailler sur des tableaux structurés, qui grandiront avec l'ajout de données, a contrario de la plage nommée "Tableau3" actuelle. Ca simplifie le code et la maintenance, en évitant notamment le hardcoding de la position des données et les End(xlUP) Idéalement, on nommerait également les feuilles en VBA...

    Rappel de ma signature: Quand on programme en VBA pour Excel, on pense Excel avant de penser VBA ;)

    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  19. #19
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    hello,
    Citation Envoyé par NulenExcel77 Voir le message
    Voila, j'ai besoin, pour mon travail, de créer un petit outil pour rechercher une référence (à laide d'un mot clef) dans
    une liste de plusieurs millier de lignes.
    Finalement je crois bien que tu te compliques la vie car avec un filtre personnalisé tu fais la même chose qu'avec ta fenêtre et ta macro.
    1 - Sélectionner la zone à filtrer en incluant la ligne d'entête
    2 - Cliquer sur l'onglet Données et cliquer sur Filtrer. Des boutons flèches vers le bas apparaissent sur la ligne d'entête. Cliquer sur le bouton de la colonne qui servira à filtrer.
    3 - Pour un filtrage simple , mettre dans la barre de recherche le terme à rechercher.
    4 - Pour un filtrage plus compliqué, cliquer sur Filtre Textuel/Filtre personnalisé. Remplir alors la fenêtre avec la combinaison des termes à chercher.
    5 - Pour enlever le filtre cliquer à nouveau sur Filtrer.
    Cela n'altère pas les données c'est seulement un filtre.

    Exemple :

    Nom : FiltreExcel.gif
Affichages : 784
Taille : 159,4 Ko

    Ami calmant, J.P

  20. #20
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Par défaut
    Bonsoir à tous,

    Merci jurassik pork, mais ce n'était pas ma demande, ta macro en était très proche.
    D’ailleurs je suis toujours penché dessus afin de trouver et comprendre ou ça pèche :/
    Le petit outil, sera diffusé à plusieurs services, et il m'est impossible de leur donner accès aux données.
    Désolé si ma demande manquait de précision

    Il a été décidé de bricoler un outil en interne en lecture seul comme avec un USF et listbox.Une seule personne
    est habilitée à créer notre banque de données.
    Le classeur sera protégé, l'USF s'ouvrira automatiquement et l’accès à la feuille en arrière plan sera verrouillé
    (ou simplement minimisé sur la barre de tache, c'est encore à voir ) et pour finir un double clic copiera la valeur
    trouvé pour des actions ultérieurs.

    Voila grosso modo son utilité en attendant l'achat d'un vrai ERP et le bon module

    encore merci à vous

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/06/2014, 00h47
  2. Filtrer une Listbox en fonction d'informations saisies par l'utilisateur
    Par navorinco dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/05/2009, 17h30
  3. Comment remplir une ListBox sur Delphi 5
    Par bleuprogrammeur dans le forum Delphi
    Réponses: 3
    Dernier message: 10/06/2007, 21h06
  4. Remplir listbox sur base d'une autre listbox
    Par jujujulien dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/05/2007, 08h46
  5. Récupérer le nom d'une db sur base de la connexion.
    Par Empty_body dans le forum JDBC
    Réponses: 2
    Dernier message: 06/04/2007, 14h00

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