Интерфейс VBA не показывает свойство в окне просмотра - PullRequest
0 голосов
/ 15 апреля 2020

Я использую VBA и столкнулся с этим сценарием, где переменная не отображается в окне просмотра при использовании интерфейсов:

enter image description here

Интерфейс с именем ITest:

Public Property Get name() As String

End Property

Класс с именем Class1:

Implements ITest

Private Property Get ITest_name() As String
    ITest_name = "T1"
End Property

Модуль с именем Module1 работает тест:

Public Sub main()
    Dim interface As ITest
    Set interface = New Class1
End Sub

Точка останова на конце Sub:

enter image description here

Вызов имени члена:

Вызов имени члена также, похоже, не влияет на окно просмотра

enter image description here

Было бы здорово, если бы я мог использовать окно наблюдения при использовании интерфейсов для отладки кода - кто-нибудь еще испытывал это или знал о решении?

После изменения кода: enter image description here

Большое спасибо

1 Ответ

0 голосов
/ 15 апреля 2020

Я думаю, что проблема возникает, потому что нет никакой опубликованной c ссылки на экземпляр Class1, потому что способ, которым вы создаете экземпляр, означает, что он является анонимным для VBA. Если вы используете Google, вы найдете множество рекомендаций не использовать «как новый класс» из-за проблем, которые он вводит.

В приведенном ниже пересмотренном коде (который больше похож на то, как вы будете использовать интерфейс) показано содержимое myClass довольно четко

Пересмотренный Class1

Option Explicit

Implements ITest

Private Type Properties
    name As String
End Type

Private p As Properties

Private Property Get ITest_name() As String
    ITest_name = name
End Property

Private Property Let ITest_name(ByVal Value As String)
    name = Value
End Property

Public Property Let name(ByVal Value As String)
    p.name = Value
End Property

Public Property Get name() As String
    name = p.name
End Property

Пересмотренный интерфейс

Option Explicit

Public Property Get name() As String

End Property

Public Property Let name(ByVal Value As String)

End Property

Пересмотренный модуль

Option Explicit

Public Sub main()

    Dim interface As ITest
    Dim myClass As Class1
    Set myClass = New Class1
    Set interface = myClass
    interface.name = "T1"
    Debug.Print interface.name

End Sub

Если вы собираетесь работать с интерфейсами (и хорошо, если вы это сделаете), тогда вы найдете интерфейсный генератор в надстройке VBA Rubberduck (под рефакторингом), что сэкономит вам много времени на печатание.

...