Я бы не стал слишком часто звонить на этот лист. Обычно предпочтительнее работать через память. Следующее может выглядеть довольно обширно, но я попытался написать несколько комментариев, чтобы прояснить это:
Sub Test()
Dim lr As Long, x As Long, arr As Variant
Dim rng1 As Range, rng2 As Range
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
With ThisWorkbook.Worksheets("data")
'Find last used row in column C and prepare array to read through memory
lr = .Cells(.Rows.Count, 3).End(xlUp).Row
Set rng1 = .Range("C1:C" & lr)
arr = rng1.Value
'Loop over array and create a range object through Union and check against dictionary
For x = LBound(arr) To UBound(arr)
If WorksheetFunction.CountIf(rng, arr(x, 1)) > 1 Then
If Not rng2 Is Nothing Then
Set rng2 = Union(rng2, .Cells(x, 3))
Else
Set rng2 = .Cells(x, 3)
End If
If dict.exists(arr(x, 1)) Then
arr(x, 1) = "CHILD " & arr(x, 1)
Else
dict(arr(x, 1)) = 1
arr(x, 1) = "MASTER " & arr(x, 1)
End If
End If
Next
'Read back array and change cells colors
rng2.Interior.ColorIndex = 3
rng1.Value = arr
End With
End Sub
До:
После: