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–我在发布问题时链接了上面的页面。但是谢谢。看起来我需要刷新动态数组主题。什么“崩溃”是否意味着?您应该只收到一个错误“解释”,在某种程度上,内存已被释放,并且不存在要返回的内容。。。