Arrays 擦除后下标超出范围

Arrays 擦除后下标超出范围,arrays,vba,ms-access,erase,Arrays,Vba,Ms Access,Erase,下面的最小示例将崩溃,直到语句被注释掉。为什么? (我找不到此文档。) 子测试() Dim a1()作为整数 雷迪姆a1(0到2) 擦除a1 调试。打印a1(1)'下标超出范围(运行时错误'9') 调试.打印LBound(a1)'下标超出范围(运行时错误'9') 调试.打印UBound(a1)'下标超出范围(运行时错误'9') 端接头 对于I=LBound(a1)到UBound(a1):a1(I)=0:下一个I,是否应将擦除替换为 Erase释放动态数组使用的内存。程序必须使用ReDim语句重

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

子测试()
Dim a1()作为整数
雷迪姆a1(0到2)
擦除a1
调试。打印a1(1)'下标超出范围(运行时错误'9')
调试.打印LBound(a1)'下标超出范围(运行时错误'9')
调试.打印UBound(a1)'下标超出范围(运行时错误'9')
端接头

对于I=LBound(a1)到UBound(a1):a1(I)=0:下一个I,是否应将
擦除
替换为

Erase
释放动态数组使用的内存。程序必须使用
ReDim
语句重新声明数组变量的维度,然后才能再次引用动态数组


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

在您的情况下,如果您有一个动态数组,则无需使用
Erase
。如果要在使用数组后重置数组的所有值,只需发出另一条
Redim
-语句,大小是否保持不变并不重要。除非将
Redim
与关键字
Preserve
一起使用,否则将使用默认值创建所有成员。下面的语句将实现此目的:

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

我不完全确定您试图实现的目标,但当您重拨阵列,然后将其删除时,您不能期望返回某些结果(运行时错误表示删除阵列时无法显示上限/下限)

所以你应该先切换擦除,然后再重拨…但最好在某种循环中使用擦除

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
Sub Test_with_loop()

    Dim a1() As Integer, x As Byte
     
    For x = 0 To 10
        ReDim a1(0 To 2)
        a1(1) = x 'assign value in loop or something
    
        Debug.Print a1(1)        'print something
        Debug.Print LBound(a1)   'print something
        Debug.Print UBound(a1)   'print something
    
        Erase a1 'erase array from memory
    Next x 
End Sub
下面是一个例子,你们可以在循环结束时使用并擦除数组

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
Sub Test_with_loop()

    Dim a1() As Integer, x As Byte
     
    For x = 0 To 10
        ReDim a1(0 To 2)
        a1(1) = x 'assign value in loop or something
    
        Debug.Print a1(1)        'print something
        Debug.Print LBound(a1)   'print something
        Debug.Print UBound(a1)   'print something
    
        Erase a1 'erase array from memory
    Next x 
End Sub

原因在关于Erase语句的MS帮助的第一行中给出。在VBA IDE中,将光标放在Erose语句上,然后按F1。这将显示该关键字的相关MS帮助页面。@freeflow–我在发布问题时链接了上面的页面。但是谢谢。看起来我需要刷新动态数组主题。什么“崩溃”是否意味着?您应该只收到一个错误“解释”,在某种程度上,内存已被释放,并且不存在要返回的内容。。。