Bonjour,
j'essaie de comprendre la méthode Find. Pour ce faire, j'essaie de mettre en pratique cet exemple issue de l'aide d'Excel mais la macro plante (erreur 91 variable d'objet ou variable de bloc with non défini).
Voici mon code :
Code:
Sub testRecherche()
Dim c As Range
Dim firstAddress As String
With ActiveSheet.Range("a1:a20")
Set c = .Find(5, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 22
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
Merci de me dire ce qui ne va pas.
Toute info, tuto, conseil,... concernant l'utilisation de Find seront également les bienvenus.
Je vous souhaite une bonne journée.
A+
Sub testRecherche()
Dim c As Range
Dim firstAddress As String
With ActiveSheet.Range("a1:a20")
Set c = .Find(5, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
MsgBox c.Value
c.Interior.ColorIndex = 22
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
Pièges de find:
-Les paramètres (lookin, lookat ) utilisés dans find sont mémorirés. il faut donc les redéfinir à chaque interro.
-Faire attention à la compatibilité des formats entre la date cherchée et les dates du champ de recherche.
Le souci à mon avis vient du fait que tu modifies c en cours de recherche
J'ai modifié ta macro pour obtenir le resultat que tu sembles chercher (a savoir remplacer 5 par 22) en utilisant un tableau pour stocker les adresses du resultat de la recherche
Tu noteras par ailleurs l'ajout de lookat:=xlWhole .En effet Excel conserve le dernier parametre lookat utilisé et il semble qu'il s'agisse en ce cas de xlpart
Re
Merci à vous deux d'avoir pris le temps de me répondre.
JB :
Code:
Pièges de find: les paramètres (lookin, lookat ) utilisés dans find sont mémorirés. [B]il faut donc les redéfinir à chaque interro[/B].
Comment s'y prend-t-on concrètement ?
J'ai bien noté que LookAt et LookIn conservent la valeur précédente mais même en les éfinissant comme cela dans le code
Code:
Set c = .Find(What:=5, LookIn:=xlValues, LookAt:=xlWhole)
, la macro plante à
Code:
Loop While Not c Is Nothing And c.Address <> firstAddress
J'ai donc contourné le problème en ajoutant On Error Resume Next dans le code, ce qui donne :
Code:
Sub testRecherche()
Dim c As Range
Dim firstAddress As String
With ActiveSheet.Range("a1:a20")
Set c = .Find(What:=5, [B]LookIn:=xlValues, LookAt:=xlWhole)[/B]
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 22
Set c = .FindNext(c)
[B] On Error Resume Next[/B]
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
Cela fonctionne comme cela mais cette solution ne me satisfait pas vraiment.
J'en reviens donc à ma question : comment redéfinir les paramètresLookIn et LookAt à chaque interrogation ?
Je continue de regarder ton lien pour voir si je trouve la réponse en attendant la tienne.
Merci
Edit JB : je viens de voir que tu as complété ton message initial...je regarde.
pierrejean : je ne vois pas ton code modifié dans le fichier joint. As-tu posté le bon fichier ?
Merci
A+
Re
JB : merci. Effectivement, replace fait le travail. Mais comme j'étais parti sur Find en reprenant l'exemple fourni dans l'aide d'Excel et ne maîtrisant pas encore le VBA je me demandais où était mon erreur...
De plus quand je te lisais
Les paramètres (lookin, lookat ) utilisés dans find sont mémorisés. il faut donc les redéfinir à chaque interro.
J'ai tenté une recherche sur Hernry mais sans résultat...
A toutes fins utiles, sachez qu'en modifiant de cette manière l'exemple fourni dans l'aide d'Excel, cela fonctionne (en tous cas, dans mon exemple ) :
Sub testRecherche()
Dim c As Range
Dim firstAddress As String
With ActiveSheet.Range("a1:a20")
Set c = .Find(5, LookIn:=xlValues, LookAt:= _
xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 22
Set c = .FindNext(c)
Loop While Not c Is Nothing
End If
End With
End Sub
A toutes fins utiles, sachez qu'en modifiant de cette manière l'exemple fourni dans l'aide d'Excel, cela fonctionne (en tous cas, dans mon exemple ) :
J'ai donc supprimé de la macro initiale (cela rejoint peut-être la réflexion de pierrejean ).
L'exemple fourni dans l'aide d'Excel serait-il donc erroné ou est-ce moi qui l'ai mal interprété ?...
A+
Oups : voir fichier joint.
J'y ai inclus une feuille pour mieux comprendre Lookat que je mets à False ou True (plus simple à retenir pour moi) (voir la remarque importante de JB à propose de Find).
: reprends l'exemple fourni dans l'aide d'Excel à Range.Find, méthode.
Exemple
Cet exemple montre comment rechercher toutes les cellules de la plage A1:A500 dans la première feuille de calcul contenant la valeur 2 et comment la remplacer par la valeur 5.
Visual Basic pour Applications
With Worksheets(1).Range("a1:a500")
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
Quand je tente de faire fonctionner cet exemple tel quel en reprenant le code de mon 1er message, cela plante.
Il suffit que j'enlève du code la partie
pour que cela fonctionne, d'où mon interrogation : le code fourni dans l'exemple fonctionne-t-il en l'état (et dans ce cas où est mon erreur) ou non ?...
A+
Re Re
J'ai regardé ton fichier et t'en remercie à nouveau. Donc, si j'ai bien compris :
- dans l'onglet False/True, tu mets en avant ce que disait JB, à savoir la fait de redéfinir à chaque interro les paramètres Lookin et Lookat (différence entre les scénarii "lancer 1, 2, 3" /"lancer 1 puis 3") et le fait que les différentes adresses de c soient trouvées puisque la valeur de c n'est pas modifiée
, ce que pierrejean avait relevé.
- dans l'onglet Oups : lorsque l'on veut modifier c, le rôle joué par Lookat et le fait d'enlever de la condition du Loop