Trouver l'erreur dans le code??

lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010 - 22 juin 2006 à 15:34
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 - 23 juin 2006 à 19:25
bonjour
j'ai écrit un code pour faire une recherche aider de personne sur le forum, mais j'ai une erreur au niveau de ma boucle, sur la ligne du findnext, est ce que quelqu'un pourrait m'aider , je ne trouve pas l'erreur?

chercher = TextBox1.Text
ligneu = Feuil1.Columns(1).Find("" & chercher, [A2], , , xlByRows, xlNext).Row
msg = Feuil1.Cells(ligneu, 1)
UserForm1.ListBox1.AddItem msg

Do
vl = ligneuligneu Feuil1.Columns.FindNext(After :vl).Row
If ligneu < vl Or ligneu = vl Then Exit Do
msg = Feuil1.Cells(ligneu, 1)
UserForm1.ListBox1.AddItem msg
Loop

merci d'avance

16 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 juin 2006 à 15:51
Salut
Une erreur, Ok : Laquelle ? sur quelle ligne ? à l'écriture ou à l'exécution ?
Que se passe t-il ? Que ne se passe t-il pas ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 juin 2006 à 15:59
Bonjour,


Connais pas excel des masses...


Peut être qqch comme ça :


chercher = TextBox1.Text

'Je prend la cellule pour pouvoir la réutiliser plus tard

Premcellule = Feuil1.Columns(1).Find("" & chercher, [A2], , , xlByRows, xlNext)

ligneu = cellule.Row

msg = Feuil1.Cells(ligneu, 1)

UserForm1.ListBox1.AddItem msg


'FindNext renvoie probablemement l'adresse de la première cellule trouvée quand elle a atteint la fin de la recherche.


Do


Cellule = Feuil1.Columns.FindNext(cellule)

ligneu = Cellule.Row

If Premcellule = Cellule Then Exit Do

msg = Feuil1.Cells(ligneu, 1)

UserForm1.ListBox1.AddItem msg

Loop


"" & chercher est strictement équivalent à chercher, non ?

Attention, le cas ou il n'y a pas de cellule correspondant à la recherche n'est pas traiter.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
22 juin 2006 à 16:00
Merci  2204 jack

=317991 lolpop: Il est vrai que rejoint jack pour avoir plus de précisions
 
(soit dit en passant ta boule de cristal est en panne??)

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement 
0
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
22 juin 2006 à 16:00
j'ai oublier d eprécisé, je suis sour VBA excel.
le code est censé recherche dans une colonne un mot entré dans un textbox prédédement.
lorsque je clique sur le bouton une erreur 1004 impossible de lire la propriète findnext de la classe range.

lorsque je fait un débogage ligne par ligne j'ai une erreur sur cette ligne:
ligneu = Feuil1.Columns(1).FindNext(after:="" & vl).Row
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 juin 2006 à 16:26
after:= "" & vl


C'est une syntaxe des plus intéressante...


FindNext attend la cellule précédente, ou rien, et dans ce cas elle cherche à partir de la cellule sélectionnée...


Par contre, je sais pas si Feui1.Columns(1) possède la méthode FindNext et c'est ce que semble reprocher le message d'erreur.


Petit rappel aussi "" & "" "" & "" & "" & "" & "" & ""  ""
0
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
22 juin 2006 à 16:30
b en fait lorsque je teste et que je sais ce que je recherche et coné la ligne, je remplaceligneu Feuil1.Columns.FindNext(After :vl).Row
par
ligneu = Feuil1.Columns.FindNext([4]).Row
et la ca marche
A4 étant la cellule ou j'ai trouvé ce que je cherchais dans le premier find() .
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
22 juin 2006 à 16:37
Aie Aie lolpop,

t'utilises mon code, je le reconnais. Je confirme ce que te dis tr15 :
"" & chercher est strictement équivalent à chercher

