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 :

Recherche dans une listbox à partir d'un textbox ou optionbutton [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Points : 19
    Points
    19
    Par défaut Recherche dans une listbox à partir d'un textbox ou optionbutton
    Bonjour à tous,

    Après multiple recherche sur le forum et internet, je me tourne vers vous car je n'ai rien compris à ce que j'ai lu.

    Le sujet : j'ai une listbox qui est déterminée à partir d'une feuille Excel. Cette listbox me sert à insérer automatiquement toutes les données de ma feuille.
    Pour optimiser ma macro, je souhaiterai rechercher soit un mot, une partie du mot ou des chiffres qui sont écrit dans ma listbox afin de faire un tri. En effet au fur et à mesure, j'aurai des données en plus.

    J'ai réfléchi à deux options, mais d'abord une capture de mon userform :

    Nom : CaptureEXCEL.JPG
Affichages : 2679
Taille : 98,0 Ko

    Donc ma listbox remplit les labels en bleu sur le côté droit afin d'avoir une visualisation avant de valider puis le tout est écrit sur une feuille Excel autre que celle où les données sont inscrites.
    Pour créer ma recherche j'ai utilisé un textbox et un commandbutton (en dessous de la listbox) le tout se trouvant dans un Frame.

    Mon problème : j'hésite entre cette version ou deux optionbutton qui trierai par Trempe ou par Revenu.
    Mais je n'arrive pas à comprendre comment appliquer ces recherches, j'ai lu les FAQ du forum, certains sujets qui correspondaient à mon problème, mais le néant.
    J'ai testé, cela ne marche pas car je ne comprends pas tout.

    Demande : Pourriez-vous m'aiguiller ou m'expliquer comment faire. Je débute, j'ai conçu cela en m'aidant des sujets et en comprenant ce que je faisais. Je ne cherche pas une réponse toute faite.
    C'est la première fois que je m'attaque à cela donc j'ai l'envie et le besoin de comprendre.

    En vous remerciant.

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Keithingel, bonjour le forum,

    En pièce jointe un petit exemple de comment je procède dans ce genre se situation. Pas besoin du CommandButton, la recherche se fait à l'édition dans la TextBox1. Tu adapteras...

    Le 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
    23
    24
    25
    Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
     
    Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
    Dim O As Object 'déclare la variable O (Onglet)
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
    Dim I As Integer 'déclare la variable I (Incrément)
     
    Set O = Sheets("Feuil1") 'définit l'onglet O
    DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet O
    TC = O.Range("A1:C" & DL) 'définit le tableau de cellulles TC
    For I = 2 To UBound(TC, 1) 'boucle sur toutes les lignes du tableau TC (en partant de la seconde)
        Me.ListBox1.AddItem TC(I, 1) 'ajoute à la LisTbox1 la valeur du tableau TC en ligne I, colonne 1
    Next I 'pochaine ligne de la boucle
    End Sub
     
    Private Sub TextBox1_Change() 'au changement dans la TextBox1
    Me.ListBox1.Clear 'vide la ListBox1
    For I = 2 To UBound(TC, 1) 'boucle sur toutes les lignes du tableau TC (en partant de la seconde)
        'si le texte de la TextBox1 (en majuscule) est contenu dans la valeur du tableau TC en ligne I, colonne 1 (en majuscule),
        'ajoute la valeur duntableau TC ligne I, colonne 1 à la ListBox1
        If UCase(TC(I, 1)) Like "*" & UCase(Me.TextBox1.Value) & "*" Then Me.ListBox1.AddItem TC(I, 1)
    Next I 'prochaine ligne de la boucle
    End Sub
     
    'pour récupérer le nom : = TC(I,2), le traitement : = TC(I,3), le numéro de ligne : = I


    Fichiers attachés Fichiers attachés
    À plus,

    Thauthème

    Je suis Charlie

  3. #3
    Membre à l'essai
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Wahou c'est encore plus magique que tout ce que j'ai pu lire.
    J'ai essayé d'adapter à mon cas seulement la liste se répète 2 fois. Comment cela se fait ? Je ne trouve pas mon erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim O As Object 'déclare la variable O (Onglet)
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
    Dim I As Integer 'déclare la variable I (Incrément)
     
    Set O = Sheets("Données") 'définit l'onglet O
    DL = O.Cells(Application.Rows.Count, 13).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 13 (=M) de l'onglet O
    TC = O.Range("A1:M" & DL) 'définit le tableau de cellulles TC
    For I = 2 To UBound(TC, 1) 'boucle sur toutes les lignes du tableau TC (en partant de la seconde)
        Me.Listbox1.AddItem TC(I, 13) 'ajoute à la LisTbox1 la valeur du tableau TC en ligne I, colonne 13
    Next I 'pochaine ligne de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Me.Listbox1.Clear 'vide la ListBox1
    For I = 2 To UBound(TC, 1) 'boucle sur toutes les lignes du tableau TC (en partant de la seconde)
        'si le texte de la TextBox8 (en majuscule) est contenu dans la valeur du tableau TC en ligne I, colonne 13 (en majuscule),
        'ajoute la valeur duntableau TC ligne I, colonne 1 à la ListBox1
        If UCase(TC(I, 13)) Like "*" & UCase(Me.TextBox8.Value) & "*" Then Me.Listbox1.AddItem TC(I, 13)
    Next I 'prochaine ligne de la boucle
    De plus je n'ai qu'une colonne à lister, est-ce utile de marquer cette ligne ? J'essaye de comprendre le code, désolée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TC = O.Range("A1:M" & DL) 'définit le tableau de cellulles TC
    Mise à part que la liste se répète deux fois sans le comprendre. C'est Nickel Chrome.

    Je te remercie d'avoir pris du temps.

  4. #4
    Membre à l'essai
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    J'ai trouvé ce qui me générait un doublon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Listbox1.AddItem TC(I, 13) 'ajoute à la LisTbox1 la valeur du tableau TC en ligne I, colonne 13
    En fait que comptais-tu faire avec cette régénération de ligne ?

    En te remerciant, sujet résolu quand j'aurai une réponse.

  5. #5
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour keithingel, bonjour le forum,

    Je ne comprends pas ton problème car tu dis que tu as la liste en double mais tu ne dis pas quand. À l'ouverture de l'Userform ou quand tu édites ta TextBox8 de la recherche ?
    La ligne dont tu parles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Listbox1.AddItem TC(I, 13) 'ajoute à la LisTbox1 la valeur du tableau TC en ligne I, colonne 13
    permet d'avoir la ListBox1 complète a l'ouverture de l'UserForm.

    Ensuite, quand tu édites la TextBox8, la première ligne du code de la procédure Change est justement d'effacer la Listbox1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ListBox1.Clear 'vide la ListBox1
    pour ensuite n'ajouter que les données correspondantes à la TextBox8.

    Donc, tu ne devrais pas avoir de liste en double mais sans un fichier exemple je ne peux pas t'en dire davantage.
    À plus,

    Thauthème

    Je suis Charlie

  6. #6
    Membre à l'essai
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    Ensuite, quand tu édites la TextBox8, la première ligne du code de la procédure Change est justement d'effacer la Listbox1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ListBox1.Clear 'vide la ListBox1
    Oui cette ligne je l'avais comprise.
    En fait c'est à l'ouverture de l'userform. Peut-être que cela crée un doublon car je demande déjà à ma listbox de charger.
    Je te montre le classeur concerné avec de fausses données mais une mise en page non réglée encore. C'est juste pour que tu regardes le code et pour information. J'ai résolu le problème en enlevant la ligne citée dans le post précédant (additem).

    Si on écrit deux fois la même chose il ne peut y avoir qu'un doublon. Cela venait de mon code précédemment écrit, je pense.

    En tout cas un grand merci et si tu pouvais me confirmer qu'il y a bien eu un doublon de code qui demande à listbox de charger.
    Je pense l'avoir trouvé mais je ne suis pas sûre.

    Cordialement

    TEST.xlsm

  7. #7
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir Keithingel, bonsoir le forum,

    Je ne peux malheureusement rien te confirmer car quand j'ouvre ton fichier jai les lignes ci-dessous en rouge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Declare Function GetWindowLongA Lib "user32" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
     
     Declare Function SetWindowLongA Lib "user32" _
    (ByVal hwnd As Long, ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long
     
     Declare Function FindWindowA Lib "user32" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    et le message suivant : Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur des systèmes 64 bits. Vérifier et mettez à jours les instructions Declare, puis marquez-les avec l'attributs PtrSafe.
    Je t'avoue que quand d'entrée on me parle de manière si grossière je n'apprécie pas !...

    Plus sérieusement, les lignes de code du module OterCroix dépassent largement mes compétences. Ne pouvant pas les tester, je ne sais donc pas si elles chargent la ListBox1 de l'UserForm Boite_saisie. Désolé...
    Il faudrait qu'un vrai balèze qui traîne dans ce site (il y en a plein !) vienne mettre son nez dans ton fichier pour te donner une réponse valable.
    À plus,

    Thauthème

    Je suis Charlie

  8. #8
    Membre à l'essai
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Mon code se trouve dans Boite_Saisie.
    OterCroix sert juste à enlever la croix de l'userform, pour qu'elle disparaisse. Rien à voir je pense et j'espère.

    Ce n'est pas grave ta partie de code fonctionne en enlevant la dernière ligne, je voulais juste comprendre pourquoi. Cela fonctionne très bien. Je te remercie pour ton aide.

    Je résouds ce sujet. Un grand merci.

    Cordialement.

  9. #9
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour keithingel, bonjour le forum,

    Oui tu as raison pourquoi me suis-je borné à ce message d'erreur ?... J'ai donc regardé ton code d'initialisation de l'UserForm et tu avais déjà ces lignes qui alimentent la ListBox1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Lig01 = 2
    Do While class.Cells(Lig01, 13) <> ""
        Listbox1.AddItem class.Cells(Lig01, 13).Value
        Lig01 = Lig01 + 1
    Loop
    Évidemment, avec ma boucle en plus ça faisait la liste en double...
    À plus,

    Thauthème

    Je suis Charlie

  10. #10
    Membre à l'essai
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    C'est ce qu'il me semblait que For ... next était la même boucle que Do While ... Loop.

    Encore merci d'être revenu pour m'expliquer et me confirmer ce que je pensais.

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

Discussions similaires

  1. résultat de recherche dans une listbox à partir d'une combobox
    Par m1cfv dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/04/2014, 18h03
  2. Auto recherche dans une listbox
    Par pseudo88 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/05/2010, 22h33
  3. [VB6]Ecriture dans une ListBox à partir d'une FileListBox
    Par Joffrey91 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/04/2009, 20h51
  4. Comment effectuer une recherche dans une listBox?
    Par Mickey.jet dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 19/05/2006, 16h15
  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