我正在尝试在新类中扩展VBA Collection
对象的功能,并使此类成为Collection
的继承者,但Implements Collection
语句给出了以下错误:
Implements:方法的错误接口 在其名称中有下划线。
什么是下划线?! Add
,Item
,Remove
和Count
是Collection
文档中列出的唯一方法。这四个都是无下划线的。
编辑:为了澄清,我正在创建一个名为UniformCollection
的课程(只接受属于this approach灵感的所有相同类型的成员)。我希望实施 Collection
,以便UniformCollection
是 Collection
并且可以用来代替调用其他对象的方法等时Collection
我知道我必须为Add,Item等编写委托方法/属性,并为For Each
创建一个NewEnum属性,我已经这样做了。
我的问题是Implements Collection
语句给出了上述错误。
奖金问题:Count
是Collection
的方法或属性吗?帮助将其称为属性,但VBA编辑器中的对象浏览器将其称为函数即方法(飞黄框)。
答案 0 :(得分: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属性。
答案 1 :(得分:6)
您遇到了VBA中Implements的一个限制。如果另一个类具有名称中带有下划线的任何公共方法或属性,则无法实现另一个类。 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
,然后再实现它。即UniformMyCollection
这样你可以完全避免下划线问题。
至于Count
,我会随时相信帮助文本中的对象浏览器。另一方面,如果您要创建自己的集合类,则选择哪一个并不重要。
答案 2 :(得分: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
我在收藏夹(this one或this one)中找到的任何一个链接都没有讨论这个问题,但它们都值得一读。如果我找到谈论NewEnum的网站,我会做一个编辑来添加它。
修改强>
这两个链接都不是我想要的,但两者都讨论了NewEnum属性(包括需要添加的一些额外的巫术):
这两个都谈论Excel,但VBA在其他Office应用程序中是相同的(包括需要export-> text edit->导入过程来获取“属性”)。
答案 3 :(得分:3)
Re RolandTumble关于“NewEnum”的说明:
我在Access 2003中的经验是“For Each”通过导入包含行
的代码正常工作Attribute NewEnum.VB_UserMemId = -4
...但是在我“/反编译”文件(命令行开关)之后,该行已被删除(在导出时验证)并且“For Each”不起作用。
不幸的是,当“压缩和修复”不能解决问题时,我需要使用“/ Decompile”。