Excel VBA:复制值时跳过剪贴板



我正试图将信息从一个文件复制到另一个文件。正如这里所读的,有更多和更少的有效方法来做到这一点。

目前,我正在使用一种效率较低的方法:

Target_Sheet.Cells.Copy
ThisWorkbook.Sheets("Name").Range("A1").PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False

这在我的Excel(2016,64位(上有效,但在一些计算机上我会出现内存不足错误。然而,当我尝试以下语句时,我立即得到了一个内存不足的错误:

ThisWorkbook.Sheets("Name").Cells.Value = Target_Sheet.Cells.Value

为什么会发生这种情况?这种方法应该更有效

或者,我想使用复制方法,并使用以下代码绕过剪贴板。但是,我如何指定我只想要值呢?

Sheet1.Range("A1:A200").Copy Destination:=Sheet2.Range("B1")

所以你的帖子中有几个问题:

1.为什么会发生这种情况

因为您正在处理整个单元格集。这太大了,因此出现了"内存不足"的错误。代码中的错误位是这部分:.Cells.Value。为了防止以所有单元格为目标,您需要指定一个范围,如下所述。

2.如何使用仅具有值的复制/粘贴

实际上,唯一的方法是按照你最初写它的方式(除了.Cells部分(,用你的"效率较低的方法"。您首先复制范围,然后将其存储在剪贴板中,然后确定目标,最后使用"粘贴"功能。关于"粘贴"与"粘贴特殊"的更多详细信息,您可以看到其他问题。因此,如果用.UsedRange替换.Cells,您应该已经看到了速度的提高。

3.如何进行更高效的复制

我知道这才是你真正想要的答案。鉴于您似乎不确定源范围的尺寸,我建议您复制到整个工作表。

Target_Sheet.Copy Before:=ThisWorkbook.Sheets("Name")

如果这不适合您的需求,您应该匹配来源范围和目的地范围的不同大小。如评论中所述,这可以通过UsedRange来完成。

dim rowOrigin as long
dim colOrigin as long
dim rowEnd as long
dim colEnd as long
Dim Origin_Sheet As Worksheet: Set Origin_Sheet = Sheets("Sheet1")
Dim Destination_Sheet As Worksheet: Set Destination_Sheet = Sheets("Sheet2")
colEnd = Origin_Sheet.UsedRange.Columns.Count
rowEnd = Origin_Sheet.UsedRange.Rows.Count
colOrigin = Origin_Sheet.UsedRange.Column
rowOrigin = Origin_Sheet.UsedRange.Row
Destination_Sheet.Range(Destination_Sheet.Cells(rowOrigin, colOrigin), Destination_Sheet.Cells(rowEnd, colEnd)).Value = _
Origin_Sheet.Range(Origin_Sheet.Cells(rowOrigin, colOrigin), Origin_Sheet.Cells(rowEnd, colEnd)).Value

最新更新