2014-10-18 111 views
-2

我知道這是一個愚蠢的問題,但我在機智的最終試圖弄清楚。在Excel中的範圍方法VBA

這段小小的代碼導致運行時錯誤'1004':對象'_Worksheet'的方法'範圍'失敗。但只有當Sheet3不是活動工作表時。它在Sheet3處於活動狀態時會發生什麼。

With Sheet3.Range(Cells(1, 1), Cells(nrows1, ncols1)) 
    .Clear 
    .Value = SCDevNeeds1 
End With 

而且,如果我改變的參考表的標籤名稱,我仍然得到一個運行時錯誤,但是這一次它是一個應用程序定義或對象定義的錯誤。這種情況只發生在紙張不活動時:

With Sheets("newest").Range(Cells(1, 1), Cells(nrows1, ncols1)) 
    .Clear 
    .Value = SCDevNeeds1 
End With 

我在想什麼?

+1

線被執行時什麼是** nrows1,ncols1,**和** ** SCDevNeeds1價值觀 – 2014-10-18 21:41:34

+4

如果您不具備參考特定工作表的資格,單元格()始終指向活動工作表。您的代碼錯誤是因爲Range引用了sheet3,但Cells()不會除非sheet3處於活動狀態。 – 2014-10-18 21:43:28

+1

在這種情況下,是的,但並不總是取決於代碼的位置,這使得它更容易出錯。 (請參閱下面的答案) – KekuSemau 2014-10-18 22:02:16

回答

1

在表達Sheet3.Range(Cells(1, 1), Cells(nrows1, ncols1))Cells是指:
a)如果代碼是一個單獨的代碼模塊
b)該模塊的片材,如果代碼是一個工作表模塊中的活性片。

因此,如果代碼位於Sheet3模塊內部,代碼就可以工作,而不會意外。
您應始終使用對所有Range對象(如Cells,Range,Rows,Columns,...)的完整引用。

Sheet3.Range(Sheet3.Cells(1, 1), Sheet3.Cells(nrows1, ncols1))

1

嘗試此代碼段

With ThisWorkbook.Sheets("Sheet3") 
    With .Range(.Cells(1, 1), .Cells(100, 2)) 
     .Clear 
     .Value = "" 
    End With 

End With

+0

謝謝ZAZ。 KekuSemau的工作。你的建議似乎是非常高效的代碼,但它給了我一個下標超出範圍的錯誤,我不喜歡搞清楚!不過,我很欣賞這個答案。我知道我可以讓它工作。 – SteveS 2014-10-18 22:11:32

+0

如果它解決了問題,請接受這個答案。 – ZAZ 2014-10-18 22:24:38

+0

這個論壇比較新。我可以接受這兩個答案嗎?似乎它不會讓我。我確實提出了你的答案。 – SteveS 2014-10-18 22:39:00