【问题标题】:Object Required error Excel VBA对象需要错误 Excel VBA
【发布时间】:2012-09-06 17:16:42
【问题描述】:

我正在创建一个 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,它会起作用。

谢谢

【问题讨论】:

  • 应该 Private FunctionPrivate Sub,因为您不关心返回值并且 Private Function 以“END SUB”结尾?跨度>
  • 在调用 getEffort 时不要使用括号。如果您使用括号,那么您的代码将期望返回值(getEffort 是否返回任何内容?)
  • 注意:如果您在子名称前输入Call - Call getEffort(previousCell),则可以使用括号

标签: excel vba


【解决方案1】:

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

当你这样说时:

getEffort previousCell

然后您将 previousCell Range 对象 传递到 getEffort 过程。这是程序所期望的,因此很高兴。

当你这样说时:

getEffort (previousCell)

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

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

您将Target 分配给previousCell 的事实是在转移注意力。当您切换到 previousCell 时,您可能会引入括号。如果你不相信我,试试这个:

getEffort (Target)

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

【讨论】:

【解决方案2】:

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

尝试设置 previouscell = ActiveCell

【讨论】:

    【解决方案3】:

    两件事:首先,在将 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,以避免始终出现空白消息框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      相关资源
      最近更新 更多