Set myCollection = Nothing
技术都花费了太长时间以无法清除收藏。如果我不清除它,我的代码通常在后台执行清理时结束。
有一种快速的方法可以清除VBA中的收集吗?我如何避免这个问题?
注:逐项删除技术(
collection.Remove(i)
)也花费了太长时间。
我尝试使用我在互联网上看到的所有主要解决方案:
Set myCollection = New Collection
Set myCollection = Nothing
collection.Remove(i)
这种缓慢行为的原因不是清除集合,而是所有对象都需要被破坏的事实。 每当删除对它们的最后一个引用时,VBA中的对象就会被销毁。您可以通过创建两个集合并将对象添加到两个集合中来轻松证明这一点:清除第一个集合将立即运行(方法不起作用),因为没有任何对象都被破坏。
Sub testSub()
Const maxEntries = 100000
Dim c1 As New Collection, c2 As New Collection
Dim i As Long
For i = 1 To maxEntries
' Create dummy object
Dim o As Class1
Set o = New Class1
o.s = "Test" & i
o.v = i * 1.23
c1.Add o, CStr(i)
c2.Add o, CStr(i)
Next
Debug.Print "Start to clear " & Now
Set c1 = New Collection
Debug.Print "First collection cleared " & Now
Set c2 = New Collection
Debug.Print "Second collection cleared " & Now
Debug.Print "Done " & Now
End Sub
Start to clear 17.03.2025 09:32:03
First collection cleared 17.03.2025 09:32:03
Second collection cleared 17.03.2025 09:32:08
Done 17.03.2025 09:32:08
您可以看到,清除第二个系列花了5秒,而第一个收藏可以立即清除。如果您不清除集合,则在代码完成时出现相同的等待时间。I don't think that you can to anything against that.您可以通过一一删除元素并添加一些序列来减轻效果。这样,用户就可以继续在Excel上做些事情。但是,您需要注意用户的工作不会干扰宏运行。请注意,
DoEvent
DoEvent