11

我正在尝试Collection在新类中扩展 VBA 对象的功能并使此类成为的继承者Collection,但该Implements Collection语句给了我以下错误:

工具接口错误:方法名称中带有下划线。

什么下划线?!AddItemRemoveCount是文档中列出的唯一方法Collection。所有四个都没有下划线。

编辑:为了澄清,我正在制作一个名为的类UniformCollection(仅接受相同类型的成员,受此方法的启发)。我希望它实现 Collection,以便 aUniformCollection 是 a Collection并且可以Collection在调用其他对象的方法等时代替 a 使用。

我知道我必须为 Add、Item 等编写委派方法/属性,并为For Each工作编写一个 NewEnum 属性,而且我已经这样做了。

我的问题是该Implements Collection语句给了我上述错误。

奖金问题:是Count方法还是属性Collection?帮助将其称为属性,但 VBA 编辑器中的对象浏览器将其称为函数,即方法(飞黄框)。

4

4 回答 4

8

您遇到了 VBA 中实现的限制之一。如果另一个类具有任何名称中带有下划线的公共方法或属性,则您不能实现另一个类。Collection课程当然有_NewEnum,但任何下划线都会导致问题。

例如,如果您创建了一个AddressClass具有以下内容的类:

Public Address_City As String

然后创建了另一个类CustomerAddress

Implements AddressClass

Private Property Get ClassInterface_Address_City() As String
End Property

Private Property Let ClassInterface_Address_City(ByVal RHS As String)
End Property

编译时会报错“对象模块需要为接口‘AddressClass’实现‘Address_City’。” 更改属性以AddressCity使错误消失。

可能的解决方案:如果我理解正确,您希望实现集合类,以便可以将新类传递给将集合作为参数的方法。是否可以更改这些方法?我的建议是创建自己的集合类MyCollection,然后实现它。ieUniformMyCollection这样你就可以完全避免下划线的问题。

至于Count,我会随时信任对象浏览器而不是帮助文本。另一方面,如果您正在创建自己的集合类,则选择哪个并不重要。

于 2011-11-11T07:24:07.037 回答
6

VBA 对可以实现的类有很多限制。NewEnum 正在绊倒 Collection,但即使不是,该类中也很可能有其他东西会绊倒它。我认为它报告了它发现的第一个问题。

因为 Collection 的属性和方法太少了,所以我只是重写了它们。

Private mcolParts As Collection

Public Sub Add(clsPart As CPart)
    mcolParts.Add clsPart, CStr(clsPart.PartID)
End Sub

Public Property Get Count() As Long
    Count = mcolParts.Count
End Property

Public Property Get Item(vItm As Variant) As CPart
    Set Item = mcolParts.Item(vItm)
End Property

Public Sub Remove(vIndex As Variant)
    mcolParts.Remove vIndex
End Sub

在不知道为什么 OB 显示方法(它们对我来说看起来像绿色框)。为了我的钱,方法要么改变多个属性,要么与类之外的东西交互。其他一切都是财产。我会同时调用 Count 和 Index 属性。

于 2011-04-21T21:34:43.720 回答
4

Dick Kusleika 拥有大部分功能,但如果您想For Each在自定义类中使用,您还需要:

'--- required additional property that allow to enumerate the collection with For Each
Public Property Get NewEnum() As IUnknown
    Set NewEnum = m_ColParts.[_NewEnum]
End Property

我在我的收藏夹(这个这个)中找到的任何一个链接都没有讨论这一点,但它们都值得一读。如果我找到谈论 NewEnum 的网站,我将进行编辑以添加它。

编辑

这些链接都不是我要寻找的链接,但都讨论了 NewEnum 属性(包括需要添加的一些额外的巫毒教):

这里这里

这两个都是关于 Excel 的,但是 VBA 在其他 Office 应用程序中是相同的(包括需要导出->文本编辑->导入过程来获取“属性”)。

于 2011-04-21T23:27:41.313 回答
3

Re RolandTumble 关于“NewEnum”的注释:

我自己在 Access 2003 中的经验是,“For Each”通过导入包括行在内的代码可以正常工作

Attribute NewEnum.VB_UserMemId = -4

...但是在我“/反编译”文件(命令行开关)之后,该行已被删除(在导出时验证)并且“For Each”不起作用。

不幸的是,当“压缩和修复”不能为我解决问题时,我需要使用“/反编译”。

于 2012-10-20T23:22:57.300 回答