Bouton de recherche dans Excel - Code VBA pour tout le Classeur

Bonjour ,

J'ai créer un bouton de recherche dans un ficher Excel mais en se moment mon code VBA recherche seulement dans la première feuille et non dans tout le classeur avez vous une idée de comment je pourrais modifier mon code pour que la recherche se fasse dans toute les feuilles de mon classeur?

Voici mon code:

Private Sub CommandButton_Click()

Dim strFindWhat As String

strFindWhat = TextBox1.Text

On Error GoTo ErrorMessage

Cells.Find(What:=strFindWhat, After:=ActiveCell, LookIn:=xlFormulas, LookAt _

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

False).Select

Exit Sub

ErrorMessage:

MsgBox ("The data you are searching for does not exist")

End Sub

merci pour votre aide!

Bonsoir,

en ajoutant une boucle sur les feuilles du classeur :

For i = 1 to WorkSheets.count
with sheets(i)
' ... votre code "adapté" à la nouvelle situation
End With
Next i

@ bientôt

LouReeD

Ci joint un petit fichier de recherche de valeur contenue dans des cellules faisant parties d'une certaine plage sur toutes les feuilles du classeur :

@ bientôt

LouReeD

wow super! votre outil de recherche est vraiment encore mieux que le mien,par contre je ne suis pas sur de comprendre ou ajouter le code pour le loop afin qu'il chercher dans tout le classeur, a la tout fin? désolé je suis vraiment débutante e VBA

merci.

Bonjour,

je crois qu'ce serait comme ça :

Private Sub CommandButton_Click()
  Dim celX As Range, mot$, i%: mot = TextBox1.Text
  For i = 1 to Worksheets.Count
    Worksheets(i).Select ' obligatoire, pour sélectionner la cellule du mot cherché (s'il sera trouvé)
    Set celX = Cells.Find(mot, , xlValues, xlWhole)
    If celX Is Nothing Then MsgBox "The data you are searching for doesn't exist" Else celX.Select
  Next i
End Sub

j'ai supposé que la recherche se fait uniquement sur les valeurs, pas sur les formules ; et qu'on recherche un mot entier (sinon, remplacer xlWhole par xlPart) ; note qu'on a pu se passer du gestionnaire d'erreur : y'a plus de On Error GoTo

attention : le code est valable pour la recherche d'une seule occurrence par feuille ; pour plusieurs, j'te laisse adapter !

(like that, you'll can progress in learning of VBA, doesn't it ? my taylor is not very rich, but it's likesame a free help )

attention : si tu as un classeur avec plus de 255 feuilles (sait-on jamais ? ), remplace i% par i&


si y'a une erreur dans mon code VBA (non testé), LouReeD saura corriger ; pas vrai, LouReeD ?

remarque : j'ai pas téléchargé ton fichier ; j'suis parti du code initial de labubu55

dhany

Bonjour dhany,

pour moi l'idée d'afficher le message comme quoi rien n'est trouvé devrait apparaitre une fois toutes les feuilles "scannées" hors là il s'affiche "à la fin" de chaque feuille...

Une proposition dans ce sens :

Option Explicit

Private Sub CommandButton_Click()
    Dim Trouve As Boolean
    Dim celX As Range, mot$, i%: mot = TextBox1.Text
    Application.ScreenUpdating = False
    For i = 1 To Worksheets.Count
        Worksheets(i).Select ' obligatoire, pour sélectionner la cellule du mot cherché (s'il sera trouvé)
        Set celX = Cells.Find(mot, , xlValues, xlWhole)
        If celX Is Nothing Then Next i Else Trouve = True: Exit For
    Next i
    If Trouve Then celX.Select Else MsgBox "The data you are searching for doesn't exist"
End Sub

ou un truc de ce genre, je n'ai pas testé...

@ bientôt

LouReeD

oui, j'avais bien remarqué ce dont tu parles ; je m'étais dit : si ça trouve le mot, ça va sur la cellule en question ; sinon, ça affiche le message pour chaque feuille, et labubu peut voir quelle est la feuille sur laquelle le mot n'est pas trouvé ... sauf que là, j'viens d'voir que j'ai fait une erreur car y'a : Application.ScreenUpdating = False

