从集合中删除当前循环的项目?

时间:2014-05-07 07:35:30

标签: vba excel-vba excel

如何从集合中删除当前循环的项目?我得到运行时错误13:在行wls上移动不匹配。移除vl

Sub FocusOnH(ByRef vls As Collection)
    Dim vl As CVegetableLine
    For Each vl In vls
        If vl.hValue <> 0 Then
            vl.volume = vl.hValue
        Else
            vls.Remove vl
        End If
    Next vl
End Sub

2 个答案:

答案 0 :(得分:5)

您必须在按顺序循环播放集合时删除项目,否则会导致错误。

Sub TestRemoveItemInCollection()
    Dim col As Collection, i As Integer
    Set col = New Collection
    col.Add "item1"
    col.Add "item2"
    col.Add "item3"
    col.Add "item4"

    ' Never use: For i=1 to col.Count
    For i = col.Count To 1 Step -1
        col.Remove i
    Next i

    Set col = Nothing
End Sub

为什么呢?因为Visual Basic集合会自动重新编制索引。如果您尝试以正向顺序删除,它将与外部循环冲突,从而得到棘手的错误。

另一个例子,删除集合中的所有项目可以这样做:

For i = 1 to col.Count
    col.Remove 1 'Always remove the first item.
Next i

答案 1 :(得分:4)

Collection.Remove()方法需要key(如果提供.Add()方法)或index默认情况下)作为参数,那么您无法提供用户定义的对象作为Remove()方法的参数,该方法解释了类型不匹配错误。

MSDN

上查看更多内容

如果您正在使用用户定义的类型,那么您应该使用Dictionary集合。


要实现您想要的效果,请使用迭代器

dim i as long 
for i = Collection.Count to 1 step -1
    'Collection.Remove i
next i