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")
如何使用密钥修改内部集合的值?
答案 0 :(得分:8)
Alex K.关于使用Dictionary
的建议是正确的,但我认为这里的问题比他的回答更为通用。 Collection
键(或该事项的索引位置)仅适用于阅读,而不是写作。
所以在这一行:
dFeat("M1")("TOTAL") = 88 ' Error here
dFeat("M1")
没问题。它会返回您使用键“M1”添加的Collection
。发生错误是因为您尝试直接分配 集合的元素。通常,如果c
是Collection
,则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
&它应该工作。