我正在尝试将信息从一个文件复制到另一个文件。如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")
答案 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