哪种复制方法更快? Excel VBA

时间:2015-08-12 23:00:23

标签: excel vba excel-vba

我将多次重复VBA模块的一部分,我想确保我这样做是最有效的方式。最有效意味着最快的加载时间。

基本上,我正在从wb2上的某个范围复制数据并将其粘贴到wb1目的地。

第一种方法似乎更容易,因为它更短:

wb2.Sheets(1).Range(Cells(2, TrpCdBLCol), Cells(100, TrpCdBLCol)).Copy wb1.Sheets("BL Import").Cells(2, TrpCdCol)

第二种方法我将两个变量声明为范围,设置它们和复制

Dim CopyRange As Range, Dest As Range
    Set CopyRange = wb2.Sheets(1).Range(Cells(2, TrpCdBLCol), Cells(100, TrpCdBLCol))
    Set Dest = wb1.Sheets("BL Import").Cells(2, TrpCdCol)
    CopyRange.Copy Dest

是否有任何差异或比其他方式更好? 谢谢!

3 个答案:

答案 0 :(得分:3)

您可以从range1到range2获取相同的内容,而无需通过以下方式进行复制和粘贴:

  1. 从Range1直接在Range2中设置值(此方法复制值,可用于计算公式,但不能用于格式)
  2. 使用变体数组(添加步骤)
  3. 在我的测试中,第一个选项在第二个时间的2/3运行 - 这可能是由于额外的步骤。

    更新:高效技术

    • 使用而不是整数Why Use Integer Instead of Long?
    • 使用 Value2 而不是 Value ,请参阅Charles Williams的帖子here
    • 如果您正在操作数据并将其写回工作表,请使用变量数组,而不是范围对象。如果您正在使用字符串,那么here是有效编码的一站式参考

    选项1

    Sub Recut1()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim TrpCdBLCol As Long
    
    TrpCdBLCol = 1
    Set ws1 = Sheets(1)
    Set ws2 = Sheets(2)
    
    vArr = ws1.Range(ws1.Cells(2, TrpCdBLCol), ws1.Cells(100, TrpCdBLCol))
    ws2.Range(ws2.Cells(2, TrpCdBLCol),ws2.Cells(100, TrpCdBLCol)).Value2 = vArr
    
    End Sub
    

    选项2

    Sub Recut2()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim TrpCdBLCol As Long
    Set ws1 = Sheets(1)
    Set ws2 = Sheets(2)
    TrpCdBLCol = 1
    
    ws2.Range(ws2.Cells(2, TrpCdBLCol), ws2.Cells(100, TrpCdBLCol)).Value2 = ws1.Range(ws1.Cells(2, TrpCdBLCol), ws1.Cells(100, TrpCdBLCol))
    
    End Sub
    

答案 1 :(得分:2)

两个选项之间唯一(非常轻微)的性能差异是第二个选项将执行创建另外两个Range对象的额外操作

复制数据时与性能相关的主要考虑因素是,如果您需要格式化单元格(颜色,字体等),这需要在幕后进行大量工作,但最好自己动手。如果您不需要格式化,您可以立即获得显着的性能提升

为了可维护性,第二个选项更好,但您还应该使用显式引用所有对象(包括Cells()),并完全绕过剪贴板。此外,无需重复代码:创建一个共享子,将2个工作表作为参数

Option Explicit

Public Sub copyData(ByRef wsFrom As Worksheet, ByRef wsTo As Worksheet)

    With wsFrom
        Set copyRange = .Range(.Cells(2, TrpCdBLCol), .Cells(100, TrpCdBLCol))
    End With

    With wsTo
        Set destRange = .Range(.Cells(2, TrpCdBLCol), .Cells(100, TrpCdBLCol))
    End With

    destRange.Value2 = copyRange.Value2

End Sub

并使用此行从您需要的任何工作表中调用它:

copyData wb2.Worksheets(1), wb1.Worksheets("BL Import")

答案 2 :(得分:0)

我可能会完全跳过复制并使用数组。例如:

Sub CopyWithoutCopying()
Dim MyArr As Variant
    MyArr = Application.Transpose(Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row))
    Sheets("Sheet2").Range("A1").Resize(UBound(MyArr), 1) = Application.Transpose(MyArr)
End Sub

这会将A列中的数据复制到名为Sheet2 column A

的工作表中