5

我正在创建一个 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,它的工作原理。

谢谢

4

3 回答 3

18

正如其他人所建议的那样,问题在于括号。没有人充分解释的是为什么它是括号。

当你这样说时:

getEffort previousCell

然后将previousCell Range 对象传递给 getEffort 过程。这是程序所期望的,所以它很高兴。

当你这样说时:

getEffort (previousCell)

周围的括号previousCell导致 VBA评估previousCell对象。当 VBA评估一个对象时,它返回该对象的默认属性。Range 对象的默认属性是.Value,它是一个字符串。

因此,previousCell 被评估并且一个字符串被传递给 getEffort。当然 getEffort 需要一个 Range 对象,因此您会收到错误消息。

Target您分配的事实previousCell是一个红鲱鱼。当您切换到 . 时,您可能引入了括号previousCell。如果你不相信我,试试这个:

getEffort (Target)

您将收到相同的错误消息。

于 2012-09-06T19:51:59.927 回答
0

看起来目标未设置为给您错误的对象的实例。当您传入目标时,函数 function(argument) 的参数设置为对象的实例。当你设置 previouscell = target target 实际上需要是什么东西,否则你会得到 exec 错误。

尝试设置 previouscell = ActiveCell

于 2012-09-06T17:29:40.450 回答
0

两件事:首先,在将 getEffort 作为函数调用时,您不需要使用()或包含某种返回值。您还需要确定是否希望它成为子/功能,现在您正在使用两者。大概你把它变成一个潜艇?

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在错误标签之前添加以避免始终出现空白消息框。

于 2012-09-06T17:55:17.313 回答