在我的程序中,我有多个collections
是数据模板。这些集合将备有数据,并在我的重复过程中被清空,然后重新填充。我已经读过,我可以这样做:set myCollection = new Collection
基本上将其清除以便重复使用。
我也见过set myCollection = Nothing
。是否有一种处理现有馆藏清理的首选方法?
答案 0 :(得分:15)
我从一篇澄清这一点的文章中提取了相关部分。 使用Set表示集合的行为与将集合设置为空时的行为不同。下一节将对此进行解释。
从集合中删除所有项目
要从集合中删除所有项目,您只需将其设置为空即可。
Set Coll = Nothing
这里需要了解的重点是,这取决于您创建集合的方式。正如我们所看到的,您可以通过使用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
这里要强调的一个细微之处在于,当您将集合设置为Nothing时,它实际上并未设置为空。因此,如果你试图将它与它进行比较它将无法正常工作。
使用Set和New
使用Set创建集合时,如果将其设置为Nothing,则必须再次创建集合。在设置为空之后的以下代码中,您必须再次使用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
全部删除 - 另类方法
以下方法也会删除集合的所有元素,但执行速度较慢。无论您以何种方式创建集合,其优点都在起作用。
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
详情请参阅The Ultimate Guide To Collections in Excel VBA by Paul Kelly