Vba 按键修改值

Vba 按键修改值,vba,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, "

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

不能更新集合中的值类型

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")

添加对Microsoft脚本运行时的引用,将
集合
替换为
字典
&它应该会起作用。

Alex K.关于使用
字典
的建议是正确的,但我认为这里的问题比他的回答更一般。
集合
键(或索引位置)只适合阅读,不适合写作

因此,在这一行:

Dim c as new Collection
c.add 42, "wth"
c("wth") = 88 //will error also
dFeat(“M1”)
没有问题。它返回用键“M1”添加的
集合。发生错误的原因是您试图直接分配给该集合的元素。通常,如果
c
集合
c(“总计”)
(或
c(2)
)不能是左值

正如Alek K.所说,最好的解决方法是对内部“集合”使用
字典,或者对内部和外部使用
。以下是将一个用于内部的外观:

dFeat("M1")("TOTAL") = 88 ' Error here
然后,线路:

Dim d As Dictionary
Set d = New Dictionary

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

dFeat.Add d, "M1"
将起作用,因为
dFeat(“M1”)(“TOTAL”)
是有效的左值

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

dFeat("M1")("TOTAL") = 88 
或者更简洁地说:

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

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

然后,您可以读取
dFeat(“M1”)(“TOTAL”)
的值,但您仍然无法为其赋值。

+1对于
,集合键(或索引位置)只适用于读取,而不适用于写入。对于一个项目,去掉一些非常生锈的VBA,这是关键(哈!)——用一个新对象替换整个项目就成功了。在我的例子中,这意味着一个新数组填充了来自现有数组+更改的值。对于大型对象来说,这可能是一种更有效的方法,但我只处理几十个数组,每个数组有2个值。
Call dFeat("M1").Remove("TOTAL")
Call dFeat("M1").Add(88, "TOTAL")