在VBA字典中更改数组值

10

我有一段代码似乎没有达到预期的效果。 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

1
问题在于,当您使用mydict("A")从字典中获取数组时,您得到的是副本而不是引用。请参见:https://dev59.com/jnM_5IYBdhLWcg3wXyDZ#1402986 - jtolle
4个回答

13

看起来你需要设置另一个变量来更新数组的值。

mArray = mydict.Item(1)
mArray(1) = 34
mydict.Item(1) = mArray

2
我创建了一个过程来解决相同的问题,所以我可以将其保留为“单行代码”:
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

复制数组并更新值:

mydict("A") = Array(mydict("A")(0), 34, mydict("A")(2))

0

我本来想将这篇答案写成对Irizarry先生的评论,但是我没被允许。然而... 我尝试编写下面的最后一行代码来将数组分配给字典的第一个项目,但它没有起作用。该项中的数组仍然保持原样。

mydict.items(1) = mArray

根据我在其他地方读到的内容,似乎与调用字典实例有关。我将它改为以下一行代码,并发现它起作用了。
mydict(mydict.keys(1)) = mArray

我还不确定为什么会这样,但是事实就在那里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接