优化 VBA copy/paste 函数和循环

Optimizing VBA copy/paste functions and loops

我有一个大Excelsheet。我有兴趣将数据从一个单元格移动到另一个单元格。我研究了如何优化 copy/paste 函数以尽可能减少时间,发现:

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")

这些例子确实被粗略地简化了,但如果有人能帮助我理解所应用的原则,那对我来说将是非常有价值的!

首先不要使用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 循环而不是本例中的简单复制任务。