fonction .find avec boucle , dans une colonne à préciser

scaleo

XLDnaute Nouveau
Bonjour à tous,

je commence à me débrouiller avec VBA, mais j'ai toujours des soucies avec ma fonction find et sa boucle.

j'ai un useform pour effectuer une recherche dans mon tableau, on y sélectionne la colonne à fouiller, puis on tape le mot clée.
on lance la recherche et une msgbox apparait pour nous demander si la cellule trouvée nous convient, si oui tant mieux, sinon la recherche continue jusqu’à la prochaine cellule et là est mon problème.

quand le programme arrive à la fin de la colonne choisie, il passe sur une cellule correspondant à la recherche, mais sur une autre colonne, puis il recommence sur la colonne choisie aumais en "oubliant " la 1ere cellule correspondant à la recherche

voici le code:
Code:
Private Sub go_bouton_Click()

i = what_list.ListIndex

Dim colonne As String
colonne = Sheets("liste").Cells(i + 2, 4).Value
    
 Dim valeur As String
    
    valeur = word_box

   With Sheets("teste").Columns(colonne)
   
      ActiveSheet.Cells.Find(What:=valeur, After:=Cells(5, colonne), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Activate
End With
    Response1 = MsgBox("c'est bon ?", vbInformation + vbYesNo)
        If Response1 = vbYes Then

        Exit Sub
        Else
        Do While Response1 = vbNo
        
       With Sheets("teste").Columns(colonne)
       
        X = ActiveCell.Row
        
         ActiveSheet.Cells.Find(What:=valeur, After:=Cells(X, colonne), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate
        
        
        'Cells.FindNext(After:=Cells(6, colonne)).Activate
        End With
        Response1 = MsgBox("et mainteneant ?", vbInformation + vbYesNo)
        Loop
        End If



    Exit Sub

End Sub

et le fichier en xls
 

Pièces jointes

  • teste.xls
    57 KB · Affichages: 58
  • teste.xls
    57 KB · Affichages: 61
  • teste.xls
    57 KB · Affichages: 63

scaleo

XLDnaute Nouveau
Re : fonction .find avec boucle , dans une colonne à préciser

Merci Robert,

effectivement ta solution permet de rester sur la même colonne, mais j'ai besoin du bouclage, de revenir a la 1ere cellule une fois arriver en bas de la colonne.

j'ai quelques questions à propos de ton code :

Code:
Dim dl As Integer
Dim pl As Range

With Sheets("liste")
    dl = Cells(Application.Rows.Count, 3).End(xlUp).Row
    Set pl = .Range("C2:C" & dl)
End With
what_list.List = pl.Value

c'est pour "importer" les valeurs dans la liste déroulante, c'est bien ça ? pourquoi ne pas utiliser additem ?
peut tu me détaillé la ligne " dl =cells...." ?

Code:
Private Sub go_bouton_Click()
Dim col As Byte
Dim v As String
Dim r As Range
Dim pa As String

col = what_list.ListIndex + 3
v = word_box
With Sheets("teste").Columns(col)
    Set r = .Find(v, , xlValues, xlPart)
    If Not r Is Nothing Then
        pa = r.Address
        Do
            r.Select
            If MsgBox("c'est bon ?", vbInformation + vbYesNo) = vbYes Then Unload Me:   Exit Sub
            Set r = .FindNext(r)
        Loop While Not r Is Nothing And r.Address <> pa
    End If
End With
End Sub

bonne simplification pour col, je n'y avais pas pensé
v= word_box, il n'y a pas besoin du ".value" ?
à quoi correspondent r et pa?
r c'est la fonction de recherche associée au mot clé, et pa l'adresse de la cellule trouvée ?

je ne comprends pas trop la ligne avec le loop, en gros, findnext se répète tant que l'adresse actuelle et différente de la précédente ? et du coup la fonction ne peut que descendre dans la colonne et ne pas revenir au début ?

Scaléo
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : fonction .find avec boucle , dans une colonne à préciser

Bonjour Scaléo, bonjour le forum,

J'ai l'habitude de commenter les codes que je propose mais comme c'était l'heure de la pause je te l'ai envoyé sans le faire. Le voici donc commenté :
Code:
Private Sub UserForm_initialize()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (Plage)

With Sheets("liste") 'prend en compte l'onglet "liste"
    dl = Cells(Application.Rows.Count, 3).End(xlUp).Row 'définit la dernière ligne de la colonne 3 (=C)
    Set pl = .Range("C2:C" & dl) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "liste"
what_list.List = pl.Value 'alimente dynamiquement la listbox "what_list"
what_list.ListIndex = 0 'affiche le premier élément de la listbox "what_list"
End Sub


Private Sub go_bouton_Click()
Dim col As Byte 'déclare la variable col (COLonne)
Dim v As String 'déclare la variable v (Valeur de référence)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)

col = what_list.ListIndex + 3 'définit la colonne col
v = word_box.Value 'définit la valeur v
With Sheets("teste").Columns(col) 'prend en compte la colonne col de l'onglet "teste"
    Set r = .Find(v, , xlValues, xlPart) 'définit la recherche r
    If Not r Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
        pa = r.Address 'définit l'adresse de la première occurrence trouvée
        Do 'execute
            r.Select 'sélectionne l'occurrence
            'si "Oui" au message, ferme l'UserForm et sort de la procédure
            If MsgBox("c'est bon ?", vbInformation + vbYesNo) = vbYes Then Unload Me:   Exit Sub
            Set r = .FindNext(r) 'redéfinit la recherche r (occurrence suivante)
        Loop While Not r Is Nothing And r.Address <> pa 'bouce tant qu'il exite des occurrences ailleurs qi'en pa
    End If 'fin de la condition
End With 'fin de la prise en compte de la colonne col de l'onglet "teste"
End Sub
Pour répondre à tes question,
• On peut, comme tu l'avais fait, alimenter une combobox/Listbox avec AddItem. La méthode que je t'ai proposé à l'avantage dêtre dynamique. Si tu rajoutes une personne dans le tableau, elle sera prise en compte...

• la ligne :
Code:
dl = Cells(Application.Rows.Count, 3).End(xlUp).Row
permet de connaître le numéro de la dernière cellule utilisée d'une colonne col. On part de la dernière ligne de la colonne Cells(Application.Rows.Count, col). On atteint la dernière cellule utilisée (non vide) avec .End(xlUp). Et on récupère le numéro avec .Row.

• la propriété Value est la proprieté par défaut d'une textbox donc elle n'est pas nécessaire. Cependant pour mieux faire comprendre le code j'ai tendance à toujours la mette. Dans ton cas ce fut un oublie, mille excuses...

r est le nom que j'ai donné à la variable (type Range) que me renvoie la fonction Find (Rechercher) et pa est le nom que j'ai donné à la variable qui me renvoie l'adresse de la première occurrence trouvée.

Comme tu as besoin de boucle sans fin, nous n'utiliserons plus cette première adresse dans la version 2 ci dessous :
 

Pièces jointes

  • Scaléo_v02.xls
    47 KB · Affichages: 59

Discussions similaires

Réponses
2
Affichages
180
Réponses
12
Affichages
623

Statistiques des forums

Discussions
312 559
Messages
2 089 603
Membres
104 224
dernier inscrit
Brilma