2016-11-16 383 views
1

我有一個非常簡單的過程,從一個工作簿複製範圍並將其粘貼到另一個;問題是,我收到paste行標題中的錯誤。Range.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 

我覺得很奇怪的是,刪除工作正常,但粘貼沒有。

看來我可能會錯過粘貼方法的一些基礎知識 - 有人可以解釋我在這裏失蹤的內容嗎?

回答

11

其他的答案提供了辦法讓它工作,但沒有解釋發生了什麼事情。

y.Sheets("DTR") 

這確實應該y.Worksheets("DTR"),因爲Sheets集合可以包含非工作項目,如圖表爲例。

無論如何,兩個SheetsWorksheets集合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對象的引用,智能感知可以指導你:

IntelliSense dropdown listing members of a Worksheet object

如果你嘗試調用一個假的成員(例如target.Whatever),你會得到一個運行時錯誤的編譯時錯誤信息。

compile error: member or data member not found

當你這樣做:

target.[A1].Paste 

您使用後期綁定再次,檢索A1範圍。相反,調用Worksheet.Range屬性getter檢索的早期綁定Range對象 - 並從那裏你會看到,當你鍵入.paste有一個Paste方法沒有這樣的事情在一個Range對象:

autocompletion for Range.PasteSpecial

,你會得到自動完成,並提示了一切,你鍵入:

XLPasteType enum members listed for first parameter of Range.PasteSpecial method

1

將其更改爲y.Sheets("DTR").[a1].PasteSpecial

Paste不能在工作範圍內,粘貼你必須使用一個PasteSpecial範圍。我相信,在默認情況下它的一切,但你可以指定了不少,看到here

+0

感謝@ tjb1。不幸的是,現在我得到了一個運行時錯誤:Range類的PasteSpecial方法失敗 – aLearningLady

3

可以CopyPasteRanges使用1行代碼表(和工作簿)之間,剛好與線下替換代碼:

x.Sheets(1).Range("A1").CurrentRegion.Copy y.Sheets("DTR").[a1] 

如果你想使用PasteSpecial方法,你必須這樣做在2行,但你需要的PasteSpecial後添加參數,如xlValues

x.Sheets(1).Range("A1").CurrentRegion.Copy 
y.Sheets("DTR").[a1].PasteSpecial xlValues 
+3

快速注意,如果您只是複製/粘貼值,則避免複製/粘貼的替代方法是將兩個範圍設置爲彼此相等:範圍([目標範圍])。值=範圍([原點範圍])值 – BruceWayne

+1

@BruceWayne ...帶星號:'範圍'隱式指向活動工作簿,使其在*目標*工作簿不是* source *工作簿,'Range'調用需要使用'Worksheet'引用進行完全限定。至少在這種情況下,*目標*範圍。 –

+0

@ Mat'sMug - 是的,特別是當他從一張紙複印到另一張時,我忘了提及這一點。感謝您的支持!所以,更具體地說,它應該是'y'。表格(「DTR」)。[a1] .Value = x.Sheets(1).Range(「A1」)。Value'。 – BruceWayne

2

原始代碼的問題是雙重的。

  1. Cells.Delete聲明後出現的副本,但刪除操作將清除剪貼板。

  2. Paste方法是Sheet對象的成員,而不是Range對象。

調整你的代碼,變成:

y.Sheets("DTR").Cells.Delete 
x.Sheets(1).Range("A1").CurrentRegion.Copy 
y.Sheets("DTR").Paste y.Sheets("DTR").[a1] 
相關問題