donc solution : supprimer carrément cette instruction (plutôt que mettre True au lieu de False, car c'est la valeur par défaut)


autre solution : mettre dans une chaîne de caractères le nom de chacune des feuilles où y'a pas le mot, et afficher la chaîne à la fin de la sub ; note que ta proposition n'affichera que la dernière feuille où y'a pas le mot (si toutefois ça arrive pour plusieurs feuilles).

mon code adapté donnerait cela :

Private Sub CommandButton_Click()
  Dim celX As Range, chn$, mot$, i%: mot = TextBox1.Text
  For i = 1 to Worksheets.Count
    Worksheets(i).Select ' obligatoire, pour sélectionner la cellule du mot cherché (s'il sera trouvé)
    Set celX = Cells.Find(mot, , xlValues, xlWhole)
    If celX Is Nothing Then chn = chn & ActiveSheet.Name & vbLf Else celX.Select
  Next i
  MsgBox "Sheets where search data doesn't exist :" & vbLf & vbLf & chn
End Sub

remarque en passant : pour ton code, 1ère fois qu'je vois une boucle For i avec 2 Next i (c'est original ! )

or c'est super facile de l'éviter : If Not celX Is Nothing Then Trouve = True: Exit For

ainsi, quand le mot est trouvé, ça n'exécute pas l'instruction ci-dessus ... et ça tombe sur le Next i

d'autre part, ton code s'arrête dès que le mot est trouvé sur une feuille, donc il ne continue pas pour les feuilles suivantes

or j'croyais qu'le but de la sub était d'sélectionner la cellule du mot pour chaque feuille (s'il est présent dessus, bien sûr).

j'ai peut-être mal compris l'énoncé du problème ? fallait s'arrêter dès la 1ère occurrence du mot trouvé ?

dhany

J'avais prévenu !

ou un truc de ce genre, je n'ai pas testé...

@ bientôt

LouReeD

Merci à vous deux pour votre aide, j'ai testé le dernier code de dhany et pour n'importe quel mot que j'essaie de trouver ça me donne le message d'erreur :

Sheets where search data doesnt exist :

Indemnisation

Ressources Humaines

qui sont en passant le nom de mes feuilles

une idée pourquoi?

merci encore

Bonjour labubu,

alors essaye ce code VBA :

Private Sub CommandButton_Click()
  Dim celX As Range, chn$, mot$, i%: mot = TextBox1.Text
  Application.ScreenUpdating = 0
  For i = 1 to Worksheets.Count
    Worksheets(i).Select ' obligatoire, pour sélectionner la cellule du mot cherché (s'il sera trouvé)
    Set celX = Cells.Find(mot, , xlValues, xlWhole)
    If celX Is Nothing Then chn = chn & ActiveSheet.Name & vbLf Else celX.Select
  Next i
  If chn <> "" Then MsgBox "Sheets where search data doesn't exist :" & vbLf & vbLf & chn
End Sub

désolé, j'avais oublié :

* Application.ScreenUpdating = 0 pour éviter la gêne visuelle du « flashage » entre les feuilles

* le test If chn <> "" Then que j'ai ajouté devant MsgBox

rappel : laisse xlWhole si le mot à chercher est toujours uniquement le contenu d'une cellule complète ; mais si au contraire le mot à chercher est parfois une partie du contenu d'une celule, alors remplace xlWhole par xlPart

à te lire pour savoir si ça a marché.

dhany

Bonjour,

une chose me turlupine....

Est-il utile d'énumérer les feuilles où la recherche n’aboutit pas ?

Pour moi l'idée au départ était :

