【问题标题】:Copy from one workbook and paste into another从一个工作簿复制并粘贴到另一个工作簿
【发布时间】:2013-10-21 12:32:31
【问题描述】:

我编写了以下代码并不断看到pastespecial method of class has failed。我试图克服这个问题,但似乎没有任何效果。我正在尝试从一个工作簿中复制整张工作表,并将其粘贴到另一个工作簿中:

Set x = Workbooks.Open(" path to copying book ")
Workbooks.Open(" path to copying book ").Activate
Range("A1").Select
'Cells.Select
Selection.Copy
Set y = Workbooks.Open("path to pasting book")
Workbooks.Open("Path to pasting book").Activate

With y
    Sheets("sheetname").Cells.Select
    Range("A1").PasteSpecial
    'Sheets("sheetname").PasteSpecial
    .Close
End With

With x
    .Close
End With

【问题讨论】:

  • 尝试.Sheets("sheetname")....Range("A1").PasteSpecial 如果这不起作用,请重新编写代码以避免Select 方法,它笨重、难以解释、资源密集且效率低下:)

标签: excel vba


【解决方案1】:

应该这样做,如果您遇到问题,请告诉我:

Sub foo()
Dim x As Workbook
Dim y As Workbook

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Now, copy what you want from x:
x.Sheets("name of copying sheet").Range("A1").Copy

'Now, paste to y worksheet:
y.Sheets("sheetname").Range("A1").PasteSpecial

'Close x:
x.Close

End Sub

或者,您可以:

Sub foo2()
Dim x As Workbook
Dim y As Workbook

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Now, transfer values from x to y:
y.Sheets("sheetname").Range("A1").Value = x.Sheets("name of copying sheet").Range("A1") 

'Close x:
x.Close

End Sub

要将其扩展到整个工作表:

With x.Sheets("name of copying sheet").UsedRange
    'Now, paste to y worksheet:
    y.Sheets("sheet name").Range("A1").Resize( _
        .Rows.Count, .Columns.Count) = .Value
End With

还有另一种方式,将值存储为变量并将变量写入目标:

Sub foo3()
Dim x As Workbook
Dim y As Workbook
Dim vals as Variant

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Store the value in a variable:
vals = x.Sheets("name of sheet").Range("A1").Value

'Use the variable to assign a value to the other file/sheet:
y.Sheets("sheetname").Range("A1").Value = vals 

'Close x:
x.Close

End Sub

上面的最后一种方法对于大多数应用程序来说通常是最快的,但请注意,对于非常大的数据集(100k 行),我们观察到剪贴板实际上优于数组转储:

Copy/PasteSpecial vs Range.Value = Range.Value

也就是说,除了速度之外,还有其他其他考虑因素,并且在大型数据集上的性能损失可能值得权衡,以避免与剪贴板交互。

【讨论】:

  • 大卫非常感谢您的帮助!不幸的是,我收到一个复合错误,提示“找不到方法或数据成员”,它突出显示了它试图复制的第一个“.Sheets”行。你知道可能是什么问题吗?
  • 错误发生在:Sheets("name of copying sheet").Range("A1").Copy ??你能仔细检查你是否正确复制了它并且它不包含任何拼写错误?我想不出您会收到该错误的任何原因(即使是拼写错误也会引发 不同的 错误消息),但请尝试以上两种替代方法添加到我的答案中。
  • 我使用了您建议的第二种方法,效果很好!非常感谢!
  • 大卫,我如何将这种单元格等同扩展到等同于整个工作表?
  • 我在上面添加了该信息。
【解决方案2】:

您使用单元格进行复制。
如果是这样,则无需 PasteSpecial,因为您正在以完全相同的格式复制数据。
这是您的代码并进行了一些修复。

Dim x As Workbook, y As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet

Set x = Workbooks.Open("path to copying book")
Set y = Workbooks.Open("path to pasting book")

Set ws1 = x.Sheets("Sheet you want to copy from")
Set ws2 = y.Sheets("Sheet you want to copy to")

ws1.Cells.Copy ws2.cells
y.Close True
x.Close False

如果您真的想特别粘贴,请使用动态范围(“地址”)进行复制。
像这样:

ws1.Range("Address").Copy: ws2.Range("A1").PasteSpecial xlPasteValues
y.Close True
x.Close False

注意.Copy 后面的: 冒号,这是一个Statement Separating 字符。
使用Object.PasteSpecial 需要在新行中执行。
希望这能让你继续前进。

【讨论】:

  • 如果"Sheet you want to copy from" 正在更新,这会更新"Sheet you want to copy to" 吗?
猜你喜欢
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多