I now, it's too long but I'm starting
You can call this procedure from the WorkSheet_Activate and Worksheet_SelectionChange
*****************************
Public Sub Colorear()
Dim WB As Workbook
Dim Sh As Object
Dim RngColores As Range
Dim RngColor As Range
Dim RngFrases As Range
Dim RngCelda As Range
Dim rngAsignacion As Range
Dim DoFilaFrase As Double
Dim DoFilaColor As Double
Dim DoFinalRow As Double
Dim StPalabra As String
Dim StFrase As String
Dim InContador As Integer
Dim InCaracter As Integer
Dim InLongitud As Integer
Dim Asci As Integer
Set WB = ThisWorkbook
Set Sh = WB.Sheets("Sheet1")
'Determina el rango de Frases
DoFinalRow = Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row
Set RngFrases = Range(Sh.Cells(2, 1), Sh.Cells(DoFinalRow, 1))
Set rngAsignacion = Range(Sh.Cells(2, 2), Sh.Cells(DoFinalRow, 2))
rngAsignacion.Clear
'Determina el rango de Colores
DoFinalRow = Sh.Cells(Sh.Rows.Count, 4).End(xlUp).Row
Set RngColores = Sh.Range(Sh.Cells(2, 4), Sh.Cells(DoFinalRow, 4))
'Para cada frase
For Each RngCelda In RngFrases
DoFilaFrase = RngCelda.Row 'Anota la fila de la frase
StFrase = StreenCleaner(RngCelda.Value)
'Busca un espacio
InLongitud = Len(StFrase)
For InContador = 1 To InLongitud + 1
StCaracter = Mid(StFrase, InContador, 1)
If StCaracter = " " Or InContador > InLongitud Then
'Busca un nombre de color
Set RngColor = RngColores.Find(What:=StPalabra, LookIn:=xlValues, lookat:= _
xlWhole, searchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False)
If Not RngColor Is Nothing Then 'Es un color
DoFilaColor = RngColor.Row 'Anota la fila del color
'Escribe en la fila de la frase la segunda columna del color
rngAsignacion(DoFilaFrase - 1, 1) = RngColores(DoFilaColor - 1, 2)
Else
StPalabra = ""
End If 'No es un color
Else
StPalabra = StPalabra & StCaracter
End If
Next InContador
StPalabra = ""
Next RngCelda
End Sub
Public Function StreenCleaner(Cadena As String)
Dim Contador As Integer
Dim Caracter As String
Dim CadenaLimpia As String
Dim Prueba As Integer
For Contador = 1 To Len(Cadena)
Caracter = Mid(Cadena, Contador, 1)
On Error GoTo ErrXEsp
If Asc(Caracter) > 128 Then Caracter = " "
Prueba = Asc(Caracter)
On Error GoTo 0
CadenaLimpia = CadenaLimpia & Caracter
Next
StreenCleaner = Trim(CadenaLimpia)
Exit Function
ErrXEsp:
Caracter = " "
Resume Next
End Function