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

Mic*_*cka 3 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
Run Code Online (Sandbox Code Playgroud)

Exc*_*ero 11

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

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

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

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

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

mySub row
Run Code Online (Sandbox Code Playgroud)

要么...

Call mySub(row)
Run Code Online (Sandbox Code Playgroud)

...而是你这样做:

mySub (row)
Run Code Online (Sandbox Code Playgroud)

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

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

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

并且由于mySub定义需要一个范围对象参数,你得到错误424. mySub抱怨,"嘿,这不是一个范围对象,需要一个范围对象!"

  • @findwindow嗯.我觉得你很认真.那很难过.我以为你在开玩笑.对不起,我不同意你的观点.你只告诉如何避免错误.我完全解释了为什么会这样. (2认同)

fin*_*dow 5

call前面加一个。您也可以删除(),它应该也可以工作^_^ 如果您删除(),也删除call