2015-10-26 8 views
1

Я потратил часы, заглядывая в свой код, но не могу понять, что не так.excel error 424 объект, требуемый при вызове sub

Я продолжаю получать эту ошибку 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

Добавьте «звонок» перед этим. – findwindow

+0

Где ошибка? – BruceWayne

+0

@BruceWayne 'mySub (строка) 'Ошибка 424, требуемый объект – findwindow

ответ

7

Вот причина наблюдаемого поведения.

Ваша подпрограмма, mySub() принимает один параметр как тип диапазона.

Это означает, что вы должны передать ему диапазон.

В вашем коде вы устанавливаете переменную объекта row в ряд диапазонов по одному.

Чтобы использовать этот переменный диапазон row в качестве параметра для mySub синтаксиса должен быть такой:

mySub row 

Или ...

Call mySub(row) 

... но вместо этого вы делаете это:

mySub (row) 

Итак, в чем разница? Когда вы помещаете круглые скобки вокруг любой переменной, которая стоит одна (как указано выше), эта переменная получает оценку сразу и до того, что вы планируете делать с ней.

Скобки являются обычным способом переопределить аргумент ByRef процедуры и вместо этого принудительно использовать одноразовый параметр ByVal. Это связано с тем, что скобки заставляют оценивать переменную, а результирующее значение VALUE передается вместо ссылки на переменную.

В вашем случае вы не хотите этого делать (на самом деле, в большинстве случаев вы не хотите этого делать). Когда вы сэндвич row с круглыми скобками, объект диапазона больше не переходит к подпрограмме. Вместо этого он оценивается, и его значения передаются как Variant Array.

И поскольку определение mySub вызывает параметр объекта диапазона, вы получаете ошибку 424. mySub жалуется: «Эй, это не объект диапазона, а объект диапазона требуется!»

+0

Теперь я понял, спасибо! – Micka

+0

Ты всегда крадешь мои очки; _; – findwindow

+0

@findwindow Это хорошая или плохая вещь? –

4

Добавить call перед ним. Вы также можете удалить (), и он тоже должен работать^_^Если вы удалите (), также удалите call.

Смежные вопросы