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集合可以包含非工作表项,例如图表.
无论如何,两个Sheets和Worksheets集合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可以指导您:
如果你试图调用一个虚假的成员(例如target.Whatever),你将得到编译时错误而不是运行时错误.
当你这样做:
target.[A1].Paste
Run Code Online (Sandbox Code Playgroud)
你再次使用后期绑定来检索A1范围.取而代之的是,调用Worksheet.Range属性getter检索的早期绑定Range对象-并从那里你会看到,当你输入.paste有作为没有这样的事情Paste在一个方法Range对象:
当您键入内容时,您可以获得所有内容的自动完成和工具提示: