Изменение значений массива в словаре VBA - PullRequest
8 голосов
/ 08 марта 2010

У меня есть кусок кода, который, кажется, не делает то, что от него ожидают. Массивы VBA являются непостоянными во всех отношениях, но кажется, что когда они хранятся в словаре в виде значений некоторых ключей, они больше не являются непостоянными. Есть идеи?

Sub foo()
    Dim mydict As New Dictionary
    mydict.Add "A", Array(1, 2, 3)
    MsgBox mydict("A")(1)
    ''# The above shows 2, which is fine
    mydict("A")(1) = 34
    MsgBox mydict("A")(1)
    ''# The above also shows 2, which is not fine
End Sub

Ответы [ 3 ]

10 голосов
/ 08 марта 2010

Кажется, вам еще нужно установить другую переменную для обновления значения массива.

mArray = mydict.Item(1)
mArray(1) = 34
mydict.Item(1) = mArray
0 голосов
/ 16 апреля 2018

Я создал процедуру, чтобы решить ту же проблему, чтобы я мог сохранить ее как «oneliner»:

Private Sub pReplaceDicArray(Dic As Object, kEy As Variant, Element As Integer, NewValue)
    Dim tempArray As Variant
    tempArray = Dic(kEy)
    tempArray(Element) = NewValue
    Dic(kEy) = tempArray
End Sub
' call as:
' Call mReplaceDicArray(Dic, "A", 1, 8)
0 голосов
/ 10 марта 2017

Я бы написал этот ответ как комментарий к ответу мистера Иризарри, но мне не разрешено. В любом случае .... Я пытался написать последнюю строку кода (ниже), чтобы назначить массив первому элементу словаря, но это не сработало. Массив в этом элементе остался прежним.

mydict.items(1) = mArray

Судя по тому, что я читал в другом месте, это, похоже, связано с тем экземпляром словаря, к которому вы обращаетесь. Я изменил его на следующую строку, и это сработало.

mydict(mydict.keys(1)) = mArray

Я до сих пор не уверен, почему это так, но это так.

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