2013-03-07 118 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