VBA Utiliser Find

david84

XLDnaute Barbatruc
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+
 

Pièces jointes

  • Test_find.xls
    37.5 KB · Affichages: 239

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : VBA Utiliser Find

Bonjour,

Il semblerait que l'on ne puisse pas modifier.

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
            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.

Find

Pour remplacer 5 par 22:
[A:A].Replace What:="5", Replacement:="22", LookAt:=xlWhole

http://boisgontierjacques.free.fr/pages_site/cellules.htm#Replace

jb
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : VBA Utiliser Find

Bonjour David84

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

EDIT: Salut JB
 

Pièces jointes

  • Test_find.zip
    10.7 KB · Affichages: 216
  • Test_find.zip
    10.7 KB · Affichages: 222
  • Test_find.zip
    10.7 KB · Affichages: 224

david84

XLDnaute Barbatruc
Re : VBA Utiliser Find

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+
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : VBA Utiliser Find

Bonjour à tous

David: le mieux pour utiliser find est d'utiliser Hernry:

Sur Xl2007, cela donne:

Code:
Cells.Find(What:="4", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True _
        , SearchFormat:=False).Activate
 

david84

XLDnaute Barbatruc
Re : VBA Utiliser Find

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.
, je pensais que mon erreur résidait dans le fait de ne pas savoir comment redéfinir ces paramètres, d'où ma question dans mon 2ème message.

pierrejean : Merci. Je regarde ton fichier et reviens vers toi si besoin.
Edit : cela fonctionne sans soucis

Michel : Merci. Ta proposition permet également d'effectuer une recherche.
le mieux pour utiliser find est d'utiliser Hernry
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
J'ai donc supprimé
And c.Address <> firstAddress
de la macro initiale (cela rejoint peut-être la réflexion de pierrejean
Le souci à mon avis vient du fait que tu modifies c en cours de recherche
).
L'exemple fourni dans l'aide d'Excel serait-il donc erroné ou est-ce moi qui l'ai mal interprété ?...
A+
 
Dernière édition:

Fo_rum

XLDnaute Accro
Re : VBA Utiliser Find

Bonsoir

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).
 

Pièces jointes

  • Lookat(True ou False).xls
    32.5 KB · Affichages: 249

david84

XLDnaute Barbatruc
Re : VBA Utiliser Find

Re
Merci Fo_rum pour ton fichier exemple (je regarde cela).
Peut-être n'ai-je pas été assez clair concernant
L'exemple fourni dans l'aide d'Excel serait-il donc erroné ou est-ce moi qui l'ai mal interprété ?..
: 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
And c.Address <> firstAddress
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+
 

david84

XLDnaute Barbatruc
Re : VBA Utiliser Find

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
Loop While Not c Is Nothing And c.Address <> Add1
, 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
And c.Address <> Add1
.
Merci
A+