在VBA中复制粘贴数据的"正确"方法是什么?

Raw*_*lus 4 excel performance vba copy-paste excel-vba

关于更多理论目的的问题:

/复制粘贴数据的"正确"方法是什么?

现在,至少据我所知,这三种是唯一可用的方法:

  1. (Range) .Copy([Destination])方法
  2. (Worksheet) .Paste([Destination, Link])方法
  3. (Range) .PasteSpecial([Paste], [Operation], [SkipBlanks], [Transpose])方法

现在,我做了我的研究,这些都是利弊.Copy([Destination]).Paste([Destination, Link])方法,至少那些,我能想到的:

+ 优点:

  • 允许我们将数据粘贴到与复制相同的表达式中(代码可读性我猜...?)

和:

- 缺点:

  • 细胞参考是完全没有去!
  • 你的格式和公式可能搞砸了
  • 如果范围重叠,它将显示一个提示,有效地阻止宏死在它的轨道上 (这是一个巨大的无赖,特别是如果你试图自动化的东西)
  • 更糟糕的是,如果按下Cancel提示,它将抛出Error**(除非处理)

在硬币的另一边, .PasteSpecial()

+ 优点:

  • PasteSpecial() 允许我们粘贴范围的特定部分!
  • 它允许我们指定我们想要做什么类型的粘贴
  • 有一个内置的skipBlankstranspose功能
  • 不是"所以" - 不是Error!

我努力想出任何一个,但是:

- 缺点:

  • 要写更多的字符..?

现在,这让我相信,方法的Destination论点.Copy()应该基本上被忽略,而PasteSpecial()应该总是使用.

有没有一个场合可能更适合使用它.PasteSpecial()?或者应该PasteSpecial()是每次复制粘贴操作的标准?

Mat*_*don 9

这与您的可读性或您输入的字符数无关.这是你需要实现的目标.

换句话说,它绝对不是主观的或基于意见的,并且像编程中的其他所有内容一样......

#这取决于.

如果您正在使用Excel和复制粘贴单元格,您是否Ctrl+ CCtrl+ V或使用粘贴特殊

取决于你需要做什么.

  • 如果您的意思是复制单元格,其值,格式,数据验证,边框等; 那.Paste [Destination]是你最好的朋友.这是Ctrl+ C/ Ctrl+ 的程序化等价物V......相当于PasteSpecial/All,这是过度的,因为.Paste [Destination]在这种情况下已经完成了你需要做的一切.

    细胞参考是完全没有去!

    绝对.硬编码的单元格引用很糟糕..Paste [Destination]无论如何都不会强迫你这么做,所以重点是没有实际意义.

    如果范围重叠,它将显示一个提示,有效地阻止宏在其轨道中死亡

    复制和粘贴范围不能重叠,期间.你也会得到那个提示.PasteSpecial.

  • 如果你的意思是复制一个单元格Value,而不是它的格式,数据验证,边框等; 然后.PasteSpecial绝对是一个更好的主意,因为这是程序上相当于粘贴特殊/值 - 除了它可能更有效地分配单元格Value与你想要的(不需要往返剪贴板); OTOH,如果你的意思是粘贴格式或数据验证,或诸如此类的东西,那么这可能是最简单的方法.

Paste不会"搞乱"格式.它完全符合它的意义.Paste并且PasteSpecial等同物.使用正确的工具完成工作.它们分别是"粘贴"和"粘贴特殊"的程序化等价物 - 如果你在Excel中并系统地"粘贴特殊",你将完成你的工作.但每当你这样做"粘贴所有"时,你就会比你需要的更努力.

PasteSpecial看起来像一把漂亮的锤子,但不是一切都是钉子.当你可以避免剪贴板写入时,通常最好避免它...但是,如果你正在处理大量数据集(想想100K +单元格),那么它可能比仅仅分配值更好.

那说:

@ScottCraner我确实考虑过它,但这不是真正的复制粘贴,而是更多典型的指针引用,因此我决定不将它包含在我的问题中.我不想打开一本关于"什么算作复制粘贴"讨论的书.

那是错的..Range(foo).Value = .Range(bar).Value不是"典型的指针引用".它实际上将值foo转换为2D变体数组,并将该2D变体数组转储到上面bar,覆盖以前保存的值.因此,它绝对是一个完全有效的替代方法来击中剪贴板 - 但是你需要测试并与Copy+ PasteSpecial进行比较,以确定这是否是适合您情况的最佳(/最有效)解决方案:

Testing with 1500000 cells (100000 rows)
Pasting from clipboard, single operation: 324.21875ms
Setting cell values, single operation:    1496.09375ms


Testing with 150 cells (10 rows)
Pasting from clipboard, single operation: 11.71875ms
Setting cell values, single operation:    3.90625ms
Pasting from clipboard, iterative:        1773.4375ms
Setting cell values, iterative:           105.46875ms
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,"它取决于"的事实就是答案,表明这个论坛的问题不对.你把它归类为意见可能是错误的,但这对于这个论坛来说太广泛了.再次,这是我的意见.但我喜欢这个答案. (2认同)