Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i&, j&, pos&, rng As Range, cell As Range, s, dic As Object, key
Set dic = CreateObject("Scripting.Dictionary")
Set rng = Range("A1:B100")
If Intersect(Target, Range("A1:B100")) Is Nothing Then Exit Sub
rng.Font.Color = vbBlack
For Each cell In rng
If Not IsEmpty(cell) Then
s = Split(cell, ";")
For i = 0 To UBound(s)
If Not dic.exists(s(i)) Then
dic.Add s(i), cell.Address
Else
dic(s(i)) = dic(s(i)) & "|" & cell.Address
End If
Next
End If
Next
For Each key In dic.keys
s = Split(dic(key), "|")
If UBound(s) > 0 Then
For j = 0 To UBound(s)
With Range(s(j))
pos = InStr(1, ";" & .Value & ";", ";" & key & ";")
.Characters(pos, Len(key)).Font.Color = vbRed
End With
Next
End If
Next
End Sub