【发布时间】:2011-06-12 14:11:08
【问题描述】:
VBA 中有没有类似 Java 的 Set 容器的东西?我找不到任何东西,而且 Google 似乎没有帮助,因为 set 是 VBA 中的保留作品。
任何想法都会很棒。现在我唯一的选择是字典或数组。
谢谢。
【问题讨论】:
标签: java vba excel containers
VBA 中有没有类似 Java 的 Set 容器的东西?我找不到任何东西,而且 Google 似乎没有帮助,因为 set 是 VBA 中的保留作品。
任何想法都会很棒。现在我唯一的选择是字典或数组。
谢谢。
【问题讨论】:
标签: java vba excel containers
VBA 有一个内置的“Collection”对象,许多人认为 MS Scripting Runtime 中的“Dictionary”对象足够标准,它本质上是 VBA 的一部分。
但是,两者都不会强制一般对象的唯一性。您是否可以让它们为您的应用程序强制执行唯一性取决于详细信息。
例如,如果您想要一组字符串,这很容易。只需使用“字典”,并将其键用作您的“集合”。 'Dictionary' 有一个 'Exists' 方法,因此编写自己的受限 'Set' 类非常容易,其中所有实际工作都由包含的 'Dictionary' 完成。 (如果您使用 Excel,这将适用于任何简单的 Variant 值 - 字符串、数字、布尔值、错误。)
如果你有对象实例,事情会变得更复杂。 “字典”对象可以使用对象作为键,但它使用对象标识作为其相等性测试。例如,我只是在 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 对象是不。
如果您需要一个具有自定义相等性测试的集合,您需要编写重要的代码。但是,如果您至少可以编写从对象实例到可用作字典键的值的映射,您仍然可以避免编写自己的“这个东西已经是集合的成员吗?”代码。
一些相关链接:
【讨论】: