Подтвердить что ты не робот

Установить свойство класса vba с ссылкой на объект

У меня есть модуль класса с именем Normal, в VBA со следующим кодом:

Private mLine As LineElement

Public Property Get Line() As LineElement
    Line = mLine
End Property

Public Property Set Line(ByRef vLine As LineElement)
    mLine = vLine
End Property

Этот класс используется следующим кодом:

Sub Run
    Dim Line As LineElement
    Set Line = New LineElement

    Dim Norm As Normal
    Set Norm = New Normal
    Set Norm.Line = Line 'FAILS here with "Object Variable or With Block Variable not set"'
End Sub

Кроме того, если я изменю код в модуле класса Normal, чтобы:

Private mLine As LineElement

Public Property Get Line() As LineElement
    Line = mLine
End Property

Public Sub SetLine(ByRef vLine As LineElement) 'changed from property to sub'
    mLine = vLine
End Property

и строка с ошибкой

Norm.SetLine( Line )

Я получаю ошибку "Объект не поддерживает это свойство или метод". Что именно я делаю неправильно в обоих случаях?

4b9b3361

Ответ 1

Попробуйте следующее:

Private mLine As LineElement

Public Property Get Line() As LineElement
    Set Line = mLine
End Property

Public Property Set Line(ByRef vLine As LineElement)
    Set mLine = vLine   'Note the added Set keyword in this line'
End Property

Ответ 2

Оба свойства должны иметь ключевое слово "Установить"

Private mLine As LineElement

Public Property Get Line() As LineElement
    Set Line = mLine 'Set keyword must be present
End Property

Public Property Set Line(vLine As LineElement) ' ByRef is the default in VBA
    Set mLine = vLine 'Set keyword must be present
End Property

Ответ 3

Оператор Set используется для создания ссылки объекта на переменную объекта. Вам не нужно использовать ключевое слово Set, если вы имеете дело с примитивными и встроенными встроенными типами, такими как integer, double, string и т.д. Здесь вы имеете дело с объектом типа LineElement.

Ответ 4

Попробуйте это

Private mLine As new LineElement

Public Property Get Line() As LineElement
    Set Line = mLine
End Property

Public Property Set Line(ByRef vLine As LineElement)
    Set mLine = vLine
End Property