在VBA中设置Collection的Item属性

时间:2011-09-26 23:32:15

标签: vba

我很惊讶这是多么艰难,但我想这是一个快速修复,所以我会在这里问(搜索谷歌和文档,但没有帮助)。我有一些代码使用键将项添加到集合中。当我遇到集合中已存在的密钥时,我只想通过在当前值中添加一个数字来设置它。

以下是代码:

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:对象必需

3 个答案:

答案 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)

DictionariesCollections更通用,更节省时间。如果你走这条路线,你可以直接在下面的字典上运行一个简单的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)

我认为您需要删除现有的键值对,然后再次将该键添加到集合中,但使用新值