比较多维数组中的元素

时间:2018-11-21 07:35:42

标签: excel vba

假设我有一个尺寸为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中的任意数量的元素自动执行此操作?

2 个答案:

答案 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