Ошибка VBA ByRef при передаче объекта класса в подпрограмму

Я пытаюсь передать объект в новую подпрограмму, но продолжаю сталкиваться с ошибкой несоответствия ByRef.

Я объявил свой объект как:

Dim targetWorkbook
Set targetWorkbook = New CWorkbooks

Я вызываю свою подпрограмму, используя:

checkbook targetWorkbook

И моя подпрограмма установлена ​​​​как:

Sub checkbook(targetWorkbook As CWorkbooks)

'Checking if passthrough is working

End Sub

Любая помощь приветствуется, мои типы выровнены и все такое, поэтому я не уверен, почему это происходит.

Спасибо!


person Mark Tallentire    schedule 16.04.2016    source источник
comment
TargetWorkbook необходимо объявить на уровне модуля, иначе он выйдет за рамки checkbook. Не похоже, что вы устанавливаете его на уровне модуля   -  person Doug Glancy    schedule 17.04.2016


Ответы (2)


Я смог продублировать вашу проблему с компилятором. Следующее проходит компилятор и запускается. Вы объявили TargetWorkbook как Variant, а затем установили его в CWorkbooks — это работает, но не при передаче в подпрограмму.

Sub main()
    Dim TargetWorkbook As CWorkbooks
    Set TargetWorkbook = New CWorkbooks
    checkbook TargetWorkbook
End Sub
Sub checkbook(ByRef TargetWorkbook As CWorkbooks)

'Checking if passthrough is working

End Sub
person OldUgly    schedule 17.04.2016

Sub Foo()
    'single class object
    Dim myClass1 As New clsClass
    myClass1.StringName = "cls1"
    Call Par(myClass1)

    'or class array
    Dim myClass2(1 To 5) As New clsClass
    myClass2(1).StringName = "cls2"
    Call Par(myClass2)

End Sub

Sub Par(ByRef lClass As Variant) 'same function call used for both
    'Debug.Print lClass.StaffName & vbNewLine 'single class object
    'Debug.Print lClass(1).StaffName & vbNewLine 'array version
End Sub

Google привел меня сюда с той же проблемой, но обнаружил, что принятый ответ отсутствует и вообще не работает в моем случае, где Foo() был модулем, а Par() - рабочим листом, пытающимся передать массив классов.

person ReturnVoid    schedule 14.11.2018