调用sub时需要excel错误424对象

时间:2015-10-26 21:31:50

标签: excel vba

我花了好几个小时查看我的代码,但我无法弄清楚出了什么问题。

我一直得到这个424错误,因为我没有明显的理由。这是我的一段代码。

我只想将行作为参数提供给mySub来处理它。

Option Explicit

Private Sub mySub(row As Range)
    Debug.Print ("mySub") ' not printed
    Dim line As Collection

    Set line = New Collection
End Sub

Private Sub CalcClients()
    Dim data_sheet As Worksheet
    Dim last_row As Long
    Dim last_col As String
    Dim line As Long
    Dim cols As Range
    Dim row As Range

    Set data_sheet = Worksheets("DATA")
    Let last_row = data_sheet.Range("A1").End(xlDown).row
    Let last_col = Col_Letter(data_sheet.Range("A1").End(xlToRight).column)
    Set cols = data_sheet.Range("A2:" & last_col & last_row)

    For Each row In cols.Rows
        ' type_name(row) => "Range"
        Debug.Print (row.Cells(1, 1).Value) '=> THEEXPECTEDVALUE
        mySub (row) ' Error 424, object required
    Next

End Sub

2 个答案:

答案 0 :(得分:10)

以下是观察到的行为的原因。

您的子程序mySub()将一个参数作为范围类型。

这意味着你必须传递一个范围。

在您的代码中,您将对象变量row设置为一系列范围,一次一个。

要将范围变量row用作mySub的参数,语法应如下所示:

mySub row

或者...

Call mySub(row)

...而是你这样做:

mySub (row)

那么,有什么区别?当您将括号放在任何独立的变量周围时(如上所述),该变量会立即在您计划使用它的任何内容之前进行评估。

括号是覆盖过程的ByRef参数的常用方法,而是强制一次性ByVal参数传递。这是因为括号强制对变量进行求值,并传递结果VALUE而不是对变量的引用。

在你的情况下,你不想这样做(事实上,在大多数情况下你不想这样做)。 当您用括号括起row时,范围对象不再传递给例程。而是对它进行评估,并将其值作为变量数组传递。

由于mySub定义调用范围对象参数,因此会收到错误424. mySub抱怨,“嘿,这不是范围对象,需要范围对象!”< / p>

答案 1 :(得分:4)

在它之前添加call。您也可以删除(),它也应该有效^ _ ^如果您删除(),也请删除call