【问题标题】:(VBA-Excel) Efficient way to transfer a large range(VBA-Excel) 大范围传输的有效方法
【发布时间】:2015-12-22 15:29:18
【问题描述】:

我想知道,对于在工作簿或工作表之间传输大量单元格(大约 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


提前感谢您的帮助!

【问题讨论】:

  • 我建议rng2.Value2 = rng1.value2
  • range v array 可能会有所帮助

标签: vba excel


【解决方案1】:

我很确定您的第二个选项是最好的,但不会传输格式。您可能需要考虑改用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%,但它总是处理整个范围。我怀疑不同之处可能在于复制/粘贴具有更肤浅的优势,从而在存在空单元格的情况下实现性能提升。

【讨论】:

  • 我不能说我很惊讶,就像查找和替换通常是在 word 中做大多数事情的最有效方式一样 - 在通过 vba 与办公应用程序交互时,显而易见的方法很少是最有效的。感谢上帝,我们现在可以使用 linq to xml 完成这一切 :)
  • @NickDewitt 是的,也许复制/粘贴可以更快,因为它更肤浅。进一步的测试表明,当数组完全充满方程式时,它的速度会慢约 40%……顺便说一句,只是好奇,你能看出这个答案被否决的任何原因吗?
  • 不,它更高效,因为它不是用 vba 编写的,office 处理剪贴板的方式与其他程序有点不同——尤其是在 office 应用程序之间粘贴时。我想知道移动底层 xml 是否更快(我猜是这样) - 现在没有时间测试。我不知道为什么,但我猜是因为你是pretty sure 而不是have tested and come up with the answer
  • 感谢您抽出宝贵的时间。我想我应该开始更频繁地使用 value2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2014-03-02
  • 2016-05-04
  • 1970-01-01
相关资源
最近更新 更多