Вы можете создать три цикла, которые будут проверять каждое значение, но будут пропускать друг друга из-за того, что последний цикл будет y + 1
из второго цикла.
Dim x As Long, y As Long, z As Long, comb()
For x = LBound(comb, 1) To UBound(comb, 1)
For y = LBound(comb, 2) To UBound(comb, 2) - 1
For z = y + 1 To UBound(comb, 2)
If comb(x, y) = comb(x, z) Then
msgbox "Match Occurred!"
End If
Next z
Next y
Next x
По сути, второй цикл контролируетлевая часть уравнения (If comb(x, y) =
и 3-й цикл управляют правой стороной (= comb(x, z)
).
При желании, чтобы избежать ошибок, когда в единственном значении может быть только одно значениеВо втором измерении вы можете добавить дополнительный оператор If..Then , например:
If Lbound(comb, 2) <> Ubound(comb, 2) Then ...
, в связи с тем, как третий цикл добавляет 1 к значению y
,но возникнет ошибка, если не будет добавлено 1 к y
.
Визуализация
Вот хорошая визуализация, чтобы увидеть, как это работает. Этот тест будетраспечатав каждую итерацию в непосредственном окне, вы можете увидеть, что каждое число сравнивается с другим числом:
Sub test()
Dim x As Long, y As Long, z As Long, comb(0, 0 To 4)
For x = LBound(comb, 1) To UBound(comb, 1)
For y = LBound(comb, 2) To UBound(comb, 2) - 1
For z = y + 1 To UBound(comb, 2)
If comb(x, y) = comb(x, z) Then
Debug.Print y & "|" & z
End If
Next z
Next y
Next x
End Sub
, которое выводит непосредственное окно:
0|1
0|2
0|3
0|4
1|2
1|3
1|4
2|3
2|4
3|4