XL 2019 Recherche d'un mot dans tout le classeur, avec diverses options

Axel19

XLDnaute Nouveau
Bonjour à tous,

J'ai retrouvé un bout de code ci-dessous, qui fonctionne, et qui permet de rechercher un mot dans toutes les feuilles d'un classeur.

VB:
Sub Rechercher()
Dim Sh As Worksheet
Dim c As Range
Dim Nom As String, firstAddress As String
 
Nom = InputBox("Nom à chercher dans toutes les feuilles", "Rechercher")
If Nom <> "" Then
    For Each Sh In ThisWorkbook.Worksheets
        Set c = Sh.Cells.Find(Nom, LookIn:=xlValues, LookAt:=xlPart)  'xlpart = partie du nom et xlwhole = casse exacte
        If Not c Is Nothing Then
            Sh.Activate
            c.Select
            firstAddress = c.Address
            Do
            strreponse = MsgBox(Sh.Name & "!" & c.Address & vbCrLf & _
                 "Oui pour continuer la recherche" & vbLf & _
                 "Non pour sortir", vbYesNo)
                 If strreponse = vbNo Then Exit Sub
                Set c = Sh.Cells.FindNext(c)
                c.Select
            Loop While Not c Is Nothing And c.Address <> firstAddress
            Set c = Nothing
        End If
    Next Sh
End If
End Sub

Je voudrais modifier certaines choses.

1°. Je souhaite restreindre la recherche à une plage donnée, par exemple les colonnes B et C, mais je ne sais pas où insérer le code.
2°. Plutôt qu'une MsgBox qui pointe sur les cellules trouvées (ce qui est déjà très bien), je souhaiterais afficher les résultats dans une ListBox, et pouvoir cliquer sur les résultats qui nous pointent ensuite vers les cellules. Est-ce faisable?

Merci d'avance pour vos réponses.
 

jmfmarques

XLDnaute Accro
Bonjour
restreindre la recherche à une plage donnée, par exemple les colonnes B et C, mais je ne sais pas où insérer le code.
VB:
Set c = Sh.Cells.Find(Nom, LookIn:=xl .... ETC ...
remplacer cells (la totalité des cellules) par la seule plage ("range(......)) concernée
Plutôt qu'une MsgBox qui pointe sur les cellules trouvées (ce qui est déjà très bien), je souhaiterais afficher les résultats dans une ListBox, et pouvoir cliquer sur les résultats qui nous pointent ensuite vers les cellules. Est-ce faisable?
bien évidemment : en utilisant la méthode additem de la listbox et, dans la foulée, y ajouter une colonne contenant le N° de la ligne (de sorte à faciliter ensuite le repérage des cellules)
 

Axel19

XLDnaute Nouveau
Bonjour,
Merci pour le retour.

J'ai tenté ceci (suppression de "Cells", et ajout de la plage des colonnes B et C):

VB:
For Each Sh In ThisWorkbook.Worksheets
        Set c = Sh.Range("B2:C200").Find(Nom, LookIn:=xlValues, LookAt:=xlPart)  'xlpart = partie du nom et xlwhole = casse exacte

Curieusement, la recherche ne se fait plus dans la feuille active (elle passe directement à la feuille suivante).
Et malheureusement, elle se poursuit aussi en colonne D.
 

Axel19

XLDnaute Nouveau
Alors j'ai vérifié, c'est pourtant bien ce qui se passe.

En réécrivant "Cells" à la place de la plage de données, j'ai bien la recherche qui se fait sur toutes les cellules, et les autres colonnes, et également sur la feuille en cours.

Lorsque je modifie et que je remplace par "Range("B2:C200")", la feuille active est exclue de la recherche, et la sélection d'autres colonnes que B et C a lieu.

J'ai transféré le code sur un autre classeur "test" très simplifié, et là cela fonctionne.

Il faut donc que je vérifie pourquoi ça ne fonctionne pas sur mon fichier "final".
 

Axel19

XLDnaute Nouveau
Je vais me vexer :)
Voilà donc la totalité du code de cette procédure, où je n'ai modifié qu'une instruction.

VB:
Sub Rechercher()
Dim Sh As Worksheet
Dim c As Range
Dim Nom As String, firstAddress As String
 
Nom = InputBox("Nom à chercher dans toutes les feuilles", "Rechercher")
If Nom <> "" Then
    For Each Sh In ThisWorkbook.Worksheets
        Set c = Sh.Range("B2:C200").Find(Nom, LookIn:=xlValues, LookAt:=xlPart)  'xlpart = partie du nom et xlwhole = casse exacte
        If Not c Is Nothing Then
            Sh.Activate
            c.Select
            firstAddress = c.Address
            Do
            strreponse = MsgBox(Sh.Name & "!" & c.Address & vbCrLf & _
                 "Oui pour continuer la recherche" & vbLf & _
                 "Non pour sortir", vbYesNo)
                 If strreponse = vbNo Then Exit Sub
                Set c = Sh.Cells.FindNext(c)
                c.Select
            Loop While Not c Is Nothing And c.Address <> firstAddress
            Set c = Nothing
        End If
    Next Sh
End If
End Sub


J'en conclus donc que c'est le reste du code de mon fichier "final" qui est en cause (le fichier contient plus de 25 feuilles, avec beaucoup de procédures et quelques modules, et un seul Userform). Je pense que je vais le "simplifier" pour identifier le problème (puisque mon fichier test sur lequel cela fonctionne avait la même base).
 

jmfmarques

XLDnaute Accro
SI tu étais moi (un clin d'oeil à l'agrafe) , tu commencerais par vérifier (sait-on jamais) que le code que tu exécutes est bien celui que tu penses exécuter. J'ai déjà été le témoin de mésaventures du genre : plusieurs versions en cours et on ne méprend quant à celle utilisée :
Et donc : j'inclurais un petit "coucou" ainsi, juste pour en voir le coeur net :
VB:
...
...
Nom = InputBox("Nom à chercher dans toutes lhes feuilles", "Rechercher")
If Nom <> "" Then
    For Each Sh In ThisWorkbook.Worksheets
        msgbox "coucou ... ici : " & sh.name '---->> premier espion
        Set c = Sh.Range("B2:C200").Find(Nom, LookIn:=xlValues, LookAt:=xlPart)  
       
        If Not c Is Nothing Then
           msgbox c.address ' --->> deuxième espion
...
...
 

Axel19

XLDnaute Nouveau
Merci.
J'ai inclus les "espions" dans mon fichier "test". (cf. fichier joint).
Ça a l'air correct, sauf le 1er résultat qui sort pour chaque feuille (avec erreur de sélection de cellule).

Et j'ai rajouté un mot clé à rechercher ("nuit") en colonne D, E et F, et les cellules sortent quand même dans la recherche... Malgré la plage de données entre B et C.
 

Pièces jointes

  • Test_Livres_02.xlsm
    64.7 KB · Affichages: 48

lesgroods

XLDnaute Nouveau
Bonjour, je voudrais me servir de votre code pour trouver une date parmi différentes feuilles dans un classeur, par exemple : 15/05/2022. Et cela ne fonctionne pas, je peux trouver n'importe quel mot mais pas les dates. Etant débutant en vba je ne sais pas comment modifier le code pour trouver une date. J'ai modifié la variable du nom par Date puis par Variant à la place de String mais rien n'y fait.
Pourriez-vous m'aider ?

Merci à l'avance du temps que vous allez passer pour me répondre
 

Discussions similaires

Réponses
8
Affichages
448
Réponses
12
Affichages
537
Réponses
12
Affichages
541

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG