删除后下标超出范围

时间:2020-07-20 09:26:53

标签: arrays vba ms-access erase

以下最小示例崩溃,直到Scenario Outline语句被注释掉为止。为什么?
(我找不到此文档。)

Sub Test()
  Dim a1() As Integer
  ReDim a1(0 To 2)
  Erase a1
  Debug.Print a1(1)       ' Subscript out of range (Run-time error '9')
  Debug.Print LBound(a1)  ' Subscript out of range (Run-time error '9')
  Debug.Print UBound(a1)  ' Subscript out of range (Run-time error '9')
End Sub

我应该将Erase替换为For i = LBound(a1) to UBound(a1): a1(i) = 0: Next i吗?

2 个答案:

答案 0 :(得分:4)

从链接的文档中:

Erase释放动态数组使用的内存。在程序再次引用动态数组之前,它必须使用ReDim语句重新声明数组变量的尺寸。


对于{em>静态和动态数组,Erase的行为是不同的。对于静态数组,该命令会将所有成员重置为其默认值(数字为0,字符串为空字符串)。对于动态数组,它将删除所有成员,情况与您从未使用过Redim的情况相同。

在您的情况下,如果您有动态数组,则无需使用Erase。如果要在使用数组后重置数组的所有值,只需发出另一个Redim语句,大小不变即可。除非您将Redim与关键字Preserve一起使用,否则将使用默认值创建所有成员。以下语句可以解决问题:

ReDim a1(LBound(a1) To UBound(a1))

答案 1 :(得分:1)

我不确定您要实现的目标,但是当您重新阵列并擦除它时,您将无法期望返回某些结果(运行时错误表示删除阵列时无法显示上限/下限

因此,您应该先切换“擦除”,然后再对其进行重编...但是最好在某种循环中使用“擦除”。

const getDateTime = () => {
    let today = new Date();
    let date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
    let time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
    return new Date();
};

所以这是一个示例,您可以在循环结束时使用并擦除数组。

Sub Test()
  Dim a1() As Integer
  Erase a1 'no point erasing when it is not used yet
  ReDim a1(0 To 2)
  Debug.Print a1(1)       
  Debug.Print LBound(a1)  
  Debug.Print UBound(a1)  
End Sub
相关问题