【问题标题】:Subscript out of Range after Erase擦除后下标超出范围
【发布时间】:2020-11-09 12:43:57
【问题描述】:

以下最小示例崩溃,直到 Erase 语句被注释掉。为什么?
(我找不到这个记录。)

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

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

【问题讨论】:

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

标签: arrays vba ms-access erase


【解决方案1】:

来自链接的文档:

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


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

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

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

【讨论】:

    【解决方案2】:

    我不完全确定您要达到的目标,但是当您重新调整数组然后删除它时,您不能期望返回某些结果(运行时错误说当您删除数组时它无法显示上限/下限.

    所以你应该切换 Erase 然后 Redim 它...但是在某种循环中使用擦除会很好。

    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
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 2015-05-27
      • 2021-09-18
      • 2012-04-28
      • 2017-01-18
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多