2013-03-07 77 views
1

我所拥有的是一列,我使用匹配函数来生成找到值的位置。因此该列中的每个单元格都有一个位置值。恩。 3,4,5,#N/A,7,8等。保存某些值为“#N/A”的单元格。vba从循环中删除集合

我的目标是用这些缺少的集合值生成一个集合。例如,根据上述示例,我的收藏将具有值“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声明中出现Run-time error '9': Subscript out of range错误。我猜这是因为我在循环中删除而索引不断重新排序。那么为什么问题是如何在循环中实现这些删除,或者如果有更好的方法来实现我所尝试的。

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

+0

这里的问题似乎是,你行号作为键添加值,但是当你删除的项目,你是删除他们的位置。行号从3开始,但集合中的位置从1开始,因此两者之间明显不匹配。我不确定甚至可以将整数值作为集合中的键,因为默认的Item方法似乎将这些值视为位置而不是键 – barrowc 2013-03-07 22:53:54

回答

1

你应在最后一个位置开始,倒数:

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 
+0

感谢您的回复。我确信这是正确的,但我的结果并没有像预期那样出来。将在一秒钟内接受。 – mango 2013-03-07 21:09:53

+2

@mango - 你能用一些示例行和列更新你的问题,你得到的结果和你期望的结果吗?我会更高兴知道我的答案被接受,实际上帮助你的问题:) – LittleBobbyTables 2013-03-07 21:16:50

+0

感谢您的关注。但我不知道我可以透露多少。我想今天我必须休息一下。稍后再看一双新的眼睛或眼睛。再次感谢你。 – mango 2013-03-07 21:45:01