【问题标题】:Updating an array stored in a VBA dictionary更新存储在 VBA 字典中的数组
【发布时间】:2025-12-14 00:00:01
【问题描述】:

我正在创建一个使用嵌套字典和最低级别列表的数据结构。这是我的数据示例:

Country, Customer, Purchased
US, Alan, Lawnmower
US, Alan, Hammer
US, Karen, Donkey
US, Simon, Mustang
MX, Carl, Lawnmower
MX, Alan, Donkey
...

我想到的数据结构看起来像dictionary --> dictionary --> array——也就是country --> customer --> purchased。计划是每个dictionary --> dictionary 组合都有一个新数组。

但是,当我尝试更新数组时,它似乎链接到 dictionary --> dictionary 结构的所有较低级别。即第三行处理完后,出现如下情况:

US --> Alan --> [Lawnmower, Hammer, Donkey]
US --> Karen --> [Lawnmower, Hammer, Donkey]

...而我期望看到的是:

US --> Alan --> [Lawnmower, Hammer]
US --> Karen --> [Donkey]

这是我尝试使用的代码:

i_p = UBound(purchased_array)

Redim Preserve purchased_array(i_p + 1)

purchased_array(i+p + 1) = item ' new item to add to the array

dataset(country)(customer) = purchased_array

但是,这导致dictionary --> dictionary 结构的每个最低级别都引用了基本相同的数组。

对我做错了什么有什么想法吗?

【问题讨论】:

  • 为什么是dictionary --> dictionary --> array,为什么不是dictionary --> dictionary --> collection
  • 我相信collection 是一个键控数据结构?我可以用它代替数组吗?
  • 当然,集合对象支持.Add(Item, [Key])方法,但是key是可选的。所以,你可以省略它。在您的情况下,使用集合代替数组会更简单
  • 如果您在字典中有一个数组,您必须先将其从字典中拉出,然后才能对其进行修改。然后放回去。
  • @TimWilliams 当你说“拉出来”时回复:一个数组,你在说什么方法?我尝试将数组复制到临时文件。数组,然后插入临时。数组,但具有相同的最终结果。有没有办法将数组设置为 NULL 或类似的?

标签: arrays excel vba data-structures dictionary


【解决方案1】:

如果您在字典中有一个数组,则必须先将其从字典中取出,然后才能对其进行修改。然后放回去。

Sub Tester()

Dim x As Long, y As Long
Dim dict As New Scripting.Dictionary
Dim d As Scripting.Dictionary
Dim arr

    For x = 1 To 3
        Set d = New Scripting.Dictionary
        For y = 1 To 3
            d.Add "nextkey" & y, Array("A_" & x & "_" & y, _
                                       "B_" & x & "_" & y)
        Next y
        dict.Add "key" & x, d
    Next x

    Debug.Print Join(dict("key1")("nextkey1"), ", ") '>> A_1_1, B_1_1

    'try to modify array while stored in dictionary...
    dict("key1")("nextkey1")(1) = "newValue1" '<<< doesn't work!

    Debug.Print Join(dict("key1")("nextkey1"), ", ") '>> A_1_1, B_1_1

    'have to pull it out of the dictionary if you want to change it...
    arr = dict("key1")("nextkey1")
    arr(1) = "newValue2"
    dict("key1")("nextkey1") = arr

    Debug.Print Join(dict("key1")("nextkey1"), ", ") '>> A_1_1, newValue2

End Sub

【讨论】:

  • 好的,我想我遵循你所做的。但是如果你想扩展arr 数组会发生什么?也就是说,它应该是一个动态数组,根据购买列中的条目数增长/收缩。
  • 一旦它在字典之外,您就可以像使用常规数组一样使用它 - 如果您想扩展它,那应该不是问题。
【解决方案2】:

字典包含成对的集合。此外,字典中的键列表必须是唯一的。在包含 Country 和 Customer 之间关系的*字典中,按照该标准,country 和 customer 都不是唯一的。所以,我认为字典不合适。也许你可以试试Dictionary -&gt; Array -&gt; Array

【讨论】: