2017-01-18 65 views
2

我正在循環瀏覽Excel中垂直選擇中的某些單元格,然後將該單元格作爲參數傳遞給過程。循環選擇單元格時出現對象所需的錯誤

我已經這樣做了,所以我沒有兩次ProcessCells的內容,在代碼中,一次爲while循環,第二次在For循環中。

如果我嘗試獲取寫出的單元格的值,則在for循環中它可以工作。 如果我將ProcessCells過程的內容放在for循環中,它也可以工作。

但是,如果我嘗試將其作爲參數傳遞,到ProcessCells,我得到一個錯誤

「必選對象」

下面是代碼,如果你想檢查一下出:

Sub loopThroughCells() 

Dim c As Range 
Dim autoSelect As String 
Dim X, Y As Integer 

autoSelect = Cells(3, 2).Value 

If StrComp(autoSelect, "Y") = 0 Then 
    Y = 5 
    X = 4 
    While Not IsEmpty(Cells(Y, X).Value) 
     ProcessCells (Cells(Y, X)) 
     Y = Y + 1 
    Wend 
Else 
    For Each c In Selection 
     ProcessCells (c) 
    Next c 
End If 
End Sub 

Sub ProcessCells(ce As Range) 
End Sub 

如何

細胞(N,M)

Ç不同在選擇

錯誤發生在For循環中,但它不會在while循環中發生。

+0

它應該可能是'For Each c In Selection.Cells'(你應該儘可能避免使用'Select'。另請參閱此文檔:http://stackoverflow.com/documentation/vba/7363/passing-arguments-byref-or-byval#t = 201701181030371271291 – R3uK

+0

謝謝,但不幸的是,這並沒有解決問題。 –

+0

你是否改變'ProcessCells'中的單元格?因爲你不能在'For Each'循環中改變一個元素的值(我知道,這很痛苦......) – R3uK

回答

3

這裏是你應該怎麼做:

Option Explicit 

Sub TestMe() 

    Dim c As Range 

    For Each c In Selection 
     Call ProcessCells(c) 
    Next c 
End Sub 


Sub ProcessCells(ce As Range) 
End Sub 

你應該參考與call,因爲你必須在括號內的參數。 或者這樣,如果你不喜歡call

Option Explicit 

Sub TestMe() 

    Dim c As Range 

    For Each c In Selection 
     ProcessCells c 
    Next c 
End Sub 


Sub ProcessCells(ce As Range) 
End Sub 

加上你的代碼的一個小版本。讓你的聲明是這樣的:

Dim X as Long, Y As long 

在你的代碼X被聲明爲一個變量,整數比長慢和更小 - Why Use Integer Instead of Long?

下面是當把參數在括號中一些很好的解釋和何時使用call - How do I call a VBA Function into a Sub Procedure

+2

謝謝,使用'Call'修復了它。但是你提到我需要使用'Call',因爲我在括號中有一個參數。在While循環中不是這種情況嗎? –

+0

不。在while循環中,您使用的是內置函數--XeEmpty()。它在括號中需要參數。這裏是關於它的一個很好的參考 - http://stackoverflow.com/questions/1072075/how-do-i-call-a-vba-function-into-a-sub-procedure – Vityata

+0

諾諾,我的意思是我打電話給同樣的過程,我也在For循環中調用: 'ProcessCells' 但是,我不是通過循環單元格,而是通過內置'Cells'參數。 –

相關問題