以下最小示例崩溃,直到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
吗?
答案 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