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

我花了几个小时看着我的代码,但我无法弄清楚什么是错的。

我一直得到这个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 

这是观察到的行为的原因。

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

这意味着你必须通过一个范围。

在你的代码中,你将一个对象variablesrow设置为一系列的范围,一次一个。

要使用该范围variablesrow作为mySub的参数,语法应如下所示:

 mySub row 

要么…

 Call mySub(row) 

…但相反,你是这样做的:

 mySub (row) 

那么,有什么区别? 当你在任何一个单独的variables(如上面)中放置括号时,variables会立即被计算出来,然后在你打算做的任何事情之前进行计算。

括号是覆盖过程的ByRef参数的常用方法,而是强制执行一次性的ByValparameter passing。 这是因为括号强制对variables进行评估,并通过结果VALUE而不是对variables的引用。

在你的情况下,你不想这样做(事实上,在大多数情况下,你不想这样做)。 当用圆括号夹住row ,范围对象不再传递给例程 。 相反,它被评估,它的值作为一个Variant数组传递。

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

在它之前添加一个call 。 你也可以删除() ,它也应该工作^ _ ^如果删除() ,也删除了call