我有一个非常简单的程序,可以从一个工作簿中复制一个范围并将其粘贴到另一个工作簿中;问题是,我在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
我认为删除工作正常很奇怪,但粘贴没有。
似乎我可能错过了粘贴方法的一些基本原理 - 有人可以解释我在这里缺少的东西吗?
答案 0 :(得分:13)
其他答案提供了使其有效的方法,但没有解释发生了什么。
y.Sheets("DTR")
那应该是y.Worksheets("DTR")
,因为Sheets
集合可以包含非工作表项,例如图表。
无论如何,Sheets
和Worksheets
集合&#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 可以指导你:
如果您尝试呼叫虚假成员(例如Worksheet
),您将收到编译时错误,而不是运行时错误。
执行此操作时:
target.Whatever
您再次使用延迟绑定来检索target.[A1].Paste
范围。相反,调用A1
属性getter来检索早期绑定的Worksheet.Range
对象 - 从那里你可以看到当你输入Range
时没有.paste
这样的东西Paste
对象中的{1}}方法:
当您输入内容时,您可以获得所有内容的自动完成功能和工具提示:
答案 1 :(得分:3)
您可以使用一行代码在工作表(和工作簿)之间Copy
和Paste
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}}语句在副本后出现,但删除操作会清除剪贴板。
Paste方法是Sheet对象的成员,而不是Range对象。
调整代码,变为:
Cells.Delete
答案 3 :(得分:1)
将其更改为SCNNode *node = [scene.rootNode childNodeWithName:@"ship" recursively:YES];
{}
不适用于范围,要粘贴您必须使用的范围PasteSpecial。我相信默认情况下它会执行所有操作,但您可以指定相当多的内容,请参阅here