优化VBA复制/粘贴功能和循环

时间:2016-11-21 13:53:43

标签: vba loops optimization copy-paste

我有一张大型Excel表格。我对将数据从一个单元格移动到另一个单元格感兴趣。我研究了如何优化复制/粘贴功能以尽可能少的时间,并发现:

Sheet1.Range("A1").Value = Sheet1.Range("B1").Value

Sheet1.Range("A1").Copy Destination:=Sheet1.Range("B1")

比以下更快:

Sheet1.Range("A1").Copy
Sheet1.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode=False'Clear Clipboard

现在,我需要使用以下选项制作副本:

Range("A1").Select
Selection.Copy

Range("B1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False

是否可以将其转换为类似于前面提到的代码?

另外,关于循环。是否通常更快地避免它们(如果可能)或编译器如何优化?让我举个例子让你不要误解我:

假设我想复制来自" A1:A200"到" B1:B200"。那么哪种方法会更好?

Dim counter As Integer
For counter = 1 To 200
Sheet1.Range("A" & CStr(counter)) = Sheet1.Range("B" & CStr(counter))
End counter

或者仅仅使用代码更好:

Sheet1.Range("A1:A200").Copy Destination:=Sheet1.Range("B1:200")

这些例子非常简单,但如果有人能帮我理解所应用的原则,那对我来说就很有价值!

1 个答案:

答案 0 :(得分:0)

首先,请勿使用SelectSelection。这真的会减慢您的代码速度。特别是在循环中。

复制值的最快方法是执行此操作Range("B1:B99").Value=Range("A1:A99").Value

此外,您应该停用Screenupdating,特别是如果公式引用粘贴区域,请关闭工作表的自动计算:Application.ScreenUpdating=False Application.Calculation=xlCalculationManual

总的来说它应该看起来像这样:

Sub CopyFast ()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ActiveSheet.Range("B1:B99") = ActiveSheet.Range("A1:A99")

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

但是,在复制大量值时,这一点非常重要,例如in循环而不是本例中的简单复制任务。