Excel VBA:如何修改包含一维数组的ArrayList元素?
解决VBA中ArrayList里一维数组元素的修改问题
嘿,我来帮你搞定这个问题!你遇到的是VBA处理ArrayList中数组元素的一个典型坑——直接通过MyArrayList.Item(1)(0)修改元素根本不会生效,因为你操作的只是原数组的临时副本而已。
为什么你的代码无法正常运行?
当你从ArrayList中取出数组元素(比如MyArrayList.Item(1))时,VBA会生成一个该数组的临时变体副本。你修改这个副本的元素后,这个副本会在代码执行完当前行后被丢弃,ArrayList里存储的原数组完全不会受到影响。这就是为什么你修改MyArrayList.Item(1)(0)后,原数组的内容还是没变的原因。
正确的修改方法
要修改ArrayList中的数组元素,你需要遵循三个步骤:
- 把ArrayList中的数组提取到一个临时数组变量中
- 修改这个临时数组的元素
- 将修改后的临时数组重新赋值回ArrayList的对应位置
修正后的示例代码
Sub foobarFixed() Dim MyArrayList As New ArrayList Dim tempArr As Variant ' 定义临时数组变量 ' 给ArrayList添加元素 MyArrayList.Add "hello" MyArrayList.Add Array("a", "b") ' 初始输出 Debug.Print MyArrayList.Item(0) ' 返回"hello" Debug.Print MyArrayList.Item(1)(0) ' 返回"a" ' 修改普通字符串元素(这部分原代码是正常的) MyArrayList.Item(0) = "bye" ' 修改数组元素的正确操作 tempArr = MyArrayList.Item(1) ' 把ArrayList中的数组提取到临时变量 tempArr(0) = "z" ' 修改临时数组的元素 MyArrayList.Item(1) = tempArr ' 把修改后的数组放回ArrayList ' 验证修改结果 Debug.Print MyArrayList.Item(0) ' 返回"bye" Debug.Print MyArrayList.Item(1)(0) ' 返回"z",修改成功! End Sub
额外注意事项
- 确保你已经引用了
System.Collections库(在VBA编辑器的「工具」→「引用」里勾选mscorlib.dll或者System.Collections),否则ArrayList无法正常使用。 - 如果你的数组是固定长度数组(比如用
Dim arr(1) As String定义的),修改元素时要确保不会越界;如果是动态数组,可以用ReDim调整大小后再修改。
内容的提问来源于stack exchange,提问作者sergio trajano
相关产品推荐
相关产品推荐

