Find et FindNext dans deux macros différentes

Ptitgoud

XLDnaute Nouveau
Bonjour le forum,

J'aimerais effectué une recherche d'un terme dans un classeur en renvoyant certaines informations dans une userform. Pour cela j'ai écrit la macro suivante, qui fonctionne correctement :

VB:
Public Wsh As Worksheet
Public cellule As Range
Public Valeur As String

Private Sub Recherche_Click()
Application.ScreenUpdating = False
Valeur = TextBox1.Value

If Valeur = "" Then
MsgBox "Vous n'avez pas indiqué de code AGI"
End If

If Valeur <> "" Then
    For Each Wsh In ThisWorkbook.Worksheets
    Set cellule = Wsh.Cells.Find(Valeur)
        If Not cellule Is Nothing Then
            Label1.Caption = "Produit enregistré"
            Wsh.Activate
            ligne = cellule.Row
            colonne = cellule.Column
            Label2.Caption = Cells(ligne, colonne - 5).Value
            Label3.Caption = ActiveSheet.Name
            Sheets("Accueil").Select
            GoTo Sortir

        Else
            Label1.Caption = "Produit non enregistré"
            Label2.Caption = ""
            Label3.Caption = ""
        End If
    Next
End If

Sortir:
Application.ScreenUpdating = True
End Sub

Mais il est possible que le terme recherché soit inscrit plusieurs fois dans mon classeur Excel. Donc pour cela j'aimerais créer un bouton suivant qui méne à l'occurence suivante et qui nous renseigne comme pour la première recherche.
Malheureusement la macro suivante que j'ai écrite ne fonctionne pas au niveau du findNext

VB:
Private Sub Suivant_Click()
Application.ScreenUpdating = False
Valeur = TextBox1.Value

If Valeur = "" Then
MsgBox "Vous n'avez pas indiqué de code AGI"
End If

If Valeur <> "" Then
    For Each Wsh In ThisWorkbook.Worksheets
    Set cellule = Wsh.Cells.FindNext(cellule)
        If Not cellule Is Nothing Then
            Label1.Caption = "Produit enregistré"
            Wsh.Activate
          ligne = cellule.Row
            colonne = cellule.Column
            Label2.Caption = Cells(ligne, colonne - 5).Value
            Label3.Caption = ActiveSheet.Name
            Sheets("Accueil").Select
            GoTo Sortir

        Else
            Label1.Caption = "Produit non enregistré"
            Label2.Caption = ""
            Label3.Caption = ""
        End If
    Next
End If

Sortir:
Application.ScreenUpdating = True
End Sub

Si quelqu'un pourrait m'aider à identifier le problème je l'en remercie d'avance!

Je vous joins un fichier pour mieux comprendre
 

Pièces jointes

  • FindNext.xls
    148.5 KB · Affichages: 85
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Find et FindNext dans deux macros différentes

Bonjour Ptitgoud,

Pas sûr que ce soit ça, mais il est possible que FindNext ne fonctionne que sur la même feuille que le Find.
Comme ta macro avec le FindNext parcours toutes les feuilles, il plante quand il n'est pas sur la même feuille que le Find exécuté précédemment.
Donc si c'est la même feuille, il faudrait faire un Findnext, et si c'est une feuille différente il faudrait faire un Find... mais pas sûr de moi
 

david84

XLDnaute Barbatruc
Re : Find et FindNext dans deux macros différentes