je cherche une donnée, le code m'indique sa position s'il la trouve en sélectionnant la cellule (éventuellement il passe à la suivante s'il en trouve plusieurs, mais cela n'est pas précisé à savoir s'il peut y avoir plusieurs valeurs identique...) et s'il ne trouve rien, alors il m'en informe...

C'est pourquoi j'avais fournis le code "recherche dans le classeur"...

Mais je n'ai certainement pas compris le principe

@ bientôt

LouReeD

Merci Dhany

j'ai changé XWhole par xlPart

Et j'ai testé et maintenant j'ai un message d'erreur différent qui dit:

Erreur d'exécution 1004

La méthode sélect de la classe range a échoué

et si j'active le debogage suite a l'erreur, ca me surligne en jaune celX.Select après la commande & vbLf Else

quelle serait le problème selon toi?

merci

Bonjour labubu,

voici le code VBA de mon post du 7 juillet à 02:42, avec xlPart au lieu de xlWhole (c'est le seul changement) :

Private Sub CommandButton_Click()
  Dim celX As Range, chn$, mot$, i%: mot = TextBox1.Text
  Application.ScreenUpdating = 0
  For i = 1 to Worksheets.Count
    Worksheets(i).Select ' obligatoire, pour sélectionner la cellule du mot cherché (s'il sera trouvé)
    Set celX = Cells.Find(mot, , xlValues, xlPart)
    If celX Is Nothing Then chn = chn & ActiveSheet.Name & vbLf Else celX.Select
  Next i
  If chn <> "" Then MsgBox "Sheets where search data doesn't exist :" & vbLf & vbLf & chn
End Sub

d'après ce code, au tout début de la boucle For i .. Next i

on va sur chaque feuille avec : Worksheets(i).Select

ensuite, y'a cette instruction : Set celX = Cells.Find(mot, , xlValues, xlPart)

➯ comme y'a pas d'référence explicite de feuille, c'est une recherche sur la feuille active

(cette feuille existe forcément, donc ça peut pas être une erreur de feuille inexistante)

si la recherche ne trouve rien, résultat : Nothing ➯ exécution de cette instruction :

chn = chn & ActiveSheet.Name & vbLf ; comme c'est avant le Else :

le celX.Select n'est pas exécuté ; donc c'est pas là que l'erreur se produit !

si la recherche trouve le mot, résultat : Range de la cellule du mot de la feuille active

➯ exécution de celX.Select ; donc là, j'vois vraiment pas pourquoi ton erreur 1004

se produit : « La méthode Select de la classe range a échoué »

revérifie bien tout, en particulier si y'a pas un deux-points juste après le Else

si y'a : ... Else: celX.Select supprime le « : » et ça sera bon !

si tu as toujours le même problème, envoie-moi ton fichier.


@LouReeD : si t'as une idée d'la cause de l'erreur 1004, c'est pas d'refus !

dhany

Tout semble ok

il n' y a pas les deux poing après Else

je te joint le ficher

Bonsoir,

je n'ai pas tout suivi mais il manque une lettre dans le fichier joint :

If chn <> "" Then MsgBox "Sheets where search data doesn't exist :" & vbLf & vbLf & chn

@bientôt

LouReeD

Pour revenir à l'erreur, celle-ci se produit lorsqu'une valeur est trouvée deux fois !

Hors à chaque fois que la valeur est trouvée, on essaie de sélectionner cette cellule et là l'erreur se produit...

soit il faut "vider" CelX afin que la sélection précédente n'interfère pas...

Car quand on affiche l'adresse de celX sur le mot "auto", sur la première feuille le message affiche $B$5, mais le code continue

passe à le deuxième feuille, et là il n'y a rien, pourtant le message affiche encore $B$5...

Il y a du résidu de sélection de la "première trouvaille" et du coup comme il y a changement de feuille il y a une erreur de sélection car la première cellule trouvée n'est plus sur la feuille active....

Deuxième remarque : sur la première feuille il y a plusieurs "Auto", pourquoi s'arrêter à ce premier puis passer à la deuxième feuille ?

Perso je suis chauvin et je reste sur l'idée de mon premier fichier...

@ bientôt

LouReeD

@LouReeD

bien vu, pour l'explication de l'erreur 1004 !

j'ai ajouté ce qu'il faut pour chercher plusieurs occurrences du même mot,

et en même temps, j'ai référencé la feuille explicitement.

(d'où le nouveau fichier inclus dans le post suivant)

dhany

@labubu55

je te retourne ton fichier modifié :

cette fois, ça cherche le mot seulement en colonne A (car j'crois bien que c'est c'que tu veux) ; et si y'a plusieurs occurrences du mot, ça va sélectionner chacune successivement.

si malgré tout tu préfères une recherche sur toutes les colonnes, il te suffit de remplacer .Columns(1) par .Cells (2×)

je te laisse faire les tests ; merci de me donner ton avis.

dhany

c'est génial merci, en fait c'est presque parfait mais il y a juste un petit truc qui m'ennuie, la macro envoie automatiquement a l'autre mot qui contient la valeur en textbox , mais moi j'aurais besoin que ce sois fait manuellement en cliquant a chaque fois sur la commande rechercher pour qu'on puisse s'arrêter ou l'on désire, car il y aura des liens vers les documents dans chaque titre qu'on veux trouver donc faut que les gens puisse s'arrêter sur le lien qu'il veulent.

comment je modifie le code pour ça.

merci encore

Rechercher des sujets similaires à "bouton recherche code vba tout classeur"