我花了几个小时查看我的代码,但我无法弄清楚出了什么问题.
我一直得到这个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
抱怨,"嘿,这不是一个范围对象,需要一个范围对象!"