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)
。是吗?字典
比这里的收藏更自然。更灵活。制作一个最小的完整的可验证示例如何?我们无法按原样复制您的问题。看见