Excel-VBA - VBA中有Javas Set容器吗?

时间:2011-01-20 16:25:07

标签: java vba excel-vba containers excel

在VBA中有类似Java的Set容器吗?我找不到任何东西,Google似乎没有帮助,因为set是VBA中的保留作品。

任何想法都会很棒。现在我唯一的选择是字典或数组。

感谢。

1 个答案:

答案 0 :(得分:3)

VBA内置了一个'Collection'对象,很多人认为MS Scripting Runtime中的'Dictionary'对象足够标准,它基本上是VBA的一部分。

但是,它们都不会强制执行常规对象的唯一性。是否可以使它们为您的应用程序强制执行唯一性取决于详细信息。

例如,如果你想要一组字符串,那很简单。只需使用“字典”,并使用其键作为“集”。 'Dictionary'有一个'Exists'方法,所以编写你自己有限的'Set'类很容易,所有的实际工作都是由一个包含的'Dictionary'完成的。 (如果您使用的是Excel,这将适用于任何简单的Variant值 - 字符串,数字,布尔值,错误。)

如果你有对象实例,事情会变得更复杂。 'Dictionary'对象可以使用对象作为键,但它使用对象标识作为其相等测试。例如,我只是将其输入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例程 - 它只打印出一个字符串表示的东西。)你可以看到相同的对象被视为相等,但相同的对象是“T

如果您需要一个具有自定义相等性测试的集合,则需要编写非平凡的代码。但是,如果您至少可以将对象实例的映射写入可以用作Dictionary键的值,那么您仍然可以避免编写自己的“这个东西已经是该集合的成员吗?”代码。

一些相关链接:

Is there a way to write an equality test for a VBA class with private members without exposing knowledge of the existence of those private members?

Hash Table/Associative Array in VBA