Recherche d’une chaîne de caractère dans une cellule et la colorier

Retour vers Excel

Recherche d'une chaîne de caractère dans une cellule et colorier la recherche

La fonction "Recherche" (CTRL+F) dans Excel nous offre déjà beaucoup de possibilités, et notamment si on active les options

Mais on peut aussi la personnaliser et notamment obtenir un effet couleur sur la chaîne de caractère recherchée - la colorer en rouge par exemple. Nous devons alors recréer une interface de dialogue sous forme d'un bouton qui appelle la macro (bouton recherche) et une input box qui permettra à l'utilisateur d'entrer son critère

Et voici le résultat de la recherche

Un msg box apparaît et demande si l'on souhaite poursuivre. Si le bouton "oui" est pressé, on obtient

Si le bouton "non" est choisi, les choses reviennent en l'état et le curseur reprend son ancien emplacement

Il est bien sûr possible que le critère de recherche n'existe pas

Le code commenté pour obtenir cet effet

Option Explicit

Sub RechercheEtCouleur()
Dim mot As String, reponse As Integer
Dim oldCel As String

oldCel = Selection.Address 'pour se repositionner ensuite
mot = InputBox(" entrez element a chercher")

ActiveSheet.Select 'repréciser où on est
Range("A1").Select 'se placer en début de recherche
oups: ' va nous permettre de boucler

On Error GoTo fin 'si mot n'existe pas = erreur

Cells.Find(What:=mot, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
'effectue la recherche

   With ActiveCell.Characters(Start:=InStr(1, Selection, Left(mot, 1), 1), Length:=Len(mot))
     .Font.ColorIndex = 3 'colorie en rouge
     .Font.Bold = True 'met en gras
    End With

reponse = MsgBox("Poursuivre recherche", vbYesNo) 'nécessaire aussi pour stopper la recherche

If reponse = 6 Then 'si le bouton yes est utilisé
Selection.Font.ColorIndex = 0 'remise de la couleur noire
Selection.Font.Bold = False 'enlever le gras
GoTo oups 'on boucle
Else
Selection.Font.ColorIndex = 0 'idem plus haut si le bouton non est choisi
Selection.Font.Bold = False
Range(oldCel).Select 'on reprend notre place
Exit Sub 'on sort lorsque l'on presse le bouton non
End If

fin:
MsgBox "pas trouvé"
Range(oldCel).Select 'on reprend notre place
End Sub

Remarquez les fonctions ActiveCell.Characters et aussi InStr ("In String"). Ce sont elles qui permettent vraiment d'isoler la chaîne de caractère recherchée


Pour traiter tout le classeur

Pour traiter toutes les feuilles du classeur, on doit recourir à deux procédures différentes. En plus de remplir la fonction recherche, on peut observer ici comment faire "passer" la valeur de deux variables (mot et i) comme paramètres vers une autre procédure

Sub ParcourirFeuilles() 
 Dim i As Integer, mot As String 
 mot = InputBox(" entrez element a chercher") 
 For i = 1 To ThisWorkbook.Sheets.Count 
  Sheets(i).Select 
  Call RechercheEtCouleur(mot, i)
 Next i
 End Sub
Sub RechercheEtCouleur(mot As String, i As Integer)
  Dim reponse As Integer
  Dim oldCel As String
  
  oldCel = Selection.Address 'pour se repositionner ensuite
  ActiveSheet.Select 'repréciser où on est
  Range("A1").Select 'se placer en début de recherche
  
  oups: ' va nous permettre de boucler
  On Error GoTo fin 'si mot n'existe pas = erreur
  
  Cells.Find(What:=mot, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
  xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
  'effectue la recherche

  With ActiveCell.Characters(Start:=InStr(1, Selection, Left(mot, 1), 1), Length:=Len(mot))
     .Font.ColorIndex = 3 'colorie en rouge
     .Font.Bold = True 'met en gras
  End With
  
  reponse = MsgBox("Poursuivre recherche", vbYesNo) 'nécessaire aussi pour stopper la recherche
  If reponse = 6 Then 'si le bouton yes est utilisé
     Selection.Font.ColorIndex = 0 'remise de la couleur noire
     Selection.Font.Bold = False 'enlever le gras
     GoTo oups 'on boucle
  Else
     Selection.Font.ColorIndex = 0 'idem plus haut si le bouton non est choisi
     Selection.Font.Bold = False
     Range(oldCel).Select 'on reprend notre place
     Exit Sub 'on sort lorsque l'on presse le bouton non
  End If

  fin:
  If i < ThisWorkbook.Sheets.Count Then
     MsgBox "pas trouvé sur cette page, je continue"
  Else
     MsgBox "pas trouvé dans le classeur ou dans la dernière feuille"
     Range(oldCel).Select 'on reprend notre place
  End If
End Sub

Cliquez ici pour télécharger le fichier exemple RechercheEtColoriageDeLaRecherche

FIN