VBA中用For循环遍历ArrayList报错,如何实现无错误遍历?
解决VBA ArrayList遍历的索引越界问题
嘿,这可是ArrayList新手常踩的典型坑!我来帮你捋清楚问题出在哪,以及怎么解决。
错误原因拆解
你用的System.Collections.ArrayList是0基索引的(和VBA原生数组默认的1基规则不一样):
- 第一个元素的索引是
0,最后一个元素的索引是arr.Count - 1 - 你原来的循环写了
For i = 1 To arr.Count,当i等于arr.Count的时候,就超出了ArrayList的最大索引范围,自然会触发「索引超出范围」的错误 - 另外你提到的
LBound和UBound确实只适用于VBA原生数组,ArrayList根本不认这俩方法,它用Count属性来获取元素总数
两种修正方案
方案1:修正索引范围的For循环
把遍历的起始和结束值改成0到arr.Count - 1就行,代码如下:
Function test(dataArray() As Double) Dim i As Long Dim arr As Object Set arr = CreateObject("System.Collections.ArrayList") ' 将原生数组元素导入ArrayList For i = LBound(dataArray) To UBound(dataArray) arr.Add dataArray(i) Next arr.Sort ' 修正索引范围:从0开始,到Count-1结束 For i = 0 To arr.Count - 1 If arr(i) <= 10000 Then ' 这里写你的业务逻辑,比如打印符合条件的元素 Debug.Print arr(i) End If Next End Function
方案2:用For Each遍历(更推荐)
如果你不需要用到索引值,直接用For Each遍历会更简洁,完全不用操心索引的问题:
Function test(dataArray() As Double) Dim num As Variant Dim arr As Object Set arr = CreateObject("System.Collections.ArrayList") ' 将原生数组元素导入ArrayList For i = LBound(dataArray) To UBound(dataArray) arr.Add dataArray(i) Next arr.Sort ' 直接遍历每个元素,无需关心索引 For Each num In arr If num <= 10000 Then ' 这里写你的业务逻辑,比如打印符合条件的元素 Debug.Print num End If Next End Function
额外小贴士
- 以后要获取ArrayList的元素总数,直接用
arr.Count就好,别再想着LBound和UBound啦 - 如果你需要在ArrayList中查找、删除元素,也记得遵循0基索引的规则哦
内容的提问来源于stack exchange,提问作者Ans
相关产品推荐
相关产品推荐

