【问题标题】:VBA Interface not showing property in watch windowVBA界面未在监视窗口中显示属性
【发布时间】:2020-07-28 15:50:58
【问题描述】:

我正在使用 VBA,并且遇到了这种情况,即使用接口时变量未显示在监视窗口中:

名为 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

End Sub 的断点:

叫名会员:

调用名称成员似乎也对监视窗口没有影响

如果我可以在使用界面调试代码的同时使用监视窗口,那就太好了 - 有其他人经历过这种情况或知道解决方案吗?

修改代码后:

非常感谢

【问题讨论】:

  • 如果在 Sub 主示例中包含对 name 方法的调用会发生什么。?目前你只是创建实例,并没有真正调用实例上的方法。
  • 感谢@freeflow 不幸的是调用名称成员对监视窗口也没有影响,我已经用截图更新了原始帖子

标签: vba interface watch


【解决方案1】:

我认为问题的发生是因为没有对 Class1 实例的公共引用,因为创建实例的方式意味着它对 VBA 是匿名的。如果您使用 Google 搜索,您会发现很多建议不要使用“as new class”,因为它引入了一些问题。

下面的修改后的代码(更像是你使用接口的方式)非常清楚地显示了 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 插件(正在重构)中的接口生成器可以节省大量输入。

【讨论】:

  • 感谢更新代码@freeflow 不幸的是,虽然名称 T1 打印在即时窗口中,但它仍然没有显示在监视窗口中。我已经用截图更新了主帖不确定它是否可能是特定于版本的错误?我正在使用 VBA 7.0
  • 为类实例添加一个监视(或者最好还是尝试本地窗口)。该接口不会向您显示任何内容,因为它仅用于编译时使用,以确保方法检查传递给指定为 IType 的参数的对象..
  • @freeflow,我很困惑为什么我总是看到人们将类属性放在顶部的用户定义类型中。除了将 UDT 之外的变量放在模块顶部之外,还有什么好的理由吗?
  • 这是一个很好的问题,而且最好通过提出一个新问题来解决。简而言之,答案是智能感知、模块中更好的组织、关注点分离,例如我经常使用属性 (p)、状态、使用 (u) 和基础 (b) 的 UDT。如果你愿意,你可以把所有这些放在一个 TSomething (This) 中。因此,如果我在 Properties UDT 中有 10 个属性支持变量,并且有一个变量 p 作为 Properties,那么当我键入 p 时。 VBAs Intellisense 会给我一个 UDT 字段列表。想想 18 个月后修改该模块时这意味着什么。
猜你喜欢
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2017-03-26
  • 1970-01-01
  • 2018-02-14
  • 2015-01-12
相关资源
最近更新 更多