【发布时间】:2020-12-16 11:09:18
【问题描述】:
我有一个 excel 计算,它在 10 列中完成一次迭代(每组 11 列的空间 +1 列)。我的意图是使用 VBA 多次(最好是 350 或更多)复制这 11 列的范围。每次复制/粘贴范围时,计算的迭代都会引用前一组以实现“级联”效果。
我拼凑了一些 VBA 代码来完成这项任务,但处理起来非常慢,而且很难判断计算是否在迭代方案的较大端按预期工作。我添加了一个状态栏来跟踪进度,我注意到在 100 次左右的迭代后操作会停止。我目前将计数设置为 100 次迭代,因为这似乎是它挣扎的地方。
在问这个问题之前,我已经在这里寻求帮助并发现了 Application.ScreenUpdating = False 技巧,但这似乎并不能解决问题。
如何优化我目前拥有的东西?有没有更好的方法来做到这一点?
Sub CascadeCopy2()
Dim i As Integer, x As Integer
Dim count As Integer
Application.ScreenUpdating = False
count = 100
For i = 1 To count
With Sheets("Calc").Range("V3:AF250").Offset(0, x)
.Copy
.Offset(0, 11).PasteSpecial
Application.CutCopyMode = False
x = x + 11
End With
Application.StatusBar = "Progress: " & i & " of " & count & ":" & Format(i / count, "0%")
Next i
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
既然您知道起点和终点范围的大小,请尝试不使用 Copy 和 Pastespecial,而是直接使用
Sheets("Calc").Range("V3:AF250").Offset(0,x).value = Sheets("Calc").Range("V3:AF250").Offset(0,11).value复制数据,因为 Copy 使用剪贴板,速度非常慢 -
如果您的工作簿中有大量数据,在代码开头禁用自动计算可能会显着加快速度。只是不要忘记在最后启用自动计算。
-
@ENIAC 禁用自动计算确实会显着加快速度,但问题会变成用实际值填充复制的单元格。当我重新打开自动计算时,需要永远更新所有以前复制的单元格。
标签: excel vba performance loops optimization