其他答案提供了使其工作的方法,但没有解释发生了什么。
y.Sheets("DTR")
确实应该是y.Worksheets("DTR"),因为Sheets 集合可以包含非工作表项,例如图表。
不管怎样,Sheets 和 Worksheets 集合的 Item 属性(这是任何集合类型的默认属性)都会产生一个 Object,这使得每个链接成员随后的调用,一个后期绑定调用。
并且您不会在后期绑定调用中获得 IntelliSense,因为这些调用在运行时得到解决,根据定义:您可以在 @ 上调用 anything 987654336@,代码会顺利编译:
Sub Test()
Debug.Print ThisWorkbook.Worksheets(1).Whatever
End Sub
同:
Sub Test()
Debug.Print ThisWorkbook.Worksheets.Item(1).Whatever
End Sub
在运行时,如果 VBA 在检索到的对象的接口上找不到 Whatever 成员,则会引发运行时错误 438,“对象不支持此属性或方法”。
后期绑定功能强大且非常有用,但它也会产生您不一定需要的开销。
除了处理Object,当您知道特定类型是什么时,您可以将返回的对象引用转换为特定类型 - 在这种情况下我们知道我们正在处理一个Worksheet 对象:
Dim target As Worksheet
Set target = y.Worksheets("DTR")
现在您有了早期绑定Worksheet 对象引用,IntelliSense 可以指导您:
如果您尝试调用虚假成员(例如target.Whatever),您将收到编译时错误而不是运行时错误。
当你这样做时:
target.[A1].Paste
您再次使用后期绑定来检索A1 范围。相反,调用 Worksheet.Range 属性 getter 来检索早期绑定的 Range 对象 - 从那里你会看到当你输入 .paste 时,在 Paste 中没有 Paste 方法@对象:
当您键入所有内容时,您会获得自动完成和工具提示: