Recherche multiple dans une boucle

Bonjour,

je reviens vers vos lumières car j'ai du mal à formuler un code.

Voici ma problématique.

Je souhaiterais savoir comment demander à mon userform de faire la recherche et l'action suivante:

Rechercher l'une des valeurs affichées dans la listbox1 dans une plage definie (B6:B100) et, si la valeur est trouvée, afficher le contenu de la listbox3 (il s'agit de la totalité de la plage "B6:B100", j'utilise la fonction RowSource).

Voici le début de mon code, mais je bloque (je débute en vba et j'ai essayé d'adapter un code précédent...):

Dim Cel As Range, Depart As String
Dim ligne As Integer, i As Integer
Set F = Sheets("Recherche")
    With F
        Set Cel = F.Rows("B6:B100").Find(what:=Me.ListBox1.List.Value, LookIn:=xlValues, lookat:=xlWhole)
                If Not Cel Is Nothing Then
                Depart = Cel.Address
                Do
                If Me.ListBox1.List(Me.ListBox1.ListCount - 1, 0) = ("B6:B100") Then
                ListBox3Visible = True
           End If

              Set Cel = F.Rows("B6:B100").FindNext(Cel)
        Loop While Depart <> Cel.Address

Merci de votre aide

Bonjour

Inutile de poster deux fois le même sujet.

Ce serait mieux de voir le fichier. Possible ??

Cordialement

re bonjour,

désolé pour le double post, j'ai du rafraichir la mauvaise page...

En cherchant, je me suis aperçu que ma problématique était la mauvaise.

Je m'explique:

J'ai, dans mon fichier, le code suivant qui fonctionne très bien (merci le forum):

Set F = Sheets("base")
    With F
      Set Cel = F.Rows("25:" & Rows.Count).Find(what:=Me.Tbrecherche, LookIn:=xlValues, lookat:=xlWhole)
      If Not Cel Is Nothing Then
        Depart = Cel.Address
        Do
          If UCase(Left(Cel, Len(Me.Tbrecherche))) = UCase(Me.Tbrecherche) Then
          Me.ListBox1.AddItem Cel
          Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = F.Cells(24, Cel.Column)
          End If
          Set Cel = F.Rows("25:" & Rows.Count).FindNext(Cel)
        Loop While Depart <> Cel.Address

      End If
    End With

Je souhaite adapter ce code en remplaçant la donnée recherchée (Me.Tbrecherche, (contenu ma textbox)) par le contenu de la plage B6:B100, qui appartient à une feuille différente.

Au lieu de porter sur un seul item, la recherche porterait sur plusieurs.

Voici ce que ça devrait (dans mon imagination) donner:

Set F = Sheets("base")
    With F
      Set Cel = F.Rows("25:" & Rows.Count).Find(what:= plage B6:B100 de la feuille Base2 LookIn:=xlValues, lookat:=xlWhole)
      If Not Cel Is Nothing Then
        Depart = Cel.Address
        Do
          If UCase(Left(Cel, Len(plage B6:B100 de la feuille Base2)))= UCase (plage B6:B100 de la feuille Base2) Then
         ListBox3.Visible = True
          End If
          Set Cel = F.Rows("25:" & Rows.Count).FindNext(Cel)
        Loop While Depart <> Cel.Address

      End If
    End With

Mon probleme est que je ne sais pas comment désigner la plage en question...

Concernant l'envoi du fichier, il faudrait que je le modifie beaucoup pour pouvoir le poster... Donc si je peux faire sans, je gagnerai du temps.

Merci de votre compréhension.

re

Avec un début de code comme ceci peut être

With sheets("BASE")
For i = 6 To 100
    Set Cel = F.Rows("25:" & Rows.Count).Find(Range("B" & i).Value, LookIn:=xlValues, lookat:=xlWhole)
...
Next
End with

Cordialement

Bonjour

désolé du temps de réponse et merci pour le début de code.

Le voici (et il fonctionne)

  Set G = Sheets("base3")

       For i = 6 To 60
         Set Cel = F.Rows("25:" & Rows.Count).Find(G.Range("B" & i).Value, LookIn:=xlValues, lookat:=xlWhole)
            If Not Cel Is Nothing Then
              Depart = Cel.Address
          Do
          If UCase(Left(Cel, Len(G.Range("B" & i).Value))) = UCase(G.Range("B" & i).Value) Then
          Me.ListBox3.AddItem Cel
          Me.ListBox3.List(Me.ListBox3.ListCount - 1, 1) = F.Cells(24, Cel.Column)

          End If

          Loop While Depart <> Cel.Address

Après l'avoir éprouvé, une nouvelle problématique m'est apparue.

La plage sur laquelle boucle la recherche (B6:B60) de la feuille base3 est une plage alimentée de façon variable par une autre formule. Il peut y avoir de 5 à 60 cellules remplies. Lorsque la recherche est faite et que la listbox3 est alimentée, elle l'est également par les cellules vide, ce qui me pose problème.

Est il possible de définir i comme une plage variable, qui aurait pour conséquence de limiter la recherche aux valeurs des cellules non vides?

Merci d'avance, je touche à mon but

Re

Pas facile de vérifier sans voir le fichier...

Dans cette ligne peut être en la modifiant :

If UCase(Left(Cel, Len(G.Range("B" & i).Value))) = UCase(G.Range("B" & i).Value) Then

par

If UCase(Left(Cel, Len(G.Range("B" & i).Value))) = UCase(G.Range("B" & i).Value) and if G.Range("B" & i)<> "" Then

Cordialement

bonjour,

merci pour ce retour. J'avais trouvé la solution entre temps mais je n'ai pas pris le temps de mettre "résolu"... sorry.

Une question supplémentaire concernant la boucle For Next. Lorsque la recherche se fait pour environ 50 références, elle dure environ 15 seconde. Existe il une alternative pour l'accélerer? J'ai utilisé "Application.ScreenUpdating = False" mais je ne constate pas d'amélioration...

re

L'instruction Application.ScreenUpdating = False ne concerne pas vraiment la rapidité d'un code. elle sert en gros à éviter le clignotement de l'écran lors de l'exécution du code

Il faudrait d'abord savoir si il y a des formules dans votre fichier car là c'est un facteur de lenteur. Les boucles FOR NEXT, sont aussi un facteur qui influence le code. Dans des cas d'analyse de beaucoup de données, il faut se tourner vers les tableaux. Plus complexe dans le code mais la rapidité est assurée

Cordialement

Rechercher des sujets similaires à "recherche multiple boucle"