为什么我在尝试重新编写时会出现下标范围错误?

时间:2016-06-09 15:05:21

标签: vba ms-access

我试图创建一个动态数组,在循环中添加单位。 每当我尝试重新编辑并添加一个单元时,我都会收到以下错误:

下标超出范围

我的代码:

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),但这也没有效果。

2 个答案:

答案 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倍。