【问题标题】:Do Collections need more computer power than arrays?集合比数组需要更多的计算机能力吗?
【发布时间】:2018-02-28 13:23:33
【问题描述】:

在处理长字符串列表时,vba 中的集合是否不如数组高效?

我的 vba-Tool 没有我想要的那么快。我使用了很多集合,因为我不需要 REDIM,也不需要使用额外的计数变量。

例如(我想将数组 a 和集合 col 合并到一个列表中,但棘手的部分是,对于每个数组元素,都有一定数量的 col 元素):

For i = 1 To col.count
        colSave.Add "==========================="
        colSave.Add a(i - 1)
        colSave.Add "==========================="
        For k = 1 To colFilter.Item(i).count
            colSave.Add col.Item(i).Item(k)
        Next k
Next i

在这种情况下使用带有第三个计数变量的数组更有效吗?

【问题讨论】:

  • 这完全取决于您要完成的工作。例如,将单元块移入和移出数组要容易得多。
  • 一个因素是如何创建集合或数组。使用内置方法将一系列单元格读取到数组中非常有效。创建一个集合然后填充它可能效率较低,这再次取决于使用的方法。字符串最低效的方面是它们的不变性,如果您要连接,您可能想要创建一个字符串生成器。我在我的网站上发布了一个:(警告要明确:这是我自己的网站,没有广告意图!)excelpro.tech/free-downloads.php
  • 如有疑问——基准测试。
  • 一个关键问题是您是否需要动态增长数据结构。如果您发现自己在循环中使用ReDim Preserve - 尽快切换到集合。否则,除非您有充分的理由不这样做,否则请坚持使用数组。在某些情况下,您可能需要考虑使用来自 VB.Net 的 ArrayList(但可通过 CreateObject() 在 VBA 中使用)

标签: vba excel


【解决方案1】:

可能最有效的方法是在工作表的单元格中列出字符串,然后将这些单元格的范围读入数组。这是一种非常快速的方法(在相当快的 PC 上以毫秒为单位读取 100k 个单元的范围):

Sub test()

Dim a() As Variant

a = Range("A1:A1000").Value

End Sub

a 现在将包含这些字符串。

请注意,此方法生成一个以 1 为基数的多维数组,而不是以 0 为基数的数组,因此例如上例中的第一个字符串将位于索引 1,1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多