Вот решение, которое найдет, где 1 ячейка совпадает с 1 или 2 другими ячейками. Если вам нужно больше 2, вы можете вложить еще 1 тест, но помимо этого я бы хотел взглянуть на форму рекурсивного тестирования - или на решение SQL, как я упоминал в своем комментарии.
You 'Заметьте, я не читаю каждую клетку в отдельности. Это общеизвестно медленно, особенно после 1000-го ряда. Вместо этого я читаю значения в массив и проверяю там. Закончив, я записываю результат обратно на лист. Я проверил это на 5000 целых чисел в диапазоне от -500 до +500, и время, затрачиваемое на это, сократилось примерно на 95%.
Я прокомментировал код, чтобы вы могли следить за тем, что я сделал. Вместо того, чтобы окрашивать ячейки, я использовал столбец B, чтобы решить, использовалась ли уже ячейка. Если вам действительно нужны цвета, возможно, добавьте условное форматирование после «вставки».
Sub test()
Dim i As Long
Dim vls As Variant
'find last populated cell in column A
lastrow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
'copy columns A:B down to lastrow into array called VLS
vls = Sheet1.Range("A1:B" & lastrow).Value
'start reading from top of array (ignoring header)
For i = 2 To lastrow
'if value is unused so far
If vls(i, 2) <> "True" Then
'copy value to test1
test1 = vls(i, 1)
'start 2nd loop, starting below value found in test1
For k = i + 1 To lastrow
'if this value is unused so far
If vls(k, 2) <> "True" Then
'copy this (2nd) value to test2
test2 = vls(k, 1)
'do test1 and test2 add up to zero?
If test2 + test1 = 0 Then
'if yes, mark them as used
vls(i, 2) = "True"
vls(k, 2) = "True"
'and then quit this loop
Exit For
'otherwise
Else
'start a 3rd loop
For m = k + 1 To lastrow
'if this 3rd value is unused then..
If vls(m, 2) <> "True" Then
'do test1 and test2 and test3 add up to zero?
If vls(m, 1) + test1 + test2 = 0 Then
'if yes, mark them as used
vls(i, 2) = "True"
vls(k, 2) = "True"
vls(m, 2) = "True"
'set k to end to cause this and outer loop to quit
k = lastrow
'and then quit the loop
Exit For
End If
End If
Next m
End If
End If
Next k
End If
Next i
'paste the values within VLS back to the sheet.
Range("A1:B" & lastrow).Value = vls
End Sub
В качестве последнего примечания, если ваши ячейки не являются целыми числами, рассмотрите возможность добавления округления к If test2 + test1 = 0 Then
и т. Д. разрешить найденные десятичные ошибки.