VBA 有一个内置的“Collection”对象,许多人认为 MS Scripting Runtime 中的“Dictionary”对象足够标准,它本质上是 VBA 的一部分。
然而,两者都不会强制一般对象的唯一性。是否可以让它们为您的应用程序强制执行唯一性取决于细节。
例如,如果您想要一组字符串,这很容易。只需使用“字典”,并使用它的键作为您的“集合”。 “Dictionary”有一个“Exists”方法,因此编写您自己的有限“Set”类非常容易,其中所有实际工作都由包含的“Dictionary”完成。 (如果您使用的是 Excel,这将适用于任何简单的 Variant 值 - 字符串、数字、布尔值、错误。)
如果您有对象实例,事情会变得更加复杂。 “字典”对象can使用对象作为键,但它使用对象标识作为其相等性测试。例如,我刚刚在 VBA 立即窗口中输入以下内容:
set d=new Dictionary
set c1=new Collection
set c2=c1
d(c1) = 42
fv d
<Dictionary: keys: #V(0..0){<Collection: 0 elems: >}, items: #V(0..0){42%}>
d(c2)=99
fv d
<Dictionary: keys: #V(0..0){<Collection: 0 elems: >}, items: #V(0..0){99%}>
set c3=new Collection
d(c3)=101
fv d
<Dictionary: keys: #V(0..1){<Collection: 0 elems: >,<Collection: 0 elems: >}, items: #V(0..1){99%,101%}>
(“fv”是我用于调试的 VBA 例程 - 它只是打印出内容的字符串表示形式。)您可以看到相同的对象被视为相等,但完全相同valued物体则不然。
如果您需要一组具有自定义相等性测试的集合,则需要编写重要的代码。但是,如果您至少可以编写从对象实例到可用作字典键的值的映射,那么您仍然可以避免编写自己的“这个东西是否已经是集合的成员?”代码。
一些相关链接:
有没有办法为具有私有成员的 VBA 类编写相等测试而不暴露这些私有成员的存在?
VBA 中的哈希表/关联数组