Установка свойства Item коллекции в VBA - PullRequest
11 голосов
/ 27 сентября 2011

Я удивлен тем, как трудно это было сделать, но я думаю, что это быстрое решение, поэтому я спрошу здесь (искал в Google и документации, но ни один не помог).У меня есть код, который добавляет элементы в коллекцию, используя ключи.Когда я сталкиваюсь с ключом, который уже существует в коллекции, я просто хочу установить его, добавив число к текущему значению.

Вот код:

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 ]

16 голосов
/ 27 сентября 2011

Вы не можете редактировать значения после их добавления в коллекцию.Так что это невозможно:

aColl.Item(aKey) = aColl.Item(aKey) + someValue

Вместо этого вы можете вынуть объект из коллекции, отредактировать его значение и добавить его обратно.

temp = aColl.Item(aKey)
aColl.Remove aKey
aColl.Add temp + someValue, aKey

Это немного утомительно, но поместите эти три строки в Sub, и все готово.

Коллекции более удобны, когда они используются в качестве контейнеров для объектов (в отличие от контейнеров для «примитивных» переменных, таких как integer, double и т. Д.).Вы не можете изменить ссылку на объект, содержащийся в коллекции, но вы можете манипулировать объектом, прикрепленным к этой ссылке.

Кстати, я думаю, вы неправильно поняли синтаксис, связанный с Item.Вы не можете сказать: aColl(aKey).Item.Правильный синтаксис: aColl.Item(aKey), или, если коротко, aColl(aKey), поскольку Item является методом по умолчанию для объекта Collection.Тем не менее, я предпочитаю использовать полную, явную форму ...

10 голосов
/ 27 сентября 2011

Dictionaries более универсальны и более эффективны по времени, чем Collections.Если вы пошли по этому пути, вы можете запустить простой тест Exists в Словаре непосредственно ниже, а затем обновить значение ключа

Патрик Мэтьюз написал отличную статью о словарях в коллекциях

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
0 голосов
/ 27 сентября 2011

Я думаю, вам нужно удалить существующую пару ключ-значение, а затем снова добавить ключ в коллекцию, но с новым значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...