VBA集合。添加无效

VBA集合。添加无效,vba,excel,Vba,Excel,我有一个从数组中获取唯一值的集合,但由于某种原因,它会经过数组,但集合最终显示为 集合的代码为: Dim Materials as Variant Dim Unique as New Collection, a On Error Resume Next For Each a In Materials Unique.Add a, a Next 有人能解释为什么这不起作用吗?如果你真的想要一个集合(因为,例如,你想保持项目第一次出现的顺序),在建立集合时使用字典作为临时数据结构仍然是一个

我有一个从数组中获取唯一值的集合,但由于某种原因,它会经过数组,但集合最终显示为

集合的代码为:

Dim Materials as Variant
Dim Unique as New Collection, a

On Error Resume Next
For Each a In Materials
    Unique.Add a, a
Next

有人能解释为什么这不起作用吗?

如果你真的想要一个集合(因为,例如,你想保持项目第一次出现的顺序),在建立集合时使用字典作为临时数据结构仍然是一个好主意。比如:

Function Uniques(A As Variant) As Collection
    Dim D As Object, C As New Collection
    Set D = CreateObject("Scripting.Dictionary")
    Dim v As Variant

    For Each v In A
        If Not D.exists(v) Then
            D.Add v, 1
            C.Add v
        End If
    Next v

    Set Uniques = C
End Function
测试结果如下:

Sub test()
    Dim Materials As Variant, C As Collection, v As Variant
    Materials = Array(2, 3, 5, 2, 6, 5, 7, 4, 2)
    Set C = Uniques(Materials)
    For Each v In C
        Debug.Print v
    Next v
End Sub
输出:

2 
3 
5 
6 
7 
4

如果您只需要一个类似集合的对象而不是集合本身,则可以完全跳过集合,只需让
Uniques()
(经过适当修改)返回字典本身。

a
中存储了哪些值?集合的键值不应该是字符串吗?因此,如果
a
是一个数字,您将得到一个类型不匹配,但“错误恢复下一步”中的
隐藏了它。尝试
Unique.Add a,CSTR(a)
。尽管如此,您发布的代码实际上并没有为
材质指定任何值,这使得测试问题变得很困难(据我所知,您可能正在为材质指定表单控件)。您可以在代码中看到
上的错误恢复下一步
,这些人应该更了解,所以新手会复制它们。它的意思是:如果有一个错误,不要麻烦告诉我,并继续不管。删除它并查看是否会收到错误消息。根据定义,
Materials
是一个变体。您可以在其中放置一个数组,例如:
Materials=array(x,y,z)
。是吗?
字典
比这里的收藏更自然。更灵活。制作一个最小的完整的可验证示例如何?我们无法按原样复制您的问题。看见