修改Dictionary中的数组将被忽略

时间:2018-05-16 18:47:59

标签: vba

以下代码:

Dim arr As Variant, item As Variant
arr = Array(1)
arr(0) = 5
For Each item In arr
    Debug.Print item
Next

打印5;它似乎成功地修改了数组的内容。

但是,如果我创建Dictionary,并将数组放在其中一个字典键上:

Dim dict As New Scripting.Dictionary, item As Variant
dict("a") = Array(1)
dict("a")(0) = 5
For Each item In dict("a")
    Debug.Print item
Next

数组是只读的;编辑被忽略,代码打印1 - 原始值。

为什么我可以修改通过变量引用的数组的元素,但不能修改通过调用Dictionary.Item引用的数组的元素;我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

以下是字典的实例:

Listening on http://127.0.0.1:6796
[1] "I should only print once"
[1] "Return input"
[1] "test"

还要看一下嵌套数组:

Sub Test()

    Dim dict As New Scripting.Dictionary, item As Variant
    dict("a") = Array(1)
    Dim arr
    arr = dict("a")
    arr(0) = 5
    dict("a") = arr
    For Each item In dict("a")
        Debug.Print item
    Next

End Sub

答案 1 :(得分:0)

只是通过扩展@omegastripes答案的例子以及我对VBA中引用变量的评论来澄清你的问题

  

评论:您正在设置字典的值。您没有设置数组项的值。你不能设置字典   item对数组的引用 - 您可以设置一个数组值然后设置   数组项的字典 - 但是使用的值不是   参考

这是一个示例,表明当您将变量分配给另一个变量时,VBA不存储对该变量的引用

Sub Test()

    Dim dict As Object, item As Variant

    Dim arr

    Set dict = CreateObject("Scripting.Dictionary")

    dict("a") = Array(1)

    arr = dict("a")
    arr(0) = 5
    dict("a") = arr
    For Each item In dict("a")
        Debug.Print item
        ' Prints 5
    Next

    ' Change array contents
    arr(0) = 10
    For Each item In dict("a")
        Debug.Print item
        ' Still Prints 5
    Next

End Sub

立即窗口中的结果将是:

5
5

答案 2 :(得分:0)

我可以在字典中使用嵌套字典而不是数组:

Dim dict As New Scripting.Dictionary, item As Variant
Set dict("a") = New Dictionary
dict("a")(0) = 5
For Each key In dict("a")
    Debug.Print dict("a")(key)
Next