更多关于理论目的的问题:
在vba / excel-vba中复制粘贴数据的“正确”方法是什么?
现在,至少就我所知,这三种是唯一可用的方法:
Range
) .Copy([Destination])
方法Worksheet
) .Paste([Destination, Link])
方法Range
) .PasteSpecial([Paste], [Operation], [SkipBlanks], [Transpose])
方法现在,我进行了研究,它们是 .Copy([Destination])
的优缺点和 .Paste([Destination, Link])
方法,至少是那些我能想到的方法:
+
优点:
- 允许我们以与复制(我猜代码可读性..?)
相同的表达式粘贴数据
和:
-
缺点:
- 单元格引用是完全不可能的!
- 您的格式和公式可能会弄乱
- 如果范围重叠,它将显示一个提示,有效地阻止宏死在其轨迹中(这是一个巨大的遗憾 尤其是如果您要自动执行某些操作)
- 更糟糕的是,如果您在提示符下按
Cancel
,它将抛出Error
**(除非处理)
硬币的另一面, .PasteSpecial()
+
优点:
PasteSpecial()
允许我们粘贴范围的特定部分!- 它使我们可以指定要执行的粘贴类型
- 具有内置的
skipBlanks
和transpose
功能Error
并非如此容易!
我努力提出任何建议,但是:
-
缺点:
- 再写一些字符..?
现在,使我相信,Destination
方法的.Copy()
自变量实际上应被忽略,而应始终使用PasteSpecial()
。
是否曾经有过使用.PasteSpecial()
的情况?还是PasteSpecial()
是每个复制粘贴操作的规范?
答案 0 :(得分:9)
这与可读性或输入的字符数无关。这与您需要实现的目标有关。
换句话说,它绝对不是主观的或基于观点的,并且几乎与编程中的其他所有内容一样……
如果您正在使用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
不“混乱”格式。它确实完成了它的意思。 Paste
和PasteSpecial
是不是等价物。使用正确的工具完成工作。从字面上看,它们分别是“粘贴”和“特殊粘贴”的程序等效项-如果您在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