为什么有集合时在VBA中使用数组?

时间:2012-05-14 07:59:28

标签: arrays excel vba excel-vba

许多人在Excel / VBA中使用大量数组来存储数据列表。但是,在我看来,有一个集合对象非常方便(主要是:不需要重新定义列表的长度)。

所以,我真诚地问我自己是否遗漏了什么?为什么其他人仍然使用数组来存储数据列表?它只是过去的宿醉?

3 个答案:

答案 0 :(得分:35)

使用数组而不是集合(或词典)的几个原因:

  • 您可以使用Range("A1:B12") = MyArray
  • 轻松地将数组转移到范围(反之亦然)
  • 集合只能存储唯一键,而数组可以存储任何值
  • 集合必须存储一对(键,值),而您可以存储数组中的任何内容

有关更好理解的数据,请参阅Chip Pearson's article

更好的问题是为什么人们会使用集合而不是字典(好吧,集合是标准的VBA,而你必须导入字典)

答案 1 :(得分:18)

@CharlesWilliams答案是正确的:循环遍历数组的所有值比迭代Collection或字典更快:所以,当我需要时,我总是使用字典的Keys()或Items()方法这样做 - 两个方法都返回一个矢量数组。

注意:我使用Dictionary类远比使用集合更多,Exists()方法太有用了。

收藏和词典存在或当然存在缺陷。其中之一是数组可以是2维甚至3维 - 对于制表数据来说,这是一个更好的数据结构。你可以将数组存储为集合的成员,但是有一些缺点:其中一个是你可能没有得到对该项的引用 - 除非你使用 arrItem = MyDictionary(strKey)你会几乎可以肯定得到阵列的'ByVal'副本;如果您的数据是动态的,那么这很糟糕,并且可能会受到多个流程的影响。它也很慢:大量的分配和释放。

最糟糕的是,如果我有一个带有数组(或对象!)的集合或字典作为成员,我不太相信VBA会释放内存:不是超出范围,而不是Set objCollection = Nothing甚至不是objDictionary.RemoveAll - 很难证明VBE中可用的有限测试工具包存在问题,但我在使用字典中的数组的应用程序中看到了足够的内存泄漏,知道你需要谨慎。话虽这么说,我从不使用没有Erase命令的阵列。

@JMax解释了数组的另一大优点:你可以在工作表的单个“点击”中填充一个数组,并在一次点击中回写你的工作。

当然,您可以通过构建索引数组类来获得两全其美:具有关联集合的二维数组或存储某种行标识符作为键的字典对象,以及行序数作为数据项目。

答案 2 :(得分:4)

自动调整大小的集合较慢(从理论上讲,不同的实现显然会有自己的里程)。如果您知道自己有一定数量的条目,并且只需要以线性方式访问它们,那么传统的数组就是正确的方法。