Изменение массива в Словаре игнорируется - PullRequest
0 голосов
/ 16 мая 2018

следующий код:

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 голосов
/ 16 мая 2018

Просто чтобы прояснить ваши вопросы с примером, расширяющим ответ @omegastripes и мои комментарии по ссылкам на переменные в VBA

КОММЕНТАРИИ: Вы устанавливаете значение словаря. Вы НЕ устанавливаете значение элемента массива. Вы не можете установить словарь элемент для ссылки на массив - вы можете установить значение массива, а затем установить словарь для элемента массива - но это использует значение, а не ссылка

Вот пример, показывающий, что 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
0 голосов
/ 17 мая 2018

Я могу использовать вложенные словари вместо массива в словаре:

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
0 голосов
/ 16 мая 2018

Вот рабочий пример со словарем:

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

А также взгляните на вложенные массивы:

Sub TestArrays()

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

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