Sub Grasser()
' Plage de cellules qui contient la liste des allergenes à rechercher
' Ne pas inclure la cellule d'entête si il y en a une
Dim allergenes As Range
' plage de cellules dans laquelle faire la recherche des allergènes
' inclure la cellule d'entête (celle après laquelle commencera la recherche)
Dim plageRecherche As Range
'
Dim cAllergene As Range ' Cellule de boucle for contenant l'allergène en cours de recherche
Dim cTrouvee As Range ' Cellule de la plage de recherche qui contient l'allergène trouvé
'
Dim adr As String ' Adresse de la première cellule trouvée dans la plage de recherche
Dim Terme As String ' terme (mot) recherché dans la plage de recherche
'
' Position du mot trouvé dans la cellule et nombre de caractère du mot (Terme)
Dim pos As Integer, nbCars As Integer
'
' Initialisation de la plage des allergènes
' à partir du tableau courant de la cellule B2
' ce peut être n'importe quelle cellule contenue dans le tableau.
' N'en retenir que la première colonne (celle qui contient les termes à chercher
' débarrasser la plage de la cellule d'entête en décalant la plage, d'une ligne
' et en la retaillant du nombre de ligne -1
With Sheets("Allergènes").Range("B2").CurrentRegion.Columns(1)
Set allergenes = .Offset(1).Resize(.Rows.Count - 1)
End With
'
' Initialisation de la plage de recherche
' Idem que pour la plage des allergènes, sans, cette fois se priver de l'entête.
' La méthode .Find de l'objet Range, utilisée plus bas demande une cellule
' à partir de laquelle commencer la recherche.
' Cette cellule quant à elle n'est jamais explorée par la méthode .Find, c'est pour cela qu'on conserve l'entête.
Set plageRecherche = Sheets("Trad. Danois").Range("A1").CurrentRegion.Columns(5)
'
' Ré-initialiser le grassage des polices de la plage de recherche
plageRecherche.Font.Bold = False
'
' Parcours des cellules de la plage des allergènes
For Each cAllergene In allergenes.Cells
'
' Si la cellule parcourrue n'est pas vide, on lance la recherche
'
If Not IsEmpty(cAllergene) Then
Terme = cAllergene.Text ' Texte de la cellule à chercher
nbCars = Len(Terme) ' Nombre de caractère du texte
'
' Préfixer le terme d'une espace afin d'éviter que la recherche se fasse à l'intérieur des mots.
' exemple qu'il ne trouve pas 'lait' dans 'allaitement' (il trouvera 'lait' de ' laitage'
Terme = " " & Terme
'
' Lancer la recherche du terme à partir de la première cellule (entête) de la plage de recherche.
Set cTrouvee = plageRecherche.Find(what:=Terme, After:=plageRecherche.Cells(1, 1), LookIn:=xlValues, lookat:=xlPart, MatchCase:=False)
'
' Si la méthode .Find a trouvé quelque chose (retourn la cellule trouvée)
If Not cTrouvee Is Nothing Then
'
' Retenir la première addresse avant du passer aux cellules suivantes.
' (La méthode .FindNext fait tourner en boucle la recherche à l'intérieur
' de la plage.
adr = cTrouvee.Address
' initialisation de la boucle de recherche des cellules correspondantes dans la plage
Do
' Commencer par traiter la cellule trouvée
' déterminer la position du terme suffixé d'un espace ( pour qu'il ne trouve pas ' lait' de' laitage'
pos = InStr(1, cTrouvee, Terme & " ", vbTextCompare)
'
' Si le terme est bien là
' Alors grasser à partir de la position du terme +1 (pour ne pas grasser l'espace)
' jusqu'au nombre de caractères de l'allergène trouvé
If pos > 0 Then cTrouvee.Characters(pos + 1, nbCars).Font.Bold = True
'
' Chercher l'occurence suivante dans la plage de recherche
' à partir de celle qui a déjà été trouvée.
Set cTrouvee = plageRecherche.FindNext(cTrouvee)
'
' Changement: si .FindNext ne trouve rien, sortir de la boucle
If cTrouvee Is Nothing Then Exit Do
'
' Continuer tant que .FindNext n'est pas revenu à la première cellule trouvée
Loop While cTrouvee.Address <> adr
End If
End If
Next
End Sub