VBA数组作为字典值:更改值时出现意外错误

时间:2018-04-16 09:23:27

标签: arrays vba dictionary

我想在字典中使用数组作为一组值 为什么会这样,我不能像改变它们那样改变那些数组中的值,如果它们是"简单"数组?
让我们看一些例子:
如果我创建一个数组,并更改第n个元素的值,则会发生确定

Sub arrTest()
    Dim a As Variant
    a = Array(1, 2, 3)
    Debug.Print a(0), a(1), a(2)
    a(1) = 8
    Debug.Print a(0), a(1), a(2)
End Sub
'Output:
' 1             2             3 
' 1             8             3 

如果我尝试对词典中的数组执行相同的操作,它们根本不会更改,但也不会给出错误消息。参见:

Sub tess()
    Dim Dic As Object, Coll As Collection
    Set Dic = CreateObject("scripting.dictionary")

    Dic.Add "A", Array(1, 2)
    Dic.Add "B", 5

    Debug.Print Dic.keys()(0), Dic(Dic.keys()(0))(0), Dic(Dic.keys()(0))(1)
    Debug.Print Dic.keys()(1), Dic(Dic.keys()(1))
    Dic("A")(1) = 8
    Dic("B") = 8
    Debug.Print Dic.keys()(0), Dic(Dic.keys()(0))(0), Dic(Dic.keys()(0))(1)
    Debug.Print Dic.keys()(1), Dic(Dic.keys()(1))
End Sub
'Output:
'A              1             2 
'B              5 
'
'A              1             2 
'B              8 

在上面的示例中,我的非数组值正确地更改为8,而数组中的值仍为2
为什么这样,错误在哪里......等等?


修改
正如@FloLie建议的那样,不幸的是,在与Dictionary中的Arrays进行交互时,会创建一个不可见的副本,这会造成混乱。
但是,对于我的代码中的简单操作,我无法实现多线混乱,所以这是我的最终解决方案

Private Sub mReplaceDicArray(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)

1 个答案:

答案 0 :(得分:2)

问题在于,当您使用Dic("A")将数组从字典中取出时,您将获得副本而不是引用。见:already bound

解决方案是将副本临时存储在变量中,在dict中操作并替换它:

mArray = Dic("A")
mArray(1) = 8
Dic("A") = mArray