Изменить значение по ключу - PullRequest
8 голосов
/ 19 апреля 2011
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")

Как изменить значение внутренней коллекции с помощью ключа?

Ответы [ 2 ]

8 голосов
/ 19 апреля 2011

Совет Алекса К. об использовании Dictionary верен, но я думаю, что проблема здесь более общая, чем позволяет предположить его ответ.Клавиша Collection (или индексная позиция в этом отношении) хороша только для чтения, но не для записи.

Итак, в этой строке:

dFeat("M1")("TOTAL") = 88 ' Error here

dFeat("M1") в порядке.Возвращает Collection, который вы добавили с помощью клавиши "M1".Ошибка происходит потому, что вы пытаетесь напрямую назначить элемент этой коллекции.В общем, если c является Collection, c("TOTAL") (или c(2)) не может быть lvalue.

Как говорит Алек К., лучший способ обойти это - использовать 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") - это действительное значение lvalue.

Если по какой-то причине вы не можете или не хотите включать среду выполнения сценариев MS, вам придется заменить сбойную строку на что-то вроде:

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"), но вы по-прежнему не можете назначить его.

3 голосов
/ 19 апреля 2011

Нельзя обновить тип значения в коллекции;

Dim c as new Collection
c.add 42, "wth"
c("wth") = 88 //will error also

Добавьте ссылку на среду выполнения сценариев Microsoft, замените Collection на Dictionary, и она должна работать.

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