我花了好几个小时查看我的代码,但我无法弄清楚出了什么问题。
我一直得到这个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
答案 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
。