Edit Erneut die Frage, sah ich, dass die gesamte Zeile nicht nur den Namen gefärbt werden soll. Ich entschied auch, dass, wenn ein erkannter Name durch einen unerkannten Namen ersetzt wird, die Farbe aus der Reihe entfernt werden sollte. Der ursprüngliche Code wurde ersetzt, um diese Probleme zu beheben.
Ich entschied, dass mir die Antworten auf meine Fragen egal waren, weil die untenstehende Lösung für jeden Szenerio, den ich identifizieren konnte, am einfachsten zu sein schien.
Zuerst benötigen Sie eine Methode, um zu identifizieren, dass "John Tery" rot und "Mary Jane" rosa gefärbt werden soll. Ich entschied, dass der einfachste Ansatz darin bestand, ein Arbeitsblatt NameColour
zu haben, in dem die Namen wie gewünscht aufgeführt waren. Die Routine weiß also, dass "John Tery" rot sein muss, weil es in dieser Liste rot ist. Ich habe Ihrer Liste einige weitere Namen hinzugefügt. Der Routine ist es egal, wie viele Wörter in einem Namen sind.
Der folgende Code muss in ThisWorkbook
gehen. Diese Routine wird immer dann ausgelöst, wenn eine Zelle geändert wird. Die Variablen MonitorColNum
und MonitorSheetName
teilen der Routine mit, welches Blatt und welche Spalte überwacht werden sollen. Alle anderen Zelländerungen werden ignoriert. Wenn es eine Übereinstimmung findet, kopiert es das Standardformular des Namens aus NameColour (löscht diese Anweisung aus dem Code, wenn dies nicht erforderlich ist) und färbt die Zelle nach Bedarf. Wenn keine Übereinstimmung gefunden wird, wird NameColour zur späteren Spezifikation der Farbe hinzugefügt.
Hoffe, das hilft.
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
Wie viele verschiedene Namen haben Sie?Ich würde die bedingte Formatierung nicht berücksichtigen, wenn es mehr als eine Handvoll gibt. Ändern sich Namen, so dass neue Farben notwendig werden? Muss die Farbänderung sofort erfolgen oder kann die Liste nach Abschluss der Bearbeitung neu eingefärbt werden? Werden neue Namen zur Liste hinzugefügt? –
@TonyDallimore Nicht viel. Weniger als 10 und sie sind Konstanten – sandalone