VBA : Rechercher chaîne de caractère dans un classeur

Bonjour à toutes et tous,

J'aimerais réaliser une macro associée à un bouton qui va sélectionner la première cellule, après la cellule active, dans laquelle il trouve une chaîne de caractère variable. J'aimerais que cette recherche s'effectue dans tout le classeur, et pas uniquement la feuille active.

Voici ce que j'ai déjà réalisé :

Sub Recherche()

'

' Recherche Macro

'

Dim MaRecherche As String

MaRecherche = Range("G17").Value

Cells.Find(What:=MaRecherche, After:=ActiveCell, LookIn:=xlValues, LookAt _

:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _

False, SearchFormat:=False).Select

End Sub

Il s'agit simplement du code de la fonction de recherche d'Excel (Ctrl + F) légèrement modifié pour rendre variable l'élément recherché.

Ce bout de code marche bien mais le champs de recherche est limité à la feuille active.

Je pensais remplacer simplement "Cells.Find()" par "Worksheets.Find()" mais ça ne fonctionne pas.

Du coup j'imaginais qu'il fallait sans doute boucler sur chaque Worksheet (chaque feuille). Mais je ne sais pas comment.

L'idée serait de stopper la boucle dès qu'une occurrence de la recherche est trouvée dans une des feuilles. Puis sélectionner la cellule trouvée.

Plus facile avec des mots qu'avec du code...

Merci de votre aide.

Bàv,

88test-recherche.xlsm (32.86 Ko)

Yo,

Dim Rng as Range

Dim MaRecherche As String

Dim i as integer

Dim trouver as boolean

trouver = false

i=0

While trouver = false

i = i + 1

MaRecherche = Range("G17").Value

Set Rng = Cells.Find(What:=MaRecherche, After:=ActiveCell, LookIn:=xlValues, LookAt _

:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _

False, SearchFormat:=False).Select

If Rng = Nothing Then

'change de Woksheet, utilise i qui fonctionne comme un compteur pour le numéro de la sheet

Worksheets(i).activate

If i = ActiveWorkbook.Sheets.Count

trouver = true

End if

Else

Trouver = true

End If

Wend

Plus ou moins ça je pense, même si l'utilisation de la fonction native "Find" complique les choses :3

Bonjour Tiagorimb,

Merci pour ton aide.

Je comprends bien ta logique.

Il y a quelques fautes de syntaxe dans ton code que j'ai pu corrigé.

J'ai apporté deux modifications à ta propositions :

Plutôt que de compter les feuilles et d'utiliser un compteur (i) dans une boucle While, j'ai utilisé une boucle For each qui passe en revue chaque feuille.

J'associe la boucle avec une Exit For lorsque la variable Trouver = True.

J'ai également mis une condition pour éviter de rechercher mon String dans la feuille de recherche (sinon il arrête sa recherche à la première cellule qu'il teste, à savoir mon champs de recherche.

Puis j'ai pris en charge le cas où aucun résultat n'est trouvé après être passé dans chaque feuille avec une petite MsgBox.

Ca donne ça :

Sub Recherche()

'

' Recherche Macro

'

' Déclaration variables

Dim Rng As Range

Dim MaRecherche As String

Dim Trouver As Boolean

Dim ws As Worksheet

' Initialisation variables

MaRecherche = Worksheets("Recherche").Range("G17").Value

Trouver = False

' Boucle for

For Each ws In ActiveWorkbook.Worksheets

ws.Activate

If ActiveSheet.Name <> "Recherche" Then

Set Rng = Cells.Find(What:=MaRecherche, After:=ActiveCell, LookIn:=xlValues, LookAt _

:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _

False, SearchFormat:=False)

If Not Rng Is Nothing Then

Trouver = True

End If

If Trouver = True Then

Exit For

End If

End If

Next ws

' Si résultat trouvé

If Trouver = True Then

Rng.Select

' Si aucun résultat

Else

Worksheets("Recherche").Activate

MsgBox ("Aucun élément correspondant à la recherche n'a été trouvé")

End If

End Sub

Et j'ai bien l'impression que ça fonctionne !

Merci pour l'inspiration ^^

Rechercher des sujets similaires à "vba rechercher chaine caractere classeur"