編集質問を読み直すと、名前だけでなく行全体に色が付けられることがわかりました。また、認識された名前が認識されていない名前に置き換えられた場合、その色を行から削除する必要があると判断しました。これらの問題に対処するために、元のコードが置き換えられました。
以下の解決策は、私が特定できるどのシーンでも最も簡単に思えるため、質問への回答は気にしないことにしました。
最初に、"John Tery" を赤く、"Mary Jane" をピンク色にすることを識別する方法が必要です。最も簡単な方法は、NameColour
必要に応じて名前を色付けしたワークシートを用意することだと判断しました。したがって、ルーチンは、このリストで「John Tery」が赤であることを認識しています。あなたのリストにさらにいくつかの名前を追加しました。ルーチンは、名前に含まれる単語の数を気にしません。
以下のコードはThisWorkbook
. このルーチンは、セルが変更されるたびにトリガーされます。変数MonitorColNum
とMonitorSheetName
は、監視するシートと列をルーチンに指示します。その他のセルの変更は無視されます。一致が見つかった場合は、名前の標準形式を NameColour からコピーし (必要でない場合は、このステートメントをコードから削除します)、必要に応じてセルに色を付けます。一致するものが見つからない場合は、名前を NameColour に追加して、後でその色を指定します。
お役に立てれば。
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Changed As Range)
Dim CellCrnt As Variant
Dim ColLast As Long
Dim Found As Boolean
Dim MonitorColNum As Long
Dim MonitorSheetName As String
Dim RowNCCrnt As Long
MonitorSheetName = "Sheet2"
MonitorColNum = 2
' So changes to monitored cells do not trigger this routine
Application.EnableEvents = False
If Sh.Name = MonitorSheetName Then
' Use last value in heading row to determine range to colour
ColLast = Sh.Cells(1, Columns.Count).End(xlToLeft).Column
For Each CellCrnt In Changed
If CellCrnt.Column = MonitorColNum Then
With Worksheets("NameColour")
RowNCCrnt = 1
Found = False
Do While .Cells(RowNCCrnt, 1).Value <> ""
If LCase(.Cells(RowNCCrnt, 1).Value) = LCase(CellCrnt.Value) Then
' Ensure standard case
CellCrnt.Value = .Cells(RowNCCrnt, 1).Value
' Set required colour to name
'CellCrnt.Interior.Color = .Cells(RowNCCrnt, 1).Interior.Color
' Set required colour to row
Sh.Range(Sh.Cells(CellCrnt.Row, 1), _
Sh.Cells(CellCrnt.Row, ColLast)).Interior.Color = _
.Cells(RowNCCrnt, 1).Interior.Color
Found = True
Exit Do
End If
RowNCCrnt = RowNCCrnt + 1
Loop
If Not Found Then
' Name not found. Add to list so its colour can be specified later
.Cells(RowNCCrnt, 1).Value = CellCrnt.Value
' Clear any existing colour
Sh.Range(Sh.Cells(CellCrnt.Row, 1), _
Sh.Cells(CellCrnt.Row, ColLast)).Interior.ColorIndex = xlNone
End If
End With
End If
Next
End If
Application.EnableEvents = True
End Sub