Excel - Userform recherche de donnees

Résolu
salut à tous,

Une amie m'a donné un fichier Excel qui comporte un exemple de Userform de recherche de données dans une feuille.

Je tente désespérément d'adapter le code mais je n'y arrive pas, j'ai donc besoin de votre aide !!!

OUVREZ LE FICHIER POUR MIEUX COMPRENDRE LA SUITE...
http://www.cijoint.fr/cjlink.php?file=cj200906/cijNZe1r3x.xls

il y a 4 textbox, et je voudrais n'en garder qu'une qui recherche uniquement dans la colonne 7 (G).

En gardant le même système de liste en dessous.

Merci de votre aide je suis sur que c'est pas trop compliqué mais je ne comprends pas j'ai tout essayé cela ne fonctionne pas!

ANNA
Configuration: Windows XP
Firefox 3.5

19 réponses

  • Votes
  • Date
  • Date décroissante
  1. je ne connais pas ton nouveau classeur.

    voilà ce qu'il faut modifier....

    partie initialisation du userform
    seul le textbox1 sera visible.

    Private Sub UserForm_Initialize()
    With Sheets("base")
    Me.Label1.Caption = .Cells(1, 7).Value
    Me.Label2.Visible = False
    Me.Label3.Visible = False
    Me.Label4.Visible = False
    Me.TextBox2.Visible = False
    Me.TextBox3.Visible = False
    Me.TextBox4.Visible = False
    'Me.Label2.Caption = .Cells(1, 2).Value
    'Me.Label3.Caption = .Cells(1, 3).Value
    'Me.Label4.Caption = .Cells(1, 4).Value
    End With
    End Sub

    partie textbox

    Private Sub TextBox1_Change()
    'Call chercher(TextBox1.Value, 1) 'mis en commentaire
    Call chercher(TextBox1.Value, 7) ' pour rechercher sur la colonne 7

    End Sub

    partie procedure de recherche

    Public Sub chercher(rech, c) ' recherche d'une chaine
    Dim sel As Object
    Dim valide As Boolean
    Dim i As Integer
    Dim l As Long
    Dim n As Integer
    l = 2: n = 0
    recherche.ListBox1.Clear
    With Sheets("base")
    If rech = "" Then Exit Sub
    Do
    Set sel = .Cells.Find(What:=rech, After:=.Cells(l, c), _
    LookIn:=xlValues, LookAt:=xlPart, _
    SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext, MatchCase:=False)
    If sel Is Nothing Then Exit Do
    If sel.Column <> c Then Exit Do
    If sel.Row <= l Then Exit Do
    l = sel.Row
    valide = True

    'partie suivante mis en commentaire ************
    ' For i = 1 To 4
    ' If recherche.Controls("TextBox" & i).Value <> "" _
    ' And InStr(1, LCase(.Cells(l, i).Value), LCase(recherche.Controls("TextBox" & i).Value)) = 0 Then valide = False
    ' Next i

    'fin de section mis en commentaire ************
    'si le control est le textbox1 avec un vide on fait rien
    ' si la colnne est vide ( en G) on fait rien
    ' ce qui donne...
    If recherche.Controls("TextBox" & 1).Value <> "" _
    And InStr(1, LCase(.Cells(l, 7).Value), LCase(recherche.Controls("TextBox" & 1).Value)) = 0 Then valide = False

    'si le controle est ok on fait la concaténation des 4 colonne avec "&"
    If valide Then
    ' ici on met en forme la recherche les lignes avec .cells(l,2).value ecrivent les valeurs de la colonne B
    recherche.ListBox1.AddItem _
    (.Cells(l, 7).Value & " " & _
    .Cells(l, 2).Value & " " & _
    .Cells(l, 3).Value & " " & _
    .Cells(l, 4).Value)
    recherche.ListBox1.List(n, 2) = sel.Row
    n = n + 1
    End If
    Loop
    End With
    End Sub
    1. bonjour,
      j'ai fait le tour du programme rapidement
      il est clair.
      par contre ta demande ne l'est pas la colle G est vide.
      tu dis
      il y a 4 textbox, ( c'est vrai il font référence à ABCD nom prenon age profession) et je voudrais n'en garder qu'une ( moi je dirais rend les invisibles ou vérouille les à l'initialisation ) qui recherche uniquement dans la colonne 7 (G). ( qu'i ya -t-il dans cette colonne ? )

      et le quel il faut garder le nom le prénom l'age la profession?
      Explique ce que tu veux.
      1. Merci Bidouilleur,

        Effectivement j'ai oublié de préciser une info majeure : j'ai copié le Userform, et les codes associés dans un classeur personnel.

        J'ai bien entendu changé dans le code le nom de la feuille. Mais pour ce qui est du paramétrage de la recherche en tant que telle, j'ai plus de mal.

        J'espère être plus claire... :-)
        1. Merci de ta réponse Bidouilleur.

          Je vais essayer dans l'après midi et je te tiendrai au courant...

          Merci

          Anna
          1. Bidouilleur, forumeurs,

            le fait de modifier uniquement :

            Me.Label1.Caption = .Cells(1, 7).Value

            ... ne modifie que le Label du textbox (?)

            voici mon classeur pour le lequel j'essaie d'adapter le code du fichier transmis dans mon premier post.
            http://www.cijoint.fr/cjlink.php?file=cj200907/cijDvJRBtH.xlsm

            J'espère que qqun pourra m'aider c'est très important pour moi...

            A votre dispo pour pour plus d'infos biensur

            Merci Anna
            1. Anna ce qui me trouble c'est que dans ton fichier perso tu as plus d'un mot dans les cellules.. Alors que dans le fichier exemple ya q'un seul mot dans les cellules.. je vais tester ca m'interesse
              1. Yeeesss p*tain apparemment comme olive6 j'avais pas "déroulé" tout ton post!

                Un grand merci à toi Bidouilleur parce que la c'est pas de la bidouille c'est du grand art! et ca marche du tonnerre!

                Tu m'as même mis des explications dans le code, t'es un chef!

                MERCI MERCI MERCI
                1. Bon c'est re-moi...

                  J'avais pas pensé à un truc...

                  Tu penses que c'est possible d'avoir deux Textbox qui recherchent dans la même plage?

                  Du genre si je tappe dans la tb1 : mickael
                  dans la tb2 : Jackson

                  il me trouve la cellule dans la quelle se trouve les deux mots "Mickael" et "Jackson" dans un texte?

                  Merci si tu peux m'aider

                  ANNA
                  1. en fait ce n'est pas un bon exemple.

                    disons que je tappe dans

                    le tb1 : salade
                    le tb2 : bonne

                    j'aimerais qu'il trouve la cellule dans la quelle j'ai la phrase du genre : "ma salade verte est très bonne"

                    mais aussi la cellule "ma salade verte n'etait pas très bonne ce soir"

                    merci merci merci

                    Anna
                    1. bonjour ANNA, olive60,

                      je vais t'étonner....
                      Devine pourquoi je tai dit qu'il faut utiliser...
                      Me.Label2.Visible = False
                      Me.Label3.Visible = False
                      Me.Label4.Visible = False
                      à l'initialisation.....
                      Ben si! j'étais certain que cette demande viendrait par la suite...
                      mais je dois reconnaître que ta demande est particulière et intéressante et intelligente... et il faut que je me penche sur le problème.
                      La procédure actuelle lance une recherche sur changement du textbox et reset la listbox.
                      je regarde et je te dis...
                      A+
                      1. en fait je me dis que cela pourrait etre une solution :

                        le mot entré en tb 2 est recherché dans les resultats liés au mot du tb1...

                        il y aurait alors une "hierarchie" des mots clés entrés...

                        Je sais pas c'est une idée...
                        1. Bonjour ANNA,
                          Donc j'ai regardé et j'ai trouvé....mais .. il ya un mais :-(

                          Combien veux-tu de textbox ?

                          Au fait tu pourras féliciter celui qui t'as donné cette macro (c'est bien écrit... bien analysé... intelligent) donc
                          Félicitations.

                          Réponds à cette question et je te dis comment faire.
                          Autre chose je ne suis pas chez moi donc si tu veux que je t'envoie le fichier donne-moi une adresse mail en MP
                          sinon je le posterai en clair ici.

                          A+
                          R
                          1. coucou, bon je sais que tu m'as déjà bien aidée...

                            En utilisant ce beau code qui le simplifie vraiment la vie je me suis rendue compte que lorsque j'active un filtre sur une des colonne de mon tableau, la macro ne cherche plus correctement les valeurs entrées dans les textbox.

                            On dirait qu'elle s'arrete à la moitié du tableau.. Enfin elle ne va pas jusqu'au bout! Pourquoi donc???
                            (quand je tappe un mot par exemple qui se trouve dans 6 cellule ma colonne, et bien elle ne va en trouver que 3)

                            Merci... si tu as deux minutes à me consacrer ;-)
                            bonne journée
                            Anna
                            1. En fait pour être plus précise, on dirait que la recherche s'arrête dès lors que des lignes sont cachées par le filtre. Dès que la macro arrive sur un ligne cachée, la recherche semble s'arrêter...
                              1. c'est normal!

                                met ça au début

                                Public Sub chercher(rech, c) ' recherche d'une chaine
                                Dim sel As Object
                                Dim valide As Boolean
                                Dim i As Integer
                                Dim l As Long
                                Dim n As Integer
                                Dim x As Long
                                Dim returnValue As Boolean
                                l = 2: n = 0 ' l=2 on commence en ligne 2
                                recherche.ListBox1.Clear ' on efface à chaque passage
                                returnValue = Worksheets("FAQ_Q&A List").FilterMode
                                If returnValue Then
                                Selection.AutoFilter
                                End If
                                1. une petite explication quand même...

                                  quand tu utilises la méthode .Find et qu'il y a un filtre
                                  l'ensemble des cellules cachées ne sont pas "vues" tout comme avec CTRL + F (rechercher dans Excel)

                                  donc 2 solutions
                                  1 ) on retire le filtre manuelement
                                  2) on le fait en automatique.

                                  pour la méthode #2
                                  cela donne :

                                  Dim returnValue As Boolean
                                  l = 2: n = 0 ' l=2 on commence en ligne 2
                                  recherche.ListBox1.Clear ' on efface à chaque passage
                                  returnValue = Worksheets("FAQ_Q&A List").FilterMode
                                  If returnValue Then
                                  Selection.AutoFilter

                                  .....

                                  Bonne journée
                                  1. Merci beaucoup Bidouilleur pour ton aide (ici et par mail)! je ne m'y suis pas encore plongée mais je te tiendrai au courant bientôt...

                                    Merci encore c'est vraiment très gentil!

                                    Anna