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

aLe*_*ady 3 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
Run Code Online (Sandbox Code Playgroud)

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

似乎我可能会遗漏一些粘贴方法的基本原理 - 有人可以解释一下我在这里缺少什么吗?

Mat*_*don 15

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

y.Sheets("DTR")
Run Code Online (Sandbox Code Playgroud)

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

无论如何,两个SheetsWorksheets集合Item属性(它是默认属性的任何集合类型的)产生一个Object,这使得后面的每个链构件呼叫,后期绑定调用.

而你没有得到智能感知在后期绑定调用,因为这些调用就会在运行时解决,顾名思义:你可以调用任何东西Object,而该代码会很乐意编译:

Sub Test()
    Debug.Print ThisWorkbook.Worksheets(1).Whatever
End Sub
Run Code Online (Sandbox Code Playgroud)

与...一样:

Sub Test()
    Debug.Print ThisWorkbook.Worksheets.Item(1).Whatever
End Sub
Run Code Online (Sandbox Code Playgroud)

在运行时,如果VBA Whatever在检索到的对象的接口上找不到该成员,则会引发运行时错误438,"对象不支持此属性或方法".

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

相反,工作过的的Object,你可以返回的对象引用到一个特定的类型,当你知道是什么类型-在这种情况下,我们知道我们正在处理一个Worksheet对象:

Dim target As Worksheet
Set target = y.Worksheets("DTR")
Run Code Online (Sandbox Code Playgroud)

既然您有一个早期绑定的 Worksheet对象引用,IntelliSense可以指导您:

列出Worksheet对象成员的IntelliSense下拉列表

如果你试图调用一个虚假的成员(例如target.Whatever),你将得到编译时错误而不是运行时错误.

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

当你这样做:

target.[A1].Paste
Run Code Online (Sandbox Code Playgroud)

你再次使用后期绑定来检索A1范围.取而代之的是,调用Worksheet.Range属性getter检索的早期绑定Range对象-并从那里你会看到,当你输入.paste有作为没有这样的事情Paste在一个方法Range对象:

Range.PasteSpecial的自动完成

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

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