VBA:将对象添加到集合会增加内存使用量

时间:2017-07-16 11:31:16

标签: excel vba excel-vba memory collections

我不喜欢在这样的论坛上提问,因为我相信每个问题都在我之前被问到,所以我只是使用搜索。但是现在我觉得自己有点愚蠢,因为这是我第一次找不到任何答案。

我有一个基于一段代码的简单问题:

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中的内存使用量,因为我显然没有克隆?

1 个答案:

答案 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