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

tyr*_*rex 40 arrays excel vba excel-vba

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

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

JMa*_*Max 36

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

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

请参阅Chip Pearson关于数组的文章,以便更好地理解

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

  • 集合不必存储密钥,它是可选的.集合还可以存储任何值,只有键(如果使用它们)必须是唯一的. (16认同)
  • 数组可以存储用户定义类型(UDT),而集合则不能. (6认同)
  • 此外,数组的执行效果优于集合(当您无法直接索引到数组时,键查找访问除外). (4认同)
  • @schmijos你是对的,但集合可以存储用户定义的类 (3认同)

Nig*_*nan 18

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

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

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

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

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

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