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,
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 ^^