假设我有一个尺寸为comb(x, y)
的数组。
对于每个元素x,我需要检查元素y是否相同。如果是这样,我将继续x的下一个元素。
如果每个x的y中存储了4个元素,那么我将使用的代码如下:
For i = 0 To z
j = 0
k = j + 1
l = j + 2
m = j + 3
If comb(i, j) <> comb(i, k) And _
comb(i, j) <> comb(i, l) And _
comb(i, j) <> comb(i, m) And _
comb(i, k) <> comb(i, l) And _
comb(i, k) <> comb(i, m) And _
comb(i, l) <> comb(i, m) Then
MsgBox "success"
End If
Next i
问题是y的维数取决于用户输入。
有没有一种方法可以针对y中的任意数量的元素自动执行此操作?
答案 0 :(得分:0)
您可以创建三个循环,以检查每个值,但由于最后一个循环是第二个循环中的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) =
,第三个循环控制方程的右侧(= comb(x, z)
)。
如果需要,为防止在第二维中可能只有一个值的错误,您可以添加额外的 If..Then 语句,例如:
If Lbound(comb, 2) <> Ubound(comb, 2) Then ...
由于第三循环如何将y
的值加1,所以如果没有将y
的值加1则会产生错误。
这是一个很好的可视化效果,以了解其工作原理。该测试会将每个迭代打印到立即窗口,您可以看到每个数字都与另一个数字进行了比较:
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
答案 1 :(得分:0)
在K.Davis的大力帮助下,我找到了解决问题的以下方法:
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
noMatch = True
End If
Next z
Next y
If noMatch = False Then
MsgBox x
End If
noMatch = False
Next x