【发布时间】:2020-09-26 16:37:50
【问题描述】:
我有两个工作表。第一个(计算)包含 10.000 行,其中包含许多 RTD 公式和不同的计算。第二个(观察者)观察第一个。
我有一个每秒运行的 VBA 脚本并检查工作表 1(计算)的每一行。如果循环在工作表 1 上找到一些标记的数据,则它将一些数据从 WS1 复制到 WS2。
解决方案 1:循环检查 10.000 行
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For I = 1 To 10000
If CStr(.Cells(I, 1)) = "X" Then
'DO SOME SUFF (copy the line from WS 1 to WS2)
'Find first empty row
LR2 = WS2.Cells(15, 1).End(xlDown).Row + 1
'Copy data from WS1 to WS2
WS1.Range(.Cells(I, 1), .Cells(I, 14)).Copy
WS2.Cells(LR2, 1).PasteSpecial xlValues
End If
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
解决方案 2:带有小循环的数组函数
我可以使用 Excel 数组而不是 10.000 行循环来观察 10.000 行并用较小的数组做一些事情吗?
在工作表 2 上,我会有以下代码:(A1:O15)
{=index(Calculation!A$1:$O$10000; .....)....))}
我将再次通过 15 行数组函数进行更小的循环:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For K = 1 To 15
If CStr(.Cells(I, 1)) = "X" Then
'Find first empty row
LR2 = WS2.Cells(15, 1).End(xlDown).Row + 1
'Copy data from WS1 to WS2
WS1.Range(.Cells(I, 1), .Cells(I, 14)).Copy
WS2.Cells(LR2, 1).PasteSpecial xlValues
End If
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
我想知道哪种方案的性能更好。
我不确定超过 10.000 行的 Excel 数组是否具有良好的性能。 15-rowLoop 肯定比 10000-row-Loop 快。
我不知道如何衡量与数组相关的 15 行循环(观察 10.000 行)是否更快。
【问题讨论】:
-
计时结果如何(用手表)?两者都是“眨眼间”,还是明显变慢?细化差异的时机并没有多大意义。或者如果没有注意到,就在乎,除非它会运行很多很多次。
-
我的看法是数组公式
{=index(Calculation!A$1:$O$10000; .....)....))}对于excel计算来说确实很重,我不建议在大型集上使用它。如果您对性能非常感兴趣,我的建议是创建一个 VBA 数组。 Performance difference between looping range vs looping array。我刚刚将工作宏从循环转换为数组解决方案,速度性能非常重要。对于 45 000 行,我节省了 50-20 分钟。 -
请尝试解释“DO SOME SUFF (copy the line from WS 1 to WS2)”是什么意思。最耗费时间和资源的将是您的代码在 WS2 中的编写方式。如果将处理后的结果添加到工作表的末尾,则要加载并立即删除结果的数组将有很大帮助。如果需要从第一个工作表的 x 行复制到第二个工作表的同一行,则数组解决方案更好但不是很好。我的意思是,对于 100k 范围,迭代本身需要不到一秒的时间,而数组大约需要 10 毫秒。重要的是您的代码写入
WS2的方式。 -
@Wizhi:谢谢,我明天试试。
-
@FaneDuru 我的脚本正在将一些单元格从 WS1 复制到 WS2。 (我稍微编辑了原始帖子 - 见上文)
标签: arrays excel vba excel-2016