Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果使用循环,为什么VBA集合数据类型保留我添加的所有项的最后一个值?_Vba - Fatal编程技术网

如果使用循环,为什么VBA集合数据类型保留我添加的所有项的最后一个值?

如果使用循环,为什么VBA集合数据类型保留我添加的所有项的最后一个值?,vba,Vba,我有这个收藏: Public col As New Collection For Each item In col Debug.Print (item.GetName) Next 这个名为“类”的类: 我尝试在集合中添加值: For k = 1 To 10 Dim temp As New cls temp.SetName CStr(k) col.Add temp Next k 当我打印集合中所有项目的名称时: Public col As New Collec

我有这个收藏:

Public col As New Collection
For Each item In col
    Debug.Print (item.GetName)
Next
这个名为“类”的类:

我尝试在集合中添加值:

For k = 1 To 10
    Dim temp As New cls
    temp.SetName CStr(k)
    col.Add temp
Next k
当我打印集合中所有项目的名称时:

Public col As New Collection
For Each item In col
    Debug.Print (item.GetName)
Next
我有下一个输出:

10
10
10
10
10
10
10
10
10
10
为什么我的输出不是

1
2
3
4
5
6
7
8
9
10
?


为什么它会将最后一个值放在每个项目上?

不要将
Dim temp用作新的cls
-快捷方式符号有许多缺陷

上面的表示法实际上只创建了
cls
对象的一个实例,您正在向集合中添加对该实例的10个引用。每次迭代都会更新名称,因此,在最后,所有实例的名称都是“10”。如果在循环期间暂停,您会注意到,当集合中有1个项目时,项目名称将为“1”,当有2个项目时,所有名称将为“2”,依此类推

声明变量,然后每次将变量设置为新实例:


不要将Dim temp用作新的cls-快捷方式符号有许多缺陷

上面的表示法实际上只创建了
cls
对象的一个实例,您正在向集合中添加对该实例的10个引用。每次迭代都会更新名称,因此,在最后,所有实例的名称都是“10”。如果在循环期间暂停,您会注意到,当集合中有1个项目时,项目名称将为“1”,当有2个项目时,所有名称将为“2”,依此类推

声明变量,然后每次将变量设置为新实例: