数组操作:索引超出界限

时间:2016-07-19 15:08:44

标签: arrays vba access-vba

我正在尝试将一个字符串数组与另一个字符串数组进行比较,以查看第一个数组的所有元素是否都存在于第二个数组中。我使用以下函数执行此操作:

    Dim tempArray As Object
    Set tempArray = CreateObject("System.Collections.ArrayList")

    For j = 0 To maxNumberOfParts - 1
        tempArray.Add (kitPartsArray(i, j))
    Next

    j = 0

    While UBound(partIDs) <= tempArray.Count
        Debug.Print (UBound(partIDs) & " " & tempArray.Count & " " & LBound(partIDs))
        If partIDs(j) = tempArray(j) Then
            j = j + 1
        Else
            tempArray.Remove (tempArray(j))
        End If
    Wend
    Debug.Print tempArray(1)
    j = 0
    Exists = True
    For Each part In partIDs
        Debug.Print tempArray(j)
        If part <> tempArray(j) Then
            Exists = False
        End If
        j = j + 1
    Next

    If Exists Then
        DoesntExist = False
        existingKits.Add (i)
    Else
        DoesntExist = True
    End If

这个想法是它将从每个数组中的第一个字符串开始并比较它们。如果它们相同,它将移动到每个数组中的下一个字符串,但如果它们不同,它将从临时数组中删除该字符串。然后,该过程将再次发生,其中填充了已删除字符串的字符串。这一直持续到两个阵列的大小相同。然后比较它们,如果它们是相同的,那么第一个数组的所有元素必须在temp数组中。但是,我在线上出现了一个越界错误:

If part <> tempArray(j) Then

(它实际上发生在Debug.Print tempArray(1)和Debug.Print tempArray(j)上,但是当它们被删除时它出现在If语句中)

你可以看到它打印出tempArray.Count,并在最后一次通过While ... Wend循环时,它将其打印为2. UBound(partIDs)也是2.我无法理解为什么tempArray正在收缩在那个过渡期间或如果不是那么为什么它无法访问这些元素。

更新: 当.Count属性为2时,Debug.Print tempArray(j)在抛出错误之前打印一个值。当.Count为3时,它会打印两个值;当为4时,它会打印三个值。

1 个答案:

答案 0 :(得分:0)

我明白了。 partIDs可能是比tempArray更大的数组,虽然我采取了相反的预防措施,但我没有防止这种情况发生。我只需添加这个If语句就可以了:

    j = 0
    Exists = True
    For Each part In partIDs
        If UBound(partIDs) < tempArray.Count Then
            Debug.Print tempArray(j) & " New"
            If part <> tempArray(j) Then
                Exists = False
            End If
            j = j + 1
        Else
            Exists = False
        End If
    Next