Vba 类可以扩展集合对象吗?

Vba 类可以扩展集合对象吗?,vba,collections,interface-implementation,Vba,Collections,Interface Implementation,我试图在一个新类中扩展VBACollection对象的功能,并使该类成为Collection的继承者,但是Implements Collection语句给了我以下错误: 实现的接口不正确:方法 名称中有下划线 什么添加、项目、删除和计数是集合文档中列出的唯一方法。所有四个都没有下划线 EDIT:为了澄清问题,我正在创建一个名为UniformCollection的类(该类仅接受所有类型相同的成员,灵感来源于)。我希望它实现集合,这样UniformCollection就是集合,在调用其他对象的方法等

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

实现的接口不正确:方法 名称中有下划线

什么<代码>添加、
项目
删除
计数
集合
文档中列出的唯一方法。所有四个都没有下划线

EDIT:为了澄清问题,我正在创建一个名为
UniformCollection
的类(该类仅接受所有类型相同的成员,灵感来源于)。我希望它实现
集合
,这样
UniformCollection
就是
集合
,在调用其他对象的方法等时可以用来代替
集合

我知道我必须为Add、Item等编写委托方法/属性,为每个
编写一个新的Enum属性,我已经这样做了

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


额外问题:
Count
集合的方法还是属性?“帮助”将其称为属性,但VBA编辑器中的对象浏览器将其称为函数,即方法(黄色框)

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

因为集合的属性和方法太少,所以我只重写它们

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属性。

Dick Kusleika拥有大部分属性,但是如果您想在自定义类上为每个属性使用
,您还需要:

'--- 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应用程序中是相同的(包括需要导出->文本编辑->导入过程来获取“属性”)。

您遇到了VBA实现的一个限制。如果另一个类具有任何名称中带有下划线的公共方法或属性,则无法实现该类<代码>集合
类当然有
\u 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\u City”。“将属性更改为
AddressCity
会消除错误

可能的解决方案:如果我理解正确,您希望实现collection类,以便可以将新类传递给以集合为参数的方法。有可能改变这些方法吗?我的建议是创建自己的集合类
MyCollection
,然后实现它。i、 e.
UniformMyCollection
这样可以完全避免下划线问题

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

Re RolandTumble关于“NewEnum”的说明:

我自己在Access 2003中的经验是,“For Each”通过导入代码(包括行)可以很好地工作

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


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

这是一个非常有趣的问题。我知道您可以实现内置类的接口(例如
TextStream
)。我认为@Dick是对的,正是隐藏的方法/属性阻止了
集合的这种情况。我从来没有尝试过这样做,我也从来没有在“真实”VB或幕后COM方面做过很多事情,所以我真的不知道。有关一些相关信息,但实际上不是你问题的答案,你可以查看Bruce McKinney的“硬核Visual Basic”附录页:。在页面上搜索“第167页”,会有一些关于VB(和VBA)不能做的各种事情的讨论。该网站拥有整本(绝版)的书,但我想不出一种直接导航到某个页面的方法。这是值得购买的航运成本+0.01美元作为一个普遍关注的问题。谢谢,但我已经做了所有这些东西。。。请参阅澄清编辑。+1好的解释。所以,如果我理解正确的话,底线是我的问题(标题)的答案是否定的?这是我的信念。我想一些VBA专家可能知道一种方法,可以在Excel之外创建一个
Implements Collection
类,然后将其导入,就像您需要设置的属性那样,以使NewEnum正常工作,但我认为这是不可能做到的。