我正在尝试将一个字符串数组与另一个字符串数组进行比较,以查看第一个数组的所有元素是否都存在于第二个数组中。我使用以下函数执行此操作:
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时,它会打印三个值。
答案 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