清理收藏品的理想方式

Jos*_*son 12 excel vba excel-vba

在我的程序中,我有多个collections是数据模板.这些集合将备有数据,并在我的重复过程中被清空,然后重新填充.我已经读过,我可以这样做:set myCollection = new Collection基本上将其清除以便重复使用.

我也见过set myCollection = Nothing.是否有一种处理现有馆藏清理的首选方法?

小智 17

我从文章中提取了相关部分,澄清了这一点.使用Set表示集合的行为与将集合设置为空时的行为不同.下一节解释了这一点.

从集合中删除所有项目

要从集合中删除所有项目,您只需将其设置为空即可.

Set Coll = Nothing
Run Code Online (Sandbox Code Playgroud)

这里需要了解的重点是,这取决于您创建集合的方式.正如我们所看到的,您可以通过使用New或使用Set和New来声明来创建Collection.让我们看看这两种类型

声明使用新的

如果将此集合设置为空,则将其设置为"未设置对象"的状态.添加新项目时,VBA会自动将Collection变量设置为有效集合.

换句话说,如果您将集合设置为空,它将清空所有项目.如果您随后将一个项目添加到集合中,您现在将拥有一个包含一个项目的集合.这使得清空集合变得简单.

以下代码演示了这一点.

Sub EmptyColl()

    ' Create collection and add items
    Dim coll As New Collection

    ' add items here

    ' Empty collection
    Set coll = Nothing

    ' Add item
    coll.Add "Pear"

End Sub
Run Code Online (Sandbox Code Playgroud)

这里要强调的一个细微之处在于,当您将集合设置为Nothing时,它实际上并未设置为空.因此,如果你试图将它与它进行比较它将无法正常工作.

使用Set和New

使用"设置"创建集合时,如果将其设置为"无",则必须再次创建该集合.在设置为空之后的以下代码中,您必须再次使用new进行设置.如果不这样做,您将收到错误:"对象变量或未设置块变量".

Sub EmptyCollSet()

    ' Create collection
    Dim coll As Collection
    Set coll = New Collection

    ' Add items here

    ' Empty collection
    Set coll = Nothing

    ' SET TO NEW BEFORE USING
    Set coll = New Collection

    ' Add item
    coll.Add "Pear"

End Sub
Run Code Online (Sandbox Code Playgroud)

全部删除 - 另一种方法

以下方法也将删除集合的所有元素,但这是一种较慢的方法.无论您以何种方式创建集合,其优点都将起作用.

Sub RemoveAll(ByRef coll As Collection)

    Dim i As Long
    For i = coll.Count To 1 Step -1
        coll.Remove i
    Next i

End Sub
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Paul Kelly撰写的Excel VBA中的终极指南