优化 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")
这些例子确实被粗略地简化了,但如果有人能帮助我理解所应用的原则,那对我来说将是非常有价值的!
首先不要使用Select
和Selection
。这确实会减慢您的代码速度。尤其是在循环中。
复制值的最快方法就是这样做 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 循环而不是本例中的简单复制任务。
我有一个大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")
这些例子确实被粗略地简化了,但如果有人能帮助我理解所应用的原则,那对我来说将是非常有价值的!
首先不要使用Select
和Selection
。这确实会减慢您的代码速度。尤其是在循环中。
复制值的最快方法就是这样做 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 循环而不是本例中的简单复制任务。