【发布时间】:2020-08-11 20:08:52
【问题描述】:
我的代码如下:
-
刷新一个大约有 10000 行的查询。
-
根据一些标准将数据拆分为各种二维数组(我总共有十几个不同的二维数组)。
-
将每个二维数组粘贴到不同的工作表中。
当我第一次运行宏需要约 18 秒,第二次运行约 30 秒,第三次运行约 35 秒,第四次运行约 45 秒,依此类推。每次运行时查询的数据都完全相同(变化不会那么频繁,或者最多可以变化一两行)。
如果有一些我不知道的记忆问题,有人可以解释一下吗?我还尝试在将矩阵粘贴到工作表之后将矩阵设置为等于 Nothing,但这并没有改变每次运行时的减速。任何帮助将不胜感激。
附:代码很长,我觉得把它都贴在这里也没有用。它的工作原理或多或少如下:
Sub GetMatrix()
Dim Matrix As Variant, IndexMatrix As Long, i As Long, NoRows As Long
IndexMatrix = 0
ReDim Matrix(IndexMatrix, 2)
NoRows = Application.CountA(Range("A:A"))
For i = 2 To NoRows
If Cells(i, 1) = "Something" Then
Matrix(IndexMatrix, 0) = "Something"
Matrix(IndexMatrix, 1) = "Something"
Matrix(IndexMatrix, 2) = "Something"
IndexMatrix = IndexMatrix + 1
ReDim Preserve Matrix(IndexMatrix, 2)
End If
Next
GetMatrix = Matrix
End Sub
【问题讨论】:
-
我不知道这里有什么问题。但在性能问题的情况下,我会首先摆脱缓慢的 ReDim Preserve(大数组并最终缩小或收集?)。为什么不将单元格读取到数组中?在每次迭代中从工作表中读取也非常慢。将整个范围读取到数组中,然后检查是否等于“某物”
-
第一次运行大约 18 秒,这对我来说没问题。因此 Redim Preserve 或从工作表中读取单元格不是问题。我有一种感觉,我以某种方式用我正在创建的 2D 数组来归档内存。我不确定这一点。
-
所以在 Locals Window 中检查一下,尤其是第二次迭代
-
GetMatrix是一个必须返回变体的函数吗?否则,为什么是最后一行代码 (GetMatrix = Matrix)? -
是的,我的错,GetMatrix 是一个函数,而不是一个子