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

时间:2018-08-13 16:35:36

标签: excel vba excel-vba performance copy-paste

  

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

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

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

  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()是每个复制粘贴操作的规范?

1 个答案:

答案 0 :(得分:9)

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

换句话说,它绝对不是主观的或基于观点的,并且几乎与编程中的其他所有内容一样……

#ItDepends。

如果您正在使用Excel并在其周围粘贴粘贴单元格,请执行 Ctrl + C Ctrl + V < / kbd>或使用特殊粘贴

取决于您需要做什么。

  • 如果要复制单元格,请复制其值,格式,数据验证,边框等;那么.Paste [Destination]是您最好的朋友。相当于 Ctrl + C / Ctrl + V 的程序化等效项...相当于PasteSpecial / All,后者由于.Paste [Destination]在这种情况下已经完成了您需要做的所有事情,因此显得过于杀手。

      

    单元格引用是完全不可行的!

    绝对。硬编码的单元格引用是不好的。 .Paste [Destination]仍然不会强迫您这样做,所以要点很重要。

      

    如果范围重叠,则会显示提示,有效地阻止宏死在其轨迹中

    复制和粘贴范围不能重叠,期间。您也会通过.PasteSpecial收到提示。

  • 如果您要复制单元格的Value,请但不复制其格式,数据验证,边框等;那么.PasteSpecial绝对是一个更好的主意,因为这与 paste special / values 粘贴在程序上是等效的-只是将单元格的Value分配给您想要的内容可能更有效(无需往返于剪贴板); OTOH如果您这样做是要粘贴格式或数据验证,否则,这可能是最简单的方法。

Paste不“混乱”格式。它确实完成了它的意思。 PastePasteSpecial不是等价物。使用正确的工具完成工作。从字面上看,它们分别是“粘贴”和“特殊粘贴”的程序等效项-如果您在Excel中并且系统地进行“特殊粘贴”,则可以完成工作。但是每次执行此操作以“全部粘贴”时,您的工作就会比需要做的要努力。

PasteSpecial看起来像是一把漂亮的锤子,但并非所有东西都是钉子。当可以避免剪贴板写入时,通常最好避免这种情况……但是,if you're dealing with huge data sets(认为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