VBA字典中数组元素赋值问题:如何为数组索引设置值?
为什么VBA字典中的数组元素修改后不生效?
你碰到的问题本质是VBA处理数组和字典的机制问题:当你把数组添加到字典时,VBA会创建一个数组的副本存储进去,而不是存储数组的引用。所以你写的dict.Item("L")(3) = 500这行代码,其实只是修改了一个临时生成的数组副本——修改完成后这个副本就被销毁了,字典里原本存储的数组完全没被改动,自然输出还是空值。
解决办法
方法1:取出数组→修改→重新存入字典
这就是你想到的思路,操作简单,适合偶尔修改的场景:
Option Explicit Sub test() Dim dict As Dictionary Dim arr() As Long Dim i As Variant Set dict = New Dictionary ReDim arr(1 To 8) ' 方式1:先修改原数组再存入字典 arr(3) = 500 dict.Add "L", arr ' 如果后续需要修改字典里的数组,先取出到临时数组,修改后存回 arr = dict.Item("L") arr(5) = 1000 ' 新增修改 dict.Item("L") = arr ' 输出验证 For Each i In dict.Item("L") Debug.Print i Next End Sub
方法2:用类包装数组(通过引用修改)
如果需要频繁修改字典中的数组元素,反复复制数组会有点低效,这时可以把数组包装在一个类里,让字典存储类对象的引用——这样修改就能直接作用到原数组上:
- 插入一个类模块,命名为
ArrayHolder,添加如下代码:
Public arr() As Long
- 主过程代码:
Option Explicit Sub testWithClass() Dim dict As Dictionary Dim arrHolder As ArrayHolder Dim i As Variant Set dict = New Dictionary Set arrHolder = New ArrayHolder ReDim arrHolder.arr(1 To 8) ' 将类对象存入字典(存储的是引用) dict.Add "L", arrHolder ' 直接通过对象引用修改数组,无需重新存入字典 dict.Item("L").arr(3) = 500 dict.Item("L").arr(6) = 700 ' 输出验证 For Each i In dict.Item("L").arr Debug.Print i Next End Sub
总结
- 简单场景选方法1,代码直观易维护;
- 频繁修改数组的场景选方法2,避免反复复制数组的开销。
内容的提问来源于stack exchange,提问作者Your Mammy
相关产品推荐
相关产品推荐

