45

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

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

4

3 回答 3

41

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

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

请参阅Chip Pearson关于数组的文章以获得更好的理解

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

于 2012-05-14T08:44:14.540 回答
20

@CharlesWilliams 的答案是正确的:遍历数组的所有值比迭代集合或字典要快:如此之多,以至于当我需要这样做时,我总是使用字典的 Keys() 或 Items() 方法-两种方法都返回一个向量数组。

注意:我使用 Dictionary 类的次数远远多于使用集合,Exists() 方法太有用了。

收藏和字典当然也有缺点。其中之一是数组可以是 2 维甚至 3 维的——对于表格数据来说,这是一种更好的数据结构。您可以将数组存储为集合的成员,但这样做有一些缺点:其中之一是您可能无法获得对该项目的引用 - 除非您使用,否则您 arrItem = MyDictionary(strKey)几乎肯定会获得数组的“ByVal”副本;如果您的数据是动态的,并且会受到多个进程的更改,那就不好了。它也很慢:大量的分配和释放。

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

@JMax 解释了数组的另一个重要优点:您可以在工作表的单个“命中”中填充数组,并在单个“命中”中写回您的工作。

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

于 2012-05-15T13:01:37.343 回答
4

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

于 2012-05-14T08:07:06.667 回答