我试图创建一个动态数组,在循环中添加单位。 每当我尝试重新编辑并添加一个单元时,我都会收到以下错误:
下标超出范围
我的代码:
dim arr()
strSql = "SELECT item from dupEmail"
Set rs = CurrentDb.OpenRecordset(strSql)
rs.MoveFirst
ReDim arr(0)
Do While Not rs.EOF
arr(UBound(arr, 1)) = rs.Fields(0)
ReDim Preserve arr(1, UBound(arr, 1) + 1)
rs.MoveNext
Loop
我尝试了ReDim Preserve arr(0, UBound(arr, 0) + 1)
,但这也没有效果。
答案 0 :(得分:2)
我认为更容易发布建议的代码:注释并不全部显示:你已经Redim at 0 index,所以你需要的是为每条记录增加。它会在最后创建一个不必要的,删除它。
dim arr()
strSql = "SELECT item from dupEmail"
Set rs = CurrentDb.OpenRecordset(strSql)
rs.MoveFirst
ReDim arr(0)
Do While Not rs.EOF
arr(UBound(arr)) = rs.Fields(0)
ReDim Preserve arr(UBound(arr) + 1)
rs.MoveNext
Loop
ReDim Preserve arr(UBound(arr) - 1)
或者简单地使用rs.RecordCount而不是Redim(0)重新编译所有记录,并避免循环中的Redim。你当然需要一个柜台。
答案 1 :(得分:1)
ReDim arr(a, b)
与
相同ReDim arr(0 To a, 0 To b)
你想要的是
ReDim arr(a To b)
在你的情况下,你将ar arr作为一个长度为1且带有ReDim arr(0)
的一维数组。然后你尝试将它作为二维数组ReDim。如果你不使用Preserve
工作正常,但Preserve
它不知道在哪里放旧值(我认为)并抛出错误。
为了解决您的问题,请将ReDim Preserve arr(1, UBound(arr, 1) + 1)
替换为ReDim Preserve arr(1 To UBound(arr, 1) + 1)
,但评论中提到了其他更好的建议。请记住" redimming"可能很费时间。在最坏的情况下,程序必须分配新的(更大的)内存并在每次迭代中复制旧位置的所有内容。无论如何它可能不会引人注意,但在循环之前分配整个数组仍然是更好的做法。
编辑:哦,没有注意到评论中已经提到过它。
edit2:在非代表性测试中,循环内的重新调整大约需要预先重新调整的6倍。