我不喜欢在这样的论坛上提问,因为我相信每个问题都在我之前被问到,所以我只是使用搜索。但是现在我觉得自己有点愚蠢,因为这是我第一次找不到任何答案。
我有一个基于一段代码的简单问题:
Dim demo_1, demo_2 As Variant 'declare the variables
Dim DataCollection As Collection 'declare the collection
Set DataCollection = New Collection 'define the collection
demo_1 = import_demo(1, nb_var) 'load first dataset (+250 mb of memory)
demo_2 = import_demo(2, nb_var) 'load second dataset (+250 mb of memory)
因此,总的来说,我的程序使用500 MB的内存。现在我想用我对这个对象的引用来填充我的集合:
DataCollection.Add demo_1 'adding reference to a collection (+250 mb of memory Why??)
DataCollection.Add demo_2 'adding reference to a collection (+250 mb of memory Why??)
所以我重复我的问题:"为什么----?"遗憾。
如果在集合中添加对象会增加VBA中的内存使用量,因为我显然没有克隆?
答案 0 :(得分:2)
看起来你的import_demo(1, nb_var)
函数正在返回一个数组。将数组添加到集合中会添加数组的副本。如果您的函数返回250MB阵列,那么该阵列的每个副本将再添加250MB。
请参阅此简化示例:
Sub test()
Dim coll As Collection
Set coll = New Collection
Dim arr As Variant
arr = Array(1, 2, 3)
'Add the array to the collection (makes a copy)
coll.Add arr
'Change the ooriginal array
arr(0) = 4
Debug.Print coll(1)(0), arr(0) 'Prints 1,4
End Sub
但听起来你想要使用引用。为此,在将对象/类实例添加到集合之前,您的函数将需要返回它。
如果您的函数旨在返回Range
,那么您对demo_1 = import_demo(1, nb_var)
的分配是隐式调用Range.[_Default]
属性(相当于{{1} }})。要返回Range.Value
对象,您需要使用Range
关键字:Set