Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 清理藏品的理想方式_Vba_Excel - Fatal编程技术网

Vba 清理藏品的理想方式

Vba 清理藏品的理想方式,vba,excel,Vba,Excel,在我的过程中,我有多个集合,它们是数据的模板。在我的重复过程中,这些集合将存储数据、调用数据,然后清空以重新填充。我已经读到我可以做:设置myCollection=newcollection从本质上清除它以供重用 我还看到了设置myCollection=Nothing。有没有更好的方法来处理现有集合的清除工作?我从一篇文章中提取了相关部分,阐明了这一点。 “使用集合”表示集合的行为与将集合设置为“无”时不同。下一节将对此进行解释 从集合中删除所有项目 要从集合中删除所有项,只需将其设置为“无”

在我的过程中,我有多个
集合
,它们是数据的模板。在我的重复过程中,这些集合将存储数据、调用数据,然后清空以重新填充。我已经读到我可以做:
设置myCollection=newcollection
从本质上清除它以供重用


我还看到了
设置myCollection=Nothing
。有没有更好的方法来处理现有集合的清除工作?

我从一篇文章中提取了相关部分,阐明了这一点。 “使用集合”表示集合的行为与将集合设置为“无”时不同。下一节将对此进行解释

从集合中删除所有项目

要从集合中删除所有项,只需将其设置为“无”

Set Coll = Nothing
这里需要理解的一点是,这取决于您如何创建集合。正如我们所看到的,您可以通过使用New或Set和New声明来创建集合。让我们看看这两种类型

使用新的声明

如果将此集合设置为“无”,则它将设置为“未设置对象”的状态。添加新项目时,VBA会自动将集合变量设置为有效集合

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
换句话说,如果将集合设置为“无”,它将清空所有项。如果随后将项目添加到集合中,则现在将有一个包含一个项目的集合。这使得清空集合变得简单

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
下面的代码演示了这一点

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时,它实际上并没有设置为Nothing。因此,如果你试图将它与存在进行比较,它将不起作用

使用Set和New

使用Set创建集合时,如果将集合设置为Nothing,则必须再次创建集合。在以下代码中,设置为“无”后,必须再次使用“新建”进行设置。如果不这样做,您将得到错误:“未设置对象变量或With block Variable”

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

有关详细信息,请参阅

++《新代码》gotcha正是我在中添加“本地对象变量是自分配的”代码检查的原因-知道这一点的人太少了!那么,对象引用到底发生了什么呢?当您将集合设置为“无”“时,它们将被完全释放?您的示例仅显示值类型项(字符串不是VBA中的对象),通过在紧密循环中添加1024 x
New Class1
引用,在task manager中监视EXCEL.EXE进程,刚刚测试了这两个项;记忆泄漏似乎是一个故事,当时间很晚的时候,它会吓唬孩子们——取消引用就行了。@Mat's Mug很抱歉,因为我刚刚睡了一夜才起床。我对你的经验深表敬意,并将仔细考虑你提到的两个要点。对备选方案及其权衡的出色、简洁的解释。非常感谢!另外,需要注意的是,第二次“Set coll=New Collection”(设置coll=New Collection)而不首先将coll设置为Nothing,将在创建新的空集合之前自动取消分配旧集合的项。如果在函数中使用
myCollection
,它将在函数结束时被垃圾收集。您可以在循环中调用此函数,而不是手动分解对象。