【发布时间】:2019-01-20 10:50:19
【问题描述】:
在 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-prone!
我很难想出任何办法,但是:
缺点:
- 还要写一些字符吗?
现在,这让我相信,.Copy() 方法的 Destination 参数本质上应该被忽略,而应该始终使用 PasteSpecial()。
是否有过使用它比.PasteSpecial() 更可取的情况?还是 PasteSpecial() 应该成为每个复制粘贴操作的标准?
【问题讨论】:
-
你忘记了直接赋值:
Range().Value = Range().Value -
你不忽略Worksheet.Paste Method吗?
-
“一劳永逸地解决讨论” - 嗯......祝你好运!如果符合需要,我认为
.Copy()没有任何问题。 -
我不得不承认,想一想我过去在哪里/何时使用过任何一个,答案是,我很少使用任何一个。我通常只是将范围复制到一个变体,处理数据并将其转储回来。如果我需要格式化,我会在之后进行,但要整体进行。
-
@DavidZemens “没有什么能比得上直接赋值的表现” 我也这么认为,但后来我最近是proven otherwise;鉴于 非常大 的数据集,我惊讶地发现直接分配实际上被剪贴板打败了。
标签: excel vba performance copy-paste