Excel vba在集合中循环时从集合中删除
我有一个列,我在其中使用了match函数来生成找到的值的位置。因此该列中的每个单元格都有一个位置值。例3、4、5、#N/A、7、8等。保存一些单元格,其中的值为“#N/A” 我的目标是生成一个包含这些缺失集合值的集合。例如,基于上述示例,我的集合的值为“6”。我当前的方法是用所有可能的位置填充集合,然后循环遍历列并根据列单元格的值删除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
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开始,因此两者之间存在明显的不匹配。我不确定是否有可能将整数值作为集合中的键,因为默认项方法似乎将这些值视为位置而不是键。