(VBA-Excel)高效传输大范围的方法

时间:2015-12-22 15:29:19

标签: vba excel-vba excel

我想知道,在工作簿或工作表之间传输大量单元格(大约100 000个单元格 - 10 000 x 10)会更有效:
1.复制和粘贴为值:

rng1.Copy
rng2.PasteSpecial xlValues
Application.CutCopyMode=False


2.仅传递值为.Value:

rng2.Value = rng1.value
'The ranges will be predefined to be the same size


感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

我很确定你的第二个选项是最好的,但格式化不会被转移。您可能需要考虑使用Value2,而不是使用Value提高性能。

rng2.Value2 = rng1.value2

修改1

经过一些测试后,我很惊讶地发现复制/粘贴速度更快,下面的测试速度提高了约5倍,但这是一个大多数空的范围。此外,Value2很快就会出现内存不足错误。话虽这么说,Value2是更清晰的代码,它不会消除你的剪贴板内容,需要考虑的事情。

Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Sub test()
    Dim r1, r2 As Range
    Dim t As Long

    Set r1 = Sheets("S1").Range("A1:Z100000")
    Set r2 = Sheets("S2").Range("A1:Z100000")

    'Method1
    t = GetTickCount
    r1.Copy
    r2.PasteSpecial xlValues
    Debug.Print GetTickCount - t

    'Method 2
    t = GetTickCount
    r2.Value2 = r1.Value2
    Debug.Print GetTickCount - t

End Sub

修改2

之前的测试大多是空的。使用表填充范围并使用内容填充表格显示Value2处理整个范围的速度快〜40%,但它始终处理整个范围。我怀疑差异可能是复制/粘贴具有更肤浅的优势,从而在存在空单元格时实现性能提升。