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

时间:2018-11-26 10:04:26

标签: excel vba copy out-of-memory excel-2016

我正在尝试将信息从一个文件复制到另一个文件。如here所示,执行此操作的方式越来越少。

当前,我使用的是效率较低的方法:

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 个答案:

答案 0 :(得分:1)

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

1。为什么会这样?

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

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

实际上,唯一的方法是使用“效率较低的方法”以最初编写它的方式(除.Cells之外)进行操作。您首先复制范围,然后将其存储在剪贴板中,接着确定目的地,最后使用“粘贴”功能。您可以看到additional details on "paste" vs "paste special"的另一个问题。 因此,如果您将.Cells替换为.UsedRange,应该已经看到了速度的提高。

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