Find Findnext problème de bouclage

Bonjour à tous,

je voulais savoir si d'après vous il était possible que le findnext ne fonctionne pas dans une suite FIND FINDNEXT si enormément de fonctions et de boucles IF, FOR etc sont faites entre la déclaration SET du FIND et celle du FINDNEXT.

Je vous joins mon code pour mon find findnext.

Set Cel = .Columns(1).Find(What:="CHRONO", LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)
        If Not Cel Is Nothing Then
        LgDepart = Cel.Row
        Do

..................... la j'ai des appels à des fonctions, des WITH, des IF, des While et des FOR par dizaines voire centaines.............(mais le code est bon)

Set Cel = .Columns(1).FindNext(Cel)
        If Not Cel Is Nothing Then
            If Cel.Row = LgDepart Then Exit Do
        End If
        Loop While Not Cel Is Nothing
        End If

J'ai l'impression que le findnext ne se réalise pas, car j'obtiens les résultats seulement pour la première occurence de CHRONO.

Merci d'avance pour vos conseils, vos idées ou remarques.

Cordialement,

Jujel

Salut,

voici le principe... le code est à adapter à tes besoins

Sub test()
Dim Cel As Range, myRange As Range
With Sheets(1)
    Set Cel = .Columns(1).Find(What:="CHRONO", LookIn:=xlValues, LookAt:= _
            xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
            , SearchFormat:=False)
            If Not Cel Is Nothing Then
            Set myRange = Cel
            Do

    Set Cel = .Columns(1).FindNext(Cel)
            Cel.Select
            Loop While Cel.Address <> myRange.Address
            End If
End With

End Sub

Bonsoir,

La méthode de la fonction vba "Find/FindNext"

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

Bonjour,

tu es dans un sub ou dans une Function ?

Dans Function le .findnext n'est pas terrible (il faut ruser...).

Pareil si dans tes autres appels tu as d'autres .find, j'ai l'impression qu'on ne peut pas les imbriquer.

eric

Merci à tous pour vos réponses!

Alors Game Over j'ai repris ton code, mais j'ai une erreur 91 Variable objet ou variable de bloc with non définie à la ligne Cel.Select direct après le findnext ---> je pense qu'il n'arrive pas à prendre le findnext.

Merci Jean-Eric mais je me suis inspiré de l'aide déjà pour mon code, je l'ai juste adapté à mon cas, car il ne marchait pas avec la double condition à la ligne du loop.

Eriiic il s'agit d'une sub et c'est le seul find findnext de ma sub, les fonctions que j'appelle dans le DO ne sont pas de type find findnext, il s'agit uniquement de remplacement (replace) ou de boucles IF ou For.

Je commence à me dire qu'après un DO il ne doit pas y avoir beaucoup de fonctions ou boucles pour que cela fonctionne, car j'ai testé avec une seule ligne de commande après le DO et mon FIND FINDnext fonctionne.

Je ne vois pas trop comment m'en sortir sur ce coup la du coup. Si vous avez d'autres idées n'hésitez pas

poste une copie de ton fichier, ce sera plus simple.

Alors voila, le fichier texte est le fichier à importer.

Dans mon fichier excel c'est le module 4 qui est concerné par le find findnext.

Les autres modules sont des fonctions que j'appelle.

Comme vous pouvez le constater mon fichier est rempli de caractères spéciaux que je décode, que j'assemble et que je met en forme.

Mon but est d'obtenir (pour les 3 tests présents dans le fichier texte --> commence par W1 ... CHRONOS...) le tableau en collones H I J et K. Vous allez rapidement vous rendre compte que le programme ne m'effectue la boucle qu'une seule fois. Vu que je n'ai qu'une fois les valeurs (premier test) au lieu des valeurs des 3 tests.

Je sais que mon code est très long, ca fait des jours que je travaille dessus, donc normal si certains trucs vous paraissent lourds, je n'ai pas pu encore l'alléger au maximum.