Dans ma syntaxe, quand je dis Find("", [a1] ...    c'est pour chercher une cellule vide a partir d'A1
Si tu dis "" & chercher, le      "" &           est complètement inutile

Mais quand je t'ai fourni le code la dernière fois, je l'avais adapté pour tes besoins. Seuls les noms des contrôles étaient à changer.
Sachant que le l'avais tester auparavant, j'avais placé un peu partout des "morgan", des "momo" et d'autres, avec comme critères de recherche "mo". Et je t'ai fait une boucle pour tout rechercher et en sortir dès qu'il n'y avait plus de valeurs correspondantes.

Sinon, ton erreur elle se trouve là :
ligneu = Feuil1.Columns(1).FindNext(after:="" & vl).Row 
                                                   ^ cherche le suivant après telle cellule. je doute que "" & vl soit une cellule



















@++
<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /?><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>

  Mortalino 





Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le 
règlement
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 juin 2006 à 16:38
Tu as lu mon code plus haut ?


J'essai justement de récupérer la cellule du Find pour la passer en argument du FindNext.
0
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
22 juin 2006 à 16:51
oui mais j'ai deja essayer ce code qui ne marche pas non plus:

Do
vl = ligneu
ok = "[A" & vl & "]"
'MsgBox ok
ligneu = Feuil1.Columns(1).FindNext(after:=ok).Row
If ligneu < vl Or ligneu = vl Then Exit Do
msg = Feuil1.Cells(ligneu, 1)
UserForm1.ListBox1.AddItem msg
Loop

et la pourtant ok correspond bien a une cellule [Ax]
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
22 juin 2006 à 16:51
Tout ça pour dire que je vois pas pourquoi t'utilises pas le code que je t'ai fourni la dernière fois :




































 















Private Sub CommandButton1_Click()
    Dim chercher As String, NomTemp As String
    Dim AncienneLigne As Long, NouvelleLigne As Long
    
chercher = TextBox1.Text
Range("A1").Select
     Cells.Find(What:=chercher, After:=ActiveCell, _
     SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False).Activate
        
NomTemp = Selection.Value
UserForm2.ListBox1.AddItem NomTemp

Do
    AncienneLigne = ActiveCell.Row
        Cells.FindNext(After:=ActiveCell).Activate
    NouvelleLigne = ActiveCell.Row
        If NouvelleLigne < AncienneLigne Or NouvelleLigne = AncienneLigne Then Exit Do
    NomTemp = Selection.Value
    ListBox1.AddItem NomTemp
Loop
End Sub

















S'il y a quelque chose que tu ne comprends pas où que tu souhaites adapter, n'hésite pas,







@++
<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /?><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>

  Mortalino 





Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le 
règlement
0
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
22 juin 2006 à 19:44
lol, c'est pas que je ne veut pas prendre ton cote ^^.
c'est juste que j'aime bien arrivé a faire mes propres code, bien sur avec de l'aide et aussi voir des codes pour m'aider, mais arriver a taper mes propres code, mais je pense que je vais prendre le tiens parque je bugue sur mon problem j'ai tout essayer lol.

et la deuxieme c'est que je viens de la programation PHP, je sais pas si tu coné mais c'est pas tout a fait pareil, je n'ai pas envie de travailler avec les cellule active et tout ça, dans la mesure du possible j'aimerais bien essayer de garder l'algorithme du php. c'est a dire, pour les recherches on prend chaque ligne avec une id et on recherche dans les champs que l'on souhaite.
travailler avec les célélule e me branche pas trop , je prefere faire ligne par ligne, j'ai l'impression que c'est pas trés sur en passant par les celules active, défois je me fait peur lol.

merci beaucoup en tout ca
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
22 juin 2006 à 21:24
Lut,
J'ai tappé find dans VBA et voilà ce que je sort
Dim c, Dim FirstAddress

With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
                        Set c = . FindNext (c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With

Donc dans ton cas :

With Worksheets(1).Column(1)
    Set c = .Find(chercher, [A2],lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            UserForm1.ListBox1.AddItem c.Value
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
22 juin 2006 à 21:40
Re,
Il manque le s de columns dans mon code
Maintenant j'ai pas compris ce que tu cherche à faire
Tu recherches une valeur (de ton textbox) et quand tu trouves tu rajoutes cette valeur dans ta listbox ??????
tu vas te retrouver avec plein de "toto" ou autres dans ta listbox ..... 
Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
23 juin 2006 à 07:20
b en fait j'ai une colonne A avec plusieur nom, mai c'est juste un entrainement, au final ca sera des fournisseurs.
et je recherche dedans le mots clé tapez dans le listbox.
voila voila, mais mon probleme c'est que mon code marche soffe la ligne du findnext je ne comprend pas pourquoi ma valeur ok n'est pas pris en compte.

lorsque je veux teste mon module de recherche, je con deja les résultat,je m'explique, imaginons que je recherche le mot morgan, je sais que morgan est en célule A3 et A5.

donc si je modifie le code en fonction pour tester ca donne :

chercher = TextBox1.Text
'Range("A1").Select


ligneu = Feuil1.Columns(1).Find("" & chercher, [A1], , , xlByRows, xlNext).Row
msg = Feuil1.Cells(ligneu, 1)
UserForm1.ListBox1.AddItem msg


limit = 100
Do While ligneu < limit
vl = ligneu
ok = "[A" & vl & "]"
MsgBox ok
ligneu = Feuil1.Columns(1).FindNext(after:=[A3]).Row 'juste cette ligne qui change
If ligneu < vl Or ligneu = vl Then Exit Do
msg = Feuil1.Cells(ligneu, 1)
UserForm1.ListBox1.AddItem msg
Loop

Le resultat est impécable, il me retournde dans ma listbox les value de mes 2 cellules A3 et A5.

Mais lorsque je rechange le [A3] par ok ca ne marche plus, pourtant lorsque le msgbox ok s'affiche il y a bien marqué [A3]

chercher = TextBox1.Text
'Range("A1").Select


ligneu = Feuil1.Columns(1).Find("" & chercher, [A1], , , xlByRows, xlNext).Row
msg = Feuil1.Cells(ligneu, 1)
UserForm1.ListBox1.AddItem msg


limit = 100
Do While ligneu < limit
vl = ligneu
ok = "[A" & vl & "]"
MsgBox ok
ligneu = Feuil1.Columns(1).FindNext(after:=ok).Row
If ligneu < vl Or ligneu = vl Then Exit Do
msg = Feuil1.Cells(ligneu, 1)
UserForm1.ListBox1.AddItem msg
Loop

je vais essayer de comprendre ton code dans la journée, mais avec moi je garantie rien lol.
merci en tout cas
0
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
23 juin 2006 à 08:45
j'ai testé ton code valtrase,
il marche super, comem celui de mortalino, pour pas faire de jaloux :)

mais y a 1-2 truc que je comprend pas:
firstAddress = c.Address
a quoi correspond .Adress?? a la ligne ou la cellule ou autre?

et aussi cette ligne:
Set c = .FindNext(c)
a quoi ser Set, et cela donne quoi au final?

pour le reste je devrai m'en sortir :)
merci
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
23 juin 2006 à 19:25
Re,
Dans le code c est un objet Range donc c.Address te renvoie l'adresse de la cellule en cours (celle qui corresponds à la recherche) sous la forme "$A$1:$B$5" on mémorise cette adresse pour pouvoir sortir de la boucle quand le code à fait le tour de toutes les cellules et qu'il revient dessus.
pour cette ligne Set c = . FindNext (c)je te l'ai expliqué dans mon précédant post donc je récapitule.
c, est un objet Range ( une plage de 1 ou plusieurs cellules)
pour pouvoir l'affecter à une autre objet Range ici en l'occurence .FindNext(c)(Car ici le code te renvoie un objet Range : donc une cellule) tu dois utiliser Set sinon tu ne récupèrera que la valeur de ta cellule et non pas l'objet complet.
en exemple ce bout de code que tu peux mettre dans l'évènement Click d'un bouton
On Error GoTo CommandButton1_Click_Err
Dim Myrange ' ici je dimensionne en Variant
            ' Mais ça va devenir soit une chaine soit un objet Range



Dim rngCell As Range
            'On affecte a rngCell une plage
Set rngCell = [A1]
rngCell.Value = "Ma valeur est Toto"
'Maintenant regardes bien ce qui se passe
Myrange = rngCell
            ' là ça plante car MyRange est une variable String
            ' qui contient la valeur de la cellule
            MsgBox Myrange.Address
            MsgBox "MyRange est-t'il un object ? = " _
                & IsObject(Myrange)
           
            ' maintenant avec set
Set Myrange = rngCell
            ' ici MyRange est un objet avec toutes ses propriétés
            MsgBox "MyRange est-t'il un object ? = " _
                & IsObject(Myrange)
            MsgBox Myrange.Address





CommandButton1_Click_End:
    Exit Sub
CommandButton1_Click_Err:
 MsgBox Err.Description
 Resume Next







Cordialement, Jean-Paul  

______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
Rejoignez-nous