无法在 VBA 中创建新枚举

Posted

技术标签:

【中文标题】无法在 VBA 中创建新枚举【英文标题】:Unable to create New Enum in VBA 【发布时间】:2014-11-03 18:53:42 【问题描述】:

我正在 VBA 中创建一个不可变链接列表类。它提供了ToArrayToCollection 方法,我都验证过它们可以正常工作。但是Get NewEnum() As IUnknown 属性不起作用,我不知道为什么。

Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4

    Set NewEnum = ToCollection.[_NewEnum]

End Property

使用调试器将sequence 作为SList 逐步执行以下代码

Public Function Copy(ByVal sequence As Variant) As SList

    Dim made As New SList

    Dim element As Variant
    For Each element In sequence
       Set made = made.Cons(element)
    Next

    Set Copy = made.Reverse

End Function

显示For Each element In sequence 调用Get NewEnum 正确构建集合,然后返回Copy 并在没有执行迭代且没有错误后退出循环。我唯一的猜测是NewEnum 是一个变量的迭代器,该变量在退出Get NewEnum 时被销毁。 是这样吗?

【问题讨论】:

chat.stackexchange.com/transcript/message/18457890#18457890 【参考方案1】:
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4

    Set NewEnum = ToCollection.[_NewEnum]

End Property

ToCollection 每次调用都会返回一个新集合;这可能会起作用:

Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4

    Static internalCollection As Collection
    If internalCollection Is Nothing Then Set internalCollection = ToCollection

    Set NewEnum = internalCollection.[_NewEnum]

End Property

...但它相当丑陋。理想情况下,您应该有一些实例级别的 encapsulated As Collection 来返回 [_NewEnum] 值。

【讨论】:

静态变量是绑定到List的实例还是类的定义?例如,如果我循环一个列表然后创建另一个列表并尝试循环,我最终会循环第一个吗? 我只做了Static 因为你没有显示你的类的声明部分 - 我的直觉告诉我一个方法范围的Static 变量与实例级别相同,但我可能是错的。最好不要有 Static 方法范围的变量,而是在实例级别使用私有字段。

以上是关于无法在 VBA 中创建新枚举的主要内容,如果未能解决你的问题,请参考以下文章

是否有 VBA 方法可以在 Outlook 中创建新日历(不是约会)

如何在 VBA 中使用枚举进行验证

是否可以在ABAP中创建枚举(枚举)?

无法在 android studio 中创建新活动

FaceId枚举表(用于VBA的加载项)

如何在 Redshift 中创建枚举?