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
集合可以包含非工作表项目,例如图表。
无论如何, Sheets
和Worksheets
集合的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
方法这样的事情:
您可以在input时获得所有内容的自动完成和工具提示:
您可以使用1行代码在工作表(和工作簿)之间Copy
和Paste
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
您的原始代码的问题是双重的。
-
复制后出现
Cells.Delete
语句,但删除操作清除剪贴板。 -
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 。 我相信默认情况下,它做的一切,但你可以指定相当多,看到这里