【发布时间】:2021-01-31 07:47:57
【问题描述】:
核心问题
如何尽可能高效地(从性能方面)在一个范围内重复执行CountIf()s?
详细问题
范围到数组
由于对电子表格的每次读/写都会导致 VBA 代码变慢,因此建议尽可能少地这样做。通常情况下,如果有人重复读/写某个范围,他或她应该首先将该范围保存到一个数组中,对数组执行操作,然后在必要时对电子表格进行最后的读取或写入。
示例值和代码
如何在上面的A2:A11 范围内使用执行CountIf()s 来计算每个值的计数并将它们写入D2:D7?我希望下面的代码可以工作:
Sub M1ArrayCount()
Dim arrNumbers() As Variant
Dim Long1 As Long
Dim Loop1 As Long
arrNumbers() = ThisWorkbook.Sheets(1).Range("A2:A11").Value
With ThisWorkbook.Sheets(1)
For Loop1 = 1 To 6
.Cells(Loop1 + 1, 4).Value = Application.CountIf(arrNumbers(), Loop1)
Next Loop1
End With
End Sub
CountIf() 不适用于数组
但是,因为Application.CountIf() 仅适用于范围而不适用于数组,所以D2:D7 在运行上述代码后都会显示#VALUE! 错误。必须找到替代品。
【问题讨论】:
-
这个问题的答案将取决于您的数据集有多大。 “要测试的范围”有多少行,“值”有多少行?
-
确实如此 - 我打算为大型数据集提供此答案,但没有具体说明。我自己的数据集是 90,000 行。