Le problème concerne donc bien le FIND FINDNEXT avec CEL (j'ai mis un commentaire assez gros histoire que ce soit visible).

Merci

172test-cel.xlsm (112.31 Ko)
139capture50-multi.txt (12.26 Ko)

Bonjour,

Sans trop regarder ton code car il faut se mettre en condition, créer des répertoire etc, et surtout parce que je pense que ça ne doit pas être dû à une erreur, ton . Je pense que c'est plus un pb avec .findnext.

Je te propose d'utiliser ce que j'avais fait pour une fonction personnalisée :

ne pas utiliser .findnext, mais, dans une boucle, faire .find sur une plage dynamique dont le début est le dernier c trouvé +1.

Je pense que tu n'aura pas de mal à adapter si une explication ne surgit pas de la discussion.

Function concatITN(Description As Range, Optional Séparateur As String) As String
    ' recherche Description dans 'Général ITN'!B:B
    ' et concatène les n° ITN correspondants colonne A
    ' séparateur par défaut : "-"
    '
    Dim shGenITN As Worksheet, c As Range, plageRech As Range, derAdresse As String, fini As Boolean
    Set shGenITN = Worksheets("Général ITN")
    If Séparateur = "" Then Séparateur = "-"
    '
    Set c = shGenITN.[B1]
    While Not fini
        ' plage de recherche dynamique car .findnext ne fonctionne pas dans une Function
        Set plageRech = c.Resize(shGenITN.[B65536].End(xlUp).Row - c.Row + 1, 1)
        '
        With plageRech
            Set c = .Find(Description, LookIn:=xlValues)
            If Not c Is Nothing Then
                If c.Address <> derAdresse Then
                    If c.Offset(0, -1) > 0 Then
                        ' traitement
                        concatITN = concatITN & Séparateur & c.Offset(0, -1)
                        ' fin traitement
                        derAdresse = c.Address
                    End If
                Else
                    fini = True
                End If
            Else
                fini = True
            End If
        End With
    Wend
    If Len(concatITN) > 0 Then concatITN = Right(concatITN, Len(concatITN) - Len(Séparateur)) Else concatITN = "Inc."
End Function

eric

eriiic a écrit :

Dans Function le .findnext n'est pas terrible (il faut ruser...).

Pareil si dans tes autres appels tu as d'autres .find, j'ai l'impression qu'on ne peut pas les imbriquer.

La boucle dans laquelle se trouve FindNext fonctionne tant qu'on n'intègre pas la fonction

deuxpremierschiffresmarche

Par contre, elle plante après avoir procédé à celle-ci...

J'ai fait pas mal de tests, mais honnêtement, je ne vois pas la raison pour laquelle la fonction interfère avec le bon fonctionnement de FindNext.

Eric, tu sembles avoir quelques éléments de réponse quand tu dis que l'utilisation des fonctions et de FindNext n'est pas terrible.

Eriiic, c'est parfait. J'ai adapté à ma sauce et effectivement l'astuce de la plage de recherche mouvante et des find marche à merveille. Plus de 24h de recherche qui aboutisse enfin. L'idée est donc la bonne!

Un énorme merci à toi et désolé pour le fichier effectivement y avait pas mal d'adaptations à faire j'avais oublié de prévenir.

Merci et bonne journée à vous tous, vous me sortez une épine du pied.

Cordialement,

Jujel


Effectivement Game Over, le soucis ne vient pas du code en lui-même mais bien du find next qui ne veut pas réagir. La petite ruse d'eriiic tombe à pic. En tout cas merci à toi également pour tes tests et le temps passé à regarder cela.

Je me coucherais moins bête mais toujours aussi perplexe cela dit.

Sûrement un bug (?) à remonter à Microsoft.

Eric, tu sembles avoir quelques éléments de réponse quand tu dis que l'utilisation des fonctions et de FindNext n'est pas terrible.

En fait je n'ai jamais réussi à utiliser .findnext dans une fonction personnalisée, même toute bête qui fait une simple concaténation comme dans l'exemple que j'ai mis au-dessus.

Ou bien imbriquer 2 findnext, même s'ils ont leurs propres variables.

Et j'ai l'impression que l'exemple de jujel fait ressortir un autres cas de mauvais fonctionnement. Il faudrait regarder de plus près deuxpremierschiffresmarche que tu as isolé, mais si elle est correcte comme elle le parait...

Je pense que .findnext est bugué (pile mal gérée ou je ne sais quoi) mais bon, parfois la bonne technique n'est pas évidente.

eric

Jujel, eric...

J'ai continué mes petites recherches de mon côté... sans remettre en question l'efficacité de ta proposition, eric, il s'avère effectivement (nous sommes maintenant tous d'accord) que FindNext réagit mal dans certaines circonstances.

Le code de jujel plante lorsqu'on écrit le code classique Find suivi, de la boucle FindNext

Do
        Set myCell = ActiveWorkbook.Sheets(1).Columns(1).FindNext(myCell)
        myCell.Select'vérif
'code de jujel
Loop While myCell.Address <> myrange.Address
End If

par contre, si l'on change juste FindNext par Find et que l'on précise la commande after, alors le code fonctionne.

Do
        Set myCell = ActiveWorkbook.Sheets(1).Columns(1).Find(myCell, After:=myCell)
        myCell.Select'vérif
'code de jujel
Loop While myCell.Address <> myrange.Address
End If

donc une boucle avec Find et spécification de After serait une autre alternative efficace à FindNext tout en conservant la structure habituelle du code Find/FindNext

Interessant!

Je retiens ta proposition avec le After, qui est une bonne alternative à la proposition d'Eriiic.

J'ai également continué mes petits tests de mon côté et il s'avère que la fonction qui bug appelle la cellule recherchée avec le FIND, ce qui apparemment pourrait poser problème. Il doit y avoir un problème avec le FINDNEXT qui doit se "perdre" au milieu du code: sûrement au niveau des nombreux appels de fonctions qui doivent lui faire perdre pied ou je ne sais quoi.

Je pense que nous n'aurons probablement jamais la réponse exacte mais ce qui est sûr, c'est que maintenant nous avons des solutions alternatives grâce à vous et je vous remercie enormément.

Je code pas depuis très longtemps et je pensais avoir fait une boulette, mais apparemment ce n'est pas ma faute cette fois 8)

Bonne journée à vous et encore un enorme merci!

par contre, si l'on change juste FindNext par Find et que l'on précise la commande after, alors le code fonctionne.

Très très intéressant oui, je ne connaissais pas ce paramètre. Excellente trouvaille.

Dès que j'ai 5 min je testerai dans une fonction personnalisée.

eric

juste un exemple concrêt pour illustrer le principe :

Je viens de tester dans une fonction personnalisée et là aussi les dysfonctionnements sont levés

Content de ma journée, merci game not totaly over

Sinon il ne manquerait pas un Or myRange Is Nothing dans la condition de sortie de boucle de ton fichier ?

eric

eriiic a écrit :

Je viens de tester dans une fonction personnalisée et là aussi les dysfonctionnements sont levés

Content de ma journée, merci game not totaly over

eriiic a écrit :

Sinon il ne manquerait pas un Or myRange Is Nothing dans la condition de sortie de boucle de ton fichier ?

Tu fais bien de soulever la question; c'est vrai que traditionnellement la boucle se termine par une commande du genre

Loop Until myRange.Address = myCell.Address Or myRange Is Nothing

mais myRange ne peut jamais avoir la valeur Nothing puisque la boucle est encadrée par une condition

If Not myRange Is Nothing Then
'boucle
End If

donc, à mon avis, la commande est inutile... qu'en penses tu ?

Bonjour

Juste pour apporter mon point de vue

J'utilise souvent Find

Il faut comprendre la fonction FindNext

Elle refait une recherche avec les paramètres données lors de la recherche du Find et a comme paramètre la cellule du résultat du Find (FindNext ou FindPrevious)

Entre le 1er Find et Le FindNext jujel utilise Replace qui n'est qu'un find couplé avec un remplacement, donc une fois fini ces Replace, la fonction FindNext n'a à sa disposition que les paramètres du Replace, c'est pour cela qu'elle ne trouve rien

Juste une remarque : On ne sélectionne jamais un résultat de Find ou de FindNext ou de FindPrevious sans être sur que la réponse est valable

Voila l'explication que j'attendais et que je cherchais. Merci Banzai, j'ai bien compris le soucis!

Pas évident comme problème quand on a uniquement deux mois de VBA dans les dents en tout cas. C'est clair que la maintenant sachant cela, je ne risque pas de faire la même "erreur".

Sinon problème très intéressant je trouve. et je suis d'accord avec GameOver pour la condition finale le Not is Nothing n'est pas utile si on l'utilise déjà avant comme condition.

Bonjour

Juste pour rebondir sur ce que dis Game Over

Les 2 tests sont inutiles ensemble

Si tu rentres dans ta boucle Do...Loop et que tu ne fais que la recherche des occurrences : seulement le test avec les adresses suffit

Si tu rentres dans la boucle Do....Loop et que tu modifies ce que tu recherches : Seulement le test Not Cel Is Nothing est utile

Et je ne sais si quelqu'un l'a marqué mais la syntaxe du find

Extrait de l'aide

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)
' On ne teste pas le résultat
        Loop While c.Address <> firstAddress
' ou
'        Loop While Not c Is Nothing   ' si modification des "c" trouvés et de  ce fait la ligne firstAddress = c.Address est inutile
    End If
End With
Rechercher des sujets similaires à "find findnext probleme bouclage"