Range.Paste – Object不支持这个属性或方法

我有一个非常简单的过程,从一个工作簿复制一个范围,并粘贴到另一个; 问题是,我得到了paste行标题中的错误。

以下是代码:

 Sub copypasta() Dim x As Workbook Dim y As Workbook Set x = ActiveWorkbook Set y = Workbooks.Open("F:\Target\FTB\FTB.xlsx") x.Sheets(1).Range("A1").CurrentRegion.Copy y.Sheets("DTR").Cells.Delete '<~~~No Error Here...? y.Sheets("DTR").[a1].Paste '<~~~Error Here 

我觉得奇怪的是,删除工作正常,但粘贴不。

看来我可能会错过一些粘贴方法的基本原理 – 请问有人能解释我在这里失踪的东西吗?

其他答案已经提供了使其工作的方法,但不解释发生了什么。

 y.Sheets("DTR") 

这应该是y.Worksheets("DTR") ,因为Sheets集合可以包含非工作表项目,例如图表。

无论如何, SheetsWorksheets集合的Item属性(这是任何集合types的默认属性 )都会产生一个Object ,这会使得后面的每个链接成员调用都是一个延迟调用。

而且你不会在迟来的调用中获得智能感知 ,因为这些调用在运行时得到了解决,定义如下:你可以调用Object上的任何东西 ,代码将很高兴地编译:

 Sub Test() Debug.Print ThisWorkbook.Worksheets(1).Whatever End Sub 

与…一样:

 Sub Test() Debug.Print ThisWorkbook.Worksheets.Item(1).Whatever End Sub 

在运行时,如果VBA无法在检索到的对象的接口上findWhatever成员,则会引发运行时错误438,“对象不支持此属性或方法”。

后期绑定function强大且非常有用,但也会产生开销,您不一定需要

当你知道这个types是什么types的时候,你可以返回的对象引用转换为一个特定的types,在这种情况下,我们知道我们正在处理一个Worksheet对象:

 Dim target As Worksheet Set target = y.Worksheets("DTR") 

现在您已经有了一个早期绑定的 Worksheet对象引用, IntelliSense可以指导您:

智能感知下拉列表中的工作表对象的成员

如果你试图调用一个伪造的成员(比如target.Whatever ),你会得到一个编译时错误,而不是运行时错误。

编译错误:找不到成员或数据成员

当你这样做:

 target.[A1].Paste 

您再次使用后期绑定来检索A1范围。 相反,调用Worksheet.Range属性getter来检索一个早期的Range对象 – 从那里你将会看到,当你input.paste ,在Range对象中没有Paste方法这样的事情:

自动完成Range.PasteSpecial

您可以在input时获得所有内容的自动完成和工具提示:

为Range.PasteSpecial方法的第一个参数列出的XLPasteType枚举成员

您可以使用1行代码在工作表(和工作簿)之间CopyPaste Ranges ,只需将您的代码replace为以下行:

 x.Sheets(1).Range("A1").CurrentRegion.Copy y.Sheets("DTR").[a1] 

如果你想使用PasteSpecial方法,你需要做两行,但是你需要在PasteSpecial之后添加一个参数,比如xlValues等等。

 x.Sheets(1).Range("A1").CurrentRegion.Copy y.Sheets("DTR").[a1].PasteSpecial xlValues 

您的原始代码的问题是双重的。

  1. 复制出现Cells.Delete语句,但删除操作清除剪贴板。

  2. Paste方法是Sheet对象的成员,而不是Range对象。

调整你的代码,变成:

 y.Sheets("DTR").Cells.Delete x.Sheets(1).Range("A1").CurrentRegion.Copy y.Sheets("DTR").Paste y.Sheets("DTR").[a1] 

将其更改为y.Sheets("DTR").[a1].PasteSpecial

Paste不能在范围上工作,要粘贴一个范围,你必须使用PasteSpecial 。 我相信默认情况下,它做的一切,但你可以指定相当多,看到这里