Bonjour, Tototiti:),
Ta macro doit commencer par un Find et se poursuivre par FindNext comme indiqué sur l'aide d'Excel.
Concernant ta demande, ci-joint un début de réponse sous réserve d'avoir compris ton attente. A toi de continuer dans ce sens si c'est ce que tu attends (si c'est toi qui as écrit la macro, tu devrais t'en sortir).
A+
Edit: ta macro peut être simplifiée mais j'ai préféré la laisser en l'état (peut-être y-a-t-il des raisons que j'ignore...).
 

Pièces jointes

  • FindNext-1 (version 1).xls
    106.5 KB · Affichages: 98
  • FindNext-1 (version 1).xls
    106.5 KB · Affichages: 98
  • FindNext-1 (version 1).xls
    106.5 KB · Affichages: 97
Dernière édition:

Ptitgoud

XLDnaute Nouveau
Re : Find et FindNext dans deux macros différentes

Merci c'est exactement ce que j'attendais!
J'ai apporté quelques modifications au niveau des variables que tu avais mises afin qu'elles puissent être utilisées par d'autres macro.
J'ai mis en PJ mon fichier modifié.

Par contre tu parles de modifications pour la simplifier, j'aimerais bien en savoir plus.

En tout cas, merci je ramais depuis hier pour essayer de la faire fonctionner correctement!
 

Pièces jointes

  • FindNext(2).xls
    104.5 KB · Affichages: 78

david84

XLDnaute Barbatruc
Re : Find et FindNext dans deux macros différentes

Re
tu n'as qu'à reprendre mon code...pourquoi utilise-tu une boucle for each...Next ?
Avec une boucle for i=1 to sheets.count...Next i, plus besoin des lignes :
'Wsh.Activate
'ligne = cellule.Row
'colonne = cellule.Column
il suffirait de te référer au n° de l'onglet (i) pour remplir tes labels sans avoir besoin d'activer ta feuille.
Ensuite, au lieu de
'ligne = cellule.Row
'colonne = cellule.Column
, tu peux directement te référer à c.addres ou firstAddress , quelque chose du genre sheets(i).c.address.value ou sheets(i).firstAddress.value.
Idem pour renseigner le Label3.Caption : sheets(i).Name.
A+
 

Ptitgoud

XLDnaute Nouveau
Re : Find et FindNext dans deux macros différentes

D'accord merci des précisions! Ce n'est pas du tout que je n'ai pas voulu utiliser ton code dans l'état loin de là il fonctionne très bien!

J'ai utlisé For each juste pour définir le nom de la feuille par la variable Wsh mais c'est vrai que ca revient au même que d'utiliser Sheets(i) avec For ... To .... je suppose.

Ensuite j'ai défini les variables ligne et colonne juste pour éviter d'avoir une longue formule (avec laquelle je risque de me perdre vue mon niveau en VBA ... me fallait quelque chose de plus structuré et simple) pour définir mon label2 étant donné que celui représente le texte inscrit dans une cellule placée sur la même ligne.
C'est pourquoi je ne pouvais pas utiliser c.address puisque je ne voulais pas obtenir le texte de cette cellule mais d'une cellule à côté.

Mais je te remercie encore pour le FindNext et le reste que j'ai quand même repris!
 

Ptitgoud

XLDnaute Nouveau
Re : Find et FindNext dans deux macros différentes

Re,

En fait j'ai un soucis avec la ligne
VB:
If Sheets(i).Name <> "Accueil" And Sheets(i).Name <> Label3.Caption Then

Si mon expression recherchée est présente deux fois sur la même page, cela m'empêche de trouver cette deuxième expression sur la page.
Pourquoi est-on obligé de mettre cette condition? Sans, la recherche ne fonctionne plus mais je ne comprends pas pourquoi ...
VB:
And Sheets(i).Name <> Label3.Caption

Merci d'avance!
 

david84

XLDnaute Barbatruc
Re : Find et FindNext dans deux macros différentes

Re
If Sheets(i).Name <> "Accueil" And Sheets(i).Name <> Label3.Caption Then
Si tu passes par une boucle For Each...Next, à quoi te sert le i ?
Si mon expression recherchée est présente deux fois sur la même page, cela m'empêche de trouver cette deuxième expression sur la page.
Sauf erreur de ma part, ton exemple ne comporte pas ce cas de figure.
Reviens avec un ficher exemple fidèle à ton attente car sinon, difficile de t'aider.
A+
 

Ptitgoud

XLDnaute Nouveau
Re : Find et FindNext dans deux macros différentes

Re,

En fait j'ai repris ta macro avec le For .... To, donc avec le fichier que tu as envoyé, il suffit de mettre par exemple un deuxieme code AAAA-0000 sur la premiere feuille client par exemple pour se rendre compte que cela ne fonctionne pas.

Pour moi cela vient de la condition comme quoi la feuille doit etre différente de la feuille précédente, mais je ne comprends pas pourquoi sans cette condition cela ne fonctionne pas? On ne peut pas faire la recherche sur la même feuille avant de passer à la suivante?

Edit : Je joins un fichier exemple
De plus, je viens de me rendre compte que sur la dernière feuille, le code est présent et pourtant la recherche ne nous l'indique pas. Une fois passé sur la deuxieme occurence, Excel revient sur la première.

Edit 2 : je viens également de me rendre compte que le .FindNext ne fonctionnait pas en fait. On peut mettre la ligne (Set c = .FindNext(c) ) en commentaire, cela ne change rien ca donne le même résultat ... je ne comprends vraiment pas ...
 

Pièces jointes

  • FindNext-1 (version 1).xls
    104.5 KB · Affichages: 64
  • FindNext-1 (version 1).xls
    104.5 KB · Affichages: 62
  • FindNext-1 (version 1).xls
    104.5 KB · Affichages: 63
Dernière édition:

david84

XLDnaute Barbatruc
Re : Find et FindNext dans deux macros différentes

Re
Donc, si tu as 2 codes identiques sur une même feuille, la question est : quelle info te permet de différencier les 2 codes ?
Le nom du produit est-il toujours différent ou pas ?
Si c'est le cas, il faut donc se référer au nom du produit.
Si ce n'est pas toujours le cas, il te faut donc créer un autre Label dans lequel l'adresse de la cellule sera inscrite (possibilité de masquer ce label si tu le veux). Tu pourras ainsi te référer à l'adresse de la cellule pour comparer les 2 codes et savoir lequel est le code suivant par rapport à celui sélectionné en 1er.
Autre point : si j'ai bien compris, dans le textbox1, tu veux connaître la position de la 1ère occurrence du code sélectionné et quand tu tapes sur suivant, la 2ème occurrence de ce même code. Ce qui veux dire que si tu as 3 fois le même code présent, tu ne ramèneras jamais le 3ème... est-ce cela ?
Si ce n'est pas ce que tu veux, explique plus en détail ton attente.
Pour le reste, je pense qu'il ne s'agit que d'un mauvais positionnement des infos à l'intérieur de la boucle For...Next. Mais avant tout, il faut bien poser le problème avant de cadrer la réponse.
A+
 

Ptitgoud

XLDnaute Nouveau
Re : Find et FindNext dans deux macros différentes

Re,
Alors, le nom du produit est différent, mais en fait il s'agit ici de le déterminer à partir du code. Donc ma seule option est de partir de ce dernier.
Ok pour le label masqué mais je ne comprends pas trop pourquoi.
Et sinon oui la recherche ne ramène jamais la 3eme occurrence, ça redémarre à la première et non à la deuxième je pense, et comme la première est maintenant différente (puisque c'est la deuxième qui est en mémoire) bah il reprend celle-ci ... je ne sais pas si j'ai été clair mais je le vois comme ça le problème.
 

david84

XLDnaute Barbatruc
Re : Find et FindNext dans deux macros différentes

Re, bonjour Fo_rum,
Alors, le nom du produit est différent, mais en fait il s'agit ici de le déterminer à partir du code. Donc ma seule option est de partir de ce dernier.
Peut-être mais pour permettre à Excel de faire la distinction entre les différents produits d'un même code, il faut bien que tu te réfères également au nom du produit et pas seulement au code puisque ce dernier est le même. Ou alors, tu te sers d'un compteur pour rechercher le code suivant : il va détecter la 1ère occurrence du code (celui ramené dans le textbox1) : le compteur passe à 1, puis l'occurrence qui suit : le compteur passe à 2 et tu ramènes les infos correspondant à ce code.
et comme la première est maintenant différente (puisque c'est la deuxième qui est en mémoire) bah il reprend celle-ci ...
Non, tu ne peux garder en mémoire les résultats de la recherches précédente dans ton UserForm car la procédure est réinitialisée à chaque fois que tu l'ouvres. C'est pour cela que je te dis que tu ne ramèneras jamais la 3ème occurrence.
Donc, je pensais personnellement à une solution un peu similaire dans l'idée à celle proposée par Fo_rum qui te permettrait d'afficher dans un autre UserForm la liste des autres codes similaires quand cette liste est supérieure à 2, puis la possibilité de charger par double clic sur l'occurrence choisie tes labels 1 à 3 afin de pouvoir accéder à la fiche technique.
A+
 
Dernière édition:

Discussions similaires

Réponses
12
Affichages
612

Statistiques des forums

Discussions
312 400
Messages
2 088 100
Membres
103 726
dernier inscrit
E.DEBLASIIS