Чтобы решить эту проблему, я бы создал 2 словаря:
1-й словарь (1): Ключ: Имя + Мил, Значение: на самом деле не имеет значения
2-й словарь (2): Ключ: Имя + Цвет, Значение: на самом деле не имеет значения
Вы l oop, начиная с верха / низа до низа / верха.
Для каждой строки вы проверяете, существует ли комбинация столбца B & C в словаре (1), если так-> удалить значения из ячейки (в столбце B), если не существует -> добавить новую комбинацию в словарь.
То же самое для комбинации B & D (словарь 2).
Это должно решить проблему.
Примечание:
В целях оптимизации поместите столбцы в массивы (arrColB = shtWorking.Range ("B: B")).
Вот прозрачное объяснение словарей:
https://excelmacromastery.com/vba-dictionary/
При условии, что я понял логи c дубликатов, это выглядело бы так:
Sub StackOverflow()
Dim lngI As Long
Dim lngLastRow As Long
Dim dicNameMil As Object
Dim dicNameColor As Object
Dim shtWorking As Object
Dim arrColB As Variant
Dim arrColC As Variant
Dim arrColD As Variant
Dim strKey As String
'set objects
Set shtWorking = Sheets(1)
Set dicNameMil = CreateObject("Scripting.Dictionary")
Set dicNameColor = CreateObject("Scripting.Dictionary")
lngLastRow = shtWorking.Cells(shtWorking.Rows.Count, 1).End(-4162).Row 'find last row with data/base on column A
arrColB = shtWorking.Range("B:B")
arrColC = shtWorking.Range("C:C")
arrColD = shtWorking.Range("D:D")
For lngI = 2 To lngLastRow Step 1
'validate column C
strKey = arrColB(lngI, 1) & arrColC(lngI, 1)
If dicNameMil.exists(strKey) Then
shtWorking.Range("C" & lngI).Value = ""
Else
dicNameMil.Add strKey, "New combination of Name and Mil"
End If
'Validate column D
strKey = arrColB(lngI, 1) & arrColD(lngI, 1)
If dicNameMil.exists(strKey) Then
shtWorking.Range("D" & lngI).Value = ""
Else
dicNameMil.Add strKey, "New combination of Name and Color"
End If
Next lngI
'set objects to nothing
Set shtWorking = Nothing
Set dicNameMil = Nothing
Set dicNameColor = Nothing
End Sub