我很惊讶这是多么艰难,但我想这是一个快速修复,所以我会在这里问(搜索谷歌和文档,但没有帮助)。我有一些代码使用键将项添加到集合中。当我遇到集合中已存在的密钥时,我只想通过在当前值中添加一个数字来设置它。
以下是代码:
If CollectionItemExists(aKey, aColl) Then 'If key already has a value
'add value to existing item
aColl(aKey).Item = aColl(aKey) + someValue
Else
'add a new item to the collection (aka a new key/value pair)
mwTable_ISO_DA.Add someValue, aKey
End If
我第一次将键/值对添加到集合中时,我添加了一个整数作为值。当我再次遇到密钥时,我尝试向该值添加另一个整数,但这不起作用。我不认为问题在于任何类型的对象不匹配或类似的东西。我目前得到的错误信息是
运行时错误424:对象必需
答案 0 :(得分:16)
一旦将值添加到集合中,就无法对其进行编辑。所以这是不可能的:
aColl.Item(aKey) = aColl.Item(aKey) + someValue
相反,您可以将对象从集合中取出,编辑其值,然后将其添加回来。
temp = aColl.Item(aKey)
aColl.Remove aKey
aColl.Add temp + someValue, aKey
这有点单调乏味,但将这三行放在Sub中,你就完成了。
当集合用作对象的容器时(与整数,双精度等“原始”变量的容器相对),集合更加友好。您无法更改集合中包含的对象引用,但可以操作附加到该引用的对象。
另一方面,我认为您误解了与Item
相关的语法。你不能说:aColl(aKey).Item
。正确的语法是aColl.Item(aKey)
,或者简称为aColl(aKey)
,因为Item
是Collection对象的默认方法。但是,我更喜欢使用完整,明确的形式...
答案 1 :(得分:10)
Dictionaries
比Collections
更通用,更节省时间。如果你走这条路线,你可以直接在下面的字典上运行一个简单的Exists
测试,然后更新键值
Patrick Matthews撰写了一篇关于dictionaries v collections
的精彩文章Sub Test()
Dim MyDict
Set MyDict = CreateObject("scripting.dictionary")
MyDict.Add "apples", 10
If MyDict.exists("apples") Then MyDict.Item("apples") = MyDict.Item("apples") + 20
MsgBox MyDict.Item("apples")
End Sub
答案 2 :(得分:0)
我认为您需要删除现有的键值对,然后再次将该键添加到集合中,但使用新值