2016-11-30 25 views
1

我写了一个简单的代码来重现问题:VBA在Excel中:画面冻结了此前连续复印了几秒钟,粘贴

Sub test() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    For i = 1 To 1000 
     Range("A" & i).Copy Destination:=Range("B" & i) 
    Next 
    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
End Sub 

如果我执行上面的程序块,在完成程序后,在将控制权释放给用户之前,屏幕将冻结约5秒钟。

如果我更改副本的次数(从1000代码中的其他值),我可以看到冻结时间与副本数成正比。

这是我的电脑的问题,还是实际发生在每台电脑上?我该如何解决这个问题?

+0

上的一篇文章你确定它冻结后,不会在? – GSerg

+0

是的,我试图添加一个用户窗体,将在循环后弹出。我只能在5秒后关闭用户表单。 – Pingu

+0

可能是关于计算,但它不应该真的取决于迭代次数,因为它会在每次迭代之后重新计算。尽管尝试关闭自动计算。 – GSerg

回答

1

我不认为这是一个孤立的问题,因为我在计算中遇到类似的滞后时间(与正确指出的迭代上限成比例)。它只是遗憾地迭代复制和/或粘贴的结果,因为这(我发现)在VBA中比大多数事情需要更长的时间(并最终减慢代码)。什么可能是值得一试的是以下几点:

Sub test() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    For i = 1 To 1000 
     'Range("A" & i).Copy Destination:=Range("B" & i) 
     Cells(i, 2).Value = Cells(i, 1).Value 
    Next 
    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
End Sub 

技术上它完全一样的事情为你的代码,但没有复制。我不确定这将如何与您的实际工作联系起来(与此例相反),但我发现在我的机器上运行更快捷。

基本上,我的观点是,在大型迭代中复制和/或粘贴在VBA句柄中速度很慢,所以我的建议是尽量避免。良好的链接如下:)

http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm

+0

是的,确实以这种方式复制是更快,它现在好多了:)谢谢 – Pingu