按键修改值

时间:2011-04-18 22:04:51

标签: vba

Dim dFeat As Collection
Set dFeat = New Collection

Dim cObj As Collection
Set cObj = New Collection
cObj.Add 3, "PASSED"
cObj.Add 4, "TOTAL"
dFeat.Add cObj, "M1"

Set cObj = New Collection
cObj.Add 5, "PASSED"
cObj.Add 6, "TOTAL"
dFeat.Add cObj, "M2"

dFeat("M1")("TOTAL") = 88 ' Error here
Debug.Print dFeat("M1")("TOTAL")

如何使用密钥修改内部集合的值?

2 个答案:

答案 0 :(得分:8)

Alex K.关于使用Dictionary的建议是正确的,但我认为这里的问题比他的回答更为通用。 Collection键(或该事项的索引位置)仅适用于阅读,而不是写作。

所以在这一行:

dFeat("M1")("TOTAL") = 88 ' Error here

dFeat("M1")没问题。它会返回您使用键“M1”添加的Collection。发生错误是因为您尝试直接分配 集合的元素。通常,如果cCollection,则c("TOTAL")(或c(2))不能是左值。

正如Alek K.所说,解决这个问题的最佳方法是使用Dictionary作为内部“集合”,或者使用内部和外部。以下是使用内部的内容:

Dim d As Dictionary
Set d = New Dictionary

d("PASSED") = 3
d("TOTAL") = 4

dFeat.Add d, "M1"

然后行:

dFeat("M1")("TOTAL") = 88 

将有效,因为dFeat("M1")("TOTAL") 是有效的左值。

如果由于某种原因您不能或不想包含MS Scripting Runtime,则必须使用以下内容替换失败的行:

Dim c As Collection
Set c = dFeat("M1")

Call c.Remove("TOTAL")
Call c.Add(88, "TOTAL")

或更简洁:

Call dFeat("M1").Remove("TOTAL")
Call dFeat("M1").Add(88, "TOTAL")

然后,您可以读取 dFeat("M1")("TOTAL")的值,但仍然无法分配给它。

答案 1 :(得分:3)

您无法更新集合中的值类型;

Dim c as new Collection
c.add 42, "wth"
c("wth") = 88 //will error also

添加对Microsoft Scripting运行时的引用,将Collection替换为Dictionary&它应该工作。