其他的答案提供了辦法讓它工作,但沒有解釋發生了什麼事情。
y.Sheets("DTR")
這確實應該y.Worksheets("DTR")
,因爲Sheets
集合可以包含非工作項目,如圖表爲例。
無論如何,兩個Sheets
和Worksheets
集合Item
屬性(它是任何集合類型的默認屬性)產生一個Object
,這使得後面的每個鏈構件呼叫,後期綁定調用。
你不上後期綁定調用get 智能感知,因爲這些調用就會在運行時解決,顧名思義:你可以在一個Object
致電什麼,代碼將愉快地編譯:
Sub Test()
Debug.Print ThisWorkbook.Worksheets(1).Whatever
End Sub
同:
Sub Test()
Debug.Print ThisWorkbook.Worksheets.Item(1).Whatever
End Sub
在運行時,如果VBA找不到檢索對象的接口上的Whatever
成員,它引發運行TI我錯誤438,「對象不支持此屬性或方法」。
後期綁定功能強大且非常有用,但它也會產生開銷,因此您不一定需要需要。
而是工作過的Object
,可以投返回的對象引用到一個特定的類型,當你知道是什麼類型 - 在這種情況下,我們知道我們正在處理一個Worksheet
對象:
Dim target As Worksheet
Set target = y.Worksheets("DTR")
現在你有一個早期綁定Worksheet
對象的引用,智能感知可以指導你:
如果你嘗試調用一個假的成員(例如target.Whatever
),你會得到一個運行時錯誤的編譯時錯誤信息。
當你這樣做:
target.[A1].Paste
您使用後期綁定再次,檢索A1
範圍。相反,調用Worksheet.Range
屬性getter檢索的早期綁定Range
對象 - 並從那裏你會看到,當你鍵入.paste
有一個Paste
方法沒有這樣的事情在一個Range
對象:
,你會得到自動完成,並提示了一切,你鍵入:
感謝@ tjb1。不幸的是,現在我得到了一個運行時錯誤:Range類的PasteSpecial方法失敗 – aLearningLady