Range.Paste - Object不支持此属性或方法

时间:2016-11-16 18:49:59

标签: excel vba excel-vba

我有一个非常简单的程序,可以从一个工作簿中复制一个范围并将其粘贴到另一个工作簿中;问题是,我在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

我认为删除工作正常很奇怪,但粘贴没有。

似乎我可能错过了粘贴方法的一些基本原理 - 有人可以解释我在这里缺少的东西吗?

4 个答案:

答案 0 :(得分:13)

其他答案提供了使其有效的方法,但没有解释发生了什么。

y.Sheets("DTR")

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

无论如何,SheetsWorksheets集合&#39; Item属性(任何集合类型的默认属性)产生Object,它使得后面的每个链式成员调用成为后期绑定调用。

在后期调用中你没有获得 IntelliSense ,因为这些调用在运行时得到解决,根据定义:你可以调用任何一个Object,代码将很乐意编译:

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

同样:

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

在运行时,如果VBA无法在检索到的对象的界面上找到Whatever成员,则会引发运行时错误438,&#34;对象没有&#39; t支持此属性或方法&#34;。

后期绑定功能强大且非常有用,但它也会带来您不必需要的开销。

当您知道该类型是什么时,您可以返回的对象引用 转换为特定类型 - 在这种情况下,我们知道我们正在处理Object对象:

Worksheet

现在你有一个早期绑定 Dim target As Worksheet Set target = y.Worksheets("DTR") 对象引用, IntelliSense 可以指导你:

IntelliSense dropdown listing members of a Worksheet object

如果您尝试呼叫虚假成员(例如Worksheet),您将收到编译时错误,而不是运行时错误。

compile error: member or data member not found

执行此操作时:

target.Whatever

您再次使用延迟绑定来检索target.[A1].Paste 范围。相反,调用A1属性getter来检索早期绑定的Worksheet.Range对象 - 从那里你可以看到当你输入Range时没有.paste这样的东西Paste对象中的{1}}方法:

autocompletion for Range.PasteSpecial

当您输入内容时,您可以获得所有内容的自动完成功能和工具提示:

XLPasteType enum members listed for first parameter of Range.PasteSpecial method

答案 1 :(得分:3)

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

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

如果您想使用PasteSpecial方法,则需要在2行中执行此操作,但需要在PasteSpecial之后添加参数,例如xlValues等。< / p>

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

答案 2 :(得分:2)

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

  1. {/ 1}}语句在副本后出现,但删除操作会清除剪贴板。

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

  3. 调整代码,变为:

    Cells.Delete

答案 3 :(得分:1)

将其更改为SCNNode *node = [scene.rootNode childNodeWithName:@"ship" recursively:YES];

{}不适用于范围,要粘贴您必须使用的范围PasteSpecial。我相信默认情况下它会执行所有操作,但您可以指定相当多的内容,请参阅here