Excel vba在集合中循环时从集合中删除

Excel vba在集合中循环时从集合中删除,excel,vba,Excel,Vba,我有一个列,我在其中使用了match函数来生成找到的值的位置。因此该列中的每个单元格都有一个位置值。例3、4、5、#N/A、7、8等。保存一些单元格,其中的值为“#N/A” 我的目标是生成一个包含这些缺失集合值的集合。例如,基于上述示例,我的集合的值为“6”。我当前的方法是用所有可能的位置填充集合,然后循环遍历列并根据列单元格的值删除 Dim arrPos As New Collection Dim bottomRow, matchRow As Long bottomRow = Range("A

我有一个列,我在其中使用了match函数来生成找到的值的位置。因此该列中的每个单元格都有一个位置值。例3、4、5、#N/A、7、8等。保存一些单元格,其中的值为“#N/A”

我的目标是生成一个包含这些缺失集合值的集合。例如,基于上述示例,我的集合的值为“6”。我当前的方法是用所有可能的位置填充集合,然后循环遍历列并根据列单元格的值删除

Dim arrPos As New Collection
Dim bottomRow, matchRow As Long
bottomRow = Range("A" & Rows.Count).End(xlUp).Row
matchRow = Range("C" & Rows.Count).End(xlUp).Row

' fill collection
For i = 3 To bottomRow
arrPos.Add i
Next i

' remove selects
For h = 3 To matchRow
    For g = 1 To arrPos.Count
    If Range("C" & h).Value = arrPos(g) Then
    arrPos.Remove (g)
    End If
    Next g
Next h
我的问题是,在循环中删除基于索引的内容似乎有困难。我在
If
语句中得到一个
运行时错误“9”:下标超出范围。我猜这是因为我在循环中删除,而索引一直在重新排序。那个么为什么问题是如何在循环中实现这些删除,或者是否有更好的方法来实现我所尝试的


请注意,这些匹配结果并不是完全按照升序或降序排列的。所以它实际上看起来更像“5,8,4,3,7,#N/A,等等”

你应该从最后一个位置开始,然后倒数:

For h = matchRow To 3 Step -1
    For g = arrPos.Count To 1 Step -1
        If Range("C" & h).Value = arrPos(g) Then
            arrPos.Remove (g)
        End If
    Next g
Next h

你应该从最后一个位置开始,然后倒数:

For h = matchRow To 3 Step -1
    For g = arrPos.Count To 1 Step -1
        If Range("C" & h).Value = arrPos(g) Then
            arrPos.Remove (g)
        End If
    Next g
Next h

谢谢你的回复。我确信这是正确的,但我的结果并没有达到预期的效果。将在一秒钟内接受。@mango-您能用一些示例行和列、您得到的结果和您期望的结果更新您的问题吗?如果知道我的答案被接受,我会更高兴,因为它确实帮助了你的问题:)谢谢你的关心。但我不知道我能透露多少。我想今天我得休息一下。以后再换一双或一双新眼睛。再次感谢你,谢谢你的回复。我确信这是正确的,但我的结果并没有达到预期的效果。将在一秒钟内接受。@mango-您能用一些示例行和列、您得到的结果和您期望的结果更新您的问题吗?如果知道我的答案被接受,我会更高兴,因为它确实帮助了你的问题:)谢谢你的关心。但我不知道我能透露多少。我想今天我得休息一下。以后再换一双或一双新眼睛。再次感谢。这里的问题似乎是您添加了以行号为键的值,但当您删除项目时,您是按位置删除它们。行号从3开始,但集合中的位置从1开始,因此两者之间存在明显的不匹配。我不确定是否有可能将整数值作为集合中的键,因为默认项目方法似乎把这些值看作是位置而不是键值。这里的问题似乎是将行数作为键值添加值,但是当您删除这些项时,则按位置删除它们。行号从3开始,但集合中的位置从1开始,因此两者之间存在明显的不匹配。我不确定是否有可能将整数值作为集合中的键,因为默认项方法似乎将这些值视为位置而不是键。