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.AddressMerci 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 WithJe 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 WithMon 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 withCordialement
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.AddressAprè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) Thenpar
If UCase(Left(Cel, Len(G.Range("B" & i).Value))) = UCase(G.Range("B" & i).Value) and if G.Range("B" & i)<> "" ThenCordialement
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