2012-09-06 60 views
5

我創建一個VBA應用程序,我有以下代碼:必選對象錯誤的Excel VBA


Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort (previousCell) '**Here i get object required** 

ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private Function getEffort(ByVal cell As range) 

' do soemthing 

End Sub 

我不知道爲什麼我收到錯誤消息:Object required error at getEffort(previousCell)。如果我通過Target,它的工作原理。

感謝

+0

Should _Private Function_ be _Private Sub_因爲您不關心獲取返回的值,而Private Function以「END SUB」結束? – ray

+2

調用getEffort時不要使用括號。如果你使用圓括號,那麼你的代碼將會返回一個返回值(getEffort是否返回任何東西?) –

+0

注意:如果你在子名稱前面鍵入'Call' - 'Call getEffort(previousCell)' –

回答

0

它看起來像目標未設置爲一個對象,它是給你錯誤的實例。當你傳入目標時,函數function(argument)的參數被設置爲一個對象的實例。當你設置previouscell = target target實際上需要的東西,否則你會得到exec錯誤。

嘗試設置previouscell = ActiveCell

0

兩件事情:第一,你需要不使用()或致電getEffort的功能時,包括某種形式的返回值。您還需要確定您是否希望將其作爲子功能,現在您正在使用這兩種功能。大概你是在做一個sub?

Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort previousCell '**Here i get object required** 
'or... 
call getEffort(previousCell) 

'add this too.. 
'exit sub 
ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private sub getEffort(ByVal cell As range) 

' do soemthing 

End sub 

而且,你的主程序不是你的錯誤語句之前退出,所以它總是會彈出一個消息框。嘗試在錯誤標籤之前添加Exit Sub以避免總是出現空白消息框。

18

正如其他人所說,問題在於括號。沒有人充分解釋的是爲什麼它是括號。

當你這樣說:

getEffort previousCell 

然後你逝去的previousCellRange對象到getEffort程序。這是程序期望的,所以它很高興。

當你這樣說:

getEffort (previousCell) 

各地previousCell原因VBA的括號評估previousCell對象。當VBA 評估對象時,它返回該對象的默認屬性。 Range對象的默認屬性是.Value,它是一個字符串。

因此評估previousCell並將字符串傳遞給getEffort。當然getEffort需要一個Range對象,所以你會收到錯誤信息。

事實上,您將Target分配到previousCell是一條紅鯡魚。當您切換到previousCell時,您可能會引入括號。如果你不相信我,試試這個:

getEffort (Target) 

你會得到同樣的錯誤消息。

+3

+1說明。 –

+2

有關其他信息,請參閱我對不同問題的回答:[ByRef似乎收到VBA 6.0中的值而不是引用](http://stackoverflow.com/a/4877030/154439) – mwolfe02