VBA字典中嵌套数组Resize操作语法错误问题求助
解决VBA字典中嵌套数组扩容的语法错误问题
我明白你遇到的麻烦了——直接对从字典里取出的嵌套数组内层元素用ReDim Preserve会触发语法错误,这是因为VBA不允许直接通过外层Variant数组的索引来调整内层数组的大小。咱们得换个思路,先把内层数组提取到单独的Variant变量里,调整完大小再放回去。
错误原因分析
你当前的代码里,outerArr = .Item(animalName)取出的是一个包含两个数组的Variant,但你不能直接写ReDim Preserve outerArr(0)(...),VBA无法识别这种嵌套的数组调整语法。必须先把outerArr(0)和outerArr(1)赋值给独立的Variant变量,再对这些变量进行扩容操作。
修正后的完整代码
' 记得提前显式声明所有Variant变量 Dim animalDict As Object Dim animalName As String Dim kilosEatenCount As Double, kilosGainedCount As Double Dim kilosEatenArr As Variant, kilosGainedArr As Variant Dim outerArr As Variant Dim tempEaten As Variant, tempGained As Variant Set animalDict = CreateObject("Scripting.Dictionary") With animalDict '检查动物是否已在字典中 '若不存在,创建键值对:(动物名称):[[进食千克数],[增重千克数]] If Not .Exists(animalName) Then ReDim kilosEatenArr(0) ReDim kilosGainedArr(0) ReDim outerArr(1) kilosEatenArr(0) = kilosEatenCount kilosGainedArr(0) = kilosGainedCount outerArr(0) = kilosEatenArr outerArr(1) = kilosGainedArr .Add Key:=animalName, Item:=outerArr Else outerArr = .Item(animalName) ' 1. 提取内层数组到临时Variant变量 tempEaten = outerArr(0) tempGained = outerArr(1) ' 2. 对临时数组进行扩容(保留原有数据) ReDim Preserve tempEaten(LBound(tempEaten) To UBound(tempEaten) + 1) ReDim Preserve tempGained(LBound(tempGained) To UBound(tempGained) + 1) ' 3. 添加新元素到扩容后的数组末尾 tempEaten(UBound(tempEaten)) = kilosEatenCount tempGained(UBound(tempGained)) = kilosGainedCount ' 4. 将更新后的临时数组放回外层数组 outerArr(0) = tempEaten outerArr(1) = tempGained ' 5. 更新字典中的条目 .Item(animalName) = outerArr End If End With
关键注意事项
- 确保所有涉及数组的Variant变量都提前显式声明,这正是VBA文档要求的,你之前已经做了这一步,很好!
- 使用
ReDim Preserve时,只能调整数组的最后一维大小,这里我们的内层都是一维数组,所以没问题。 - 提取内层数组到临时变量是核心步骤,这样VBA才能正确识别并调整数组的大小。
内容的提问来源于stack exchange,提问作者Caerus
相关产品推荐
相关产品推荐

