【问题标题】:error 9 subscript out of range错误 9 下标超出范围
【发布时间】:2013-11-04 18:33:08
【问题描述】:

我正在尝试使用工作表中的数据填充动态数组。我得到“错误 9 下标超出范围”。为什么?

Sub correct()

Dim row As Integer, i As Long
Dim constants() As Double 'this declares the dynamic array
row = 1
i = 0

ReDim constans(0) 'this resizes the array(rediminsion's the array)

Do Until ThisWorkbook.Sheets("Deg 4").Cells(row, 1).Value = ""
    constants(i) = ThisWorkbook.Sheets("Deg 4").Cells(row, 1).Value
    i = i + 1 'increments array index
    ReDim Preserve constants(i) 'resize the array 1 larger and preserves previous data
    row = row + 1 'increments the worksheet row
Loop 

End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您拼错了阵列名称:

    ReDim constans(0)
    

    应该是:

    ReDim constants(0)
    

    因此,您错误地使用ReDim 声明了一个名为constans 的新数组,而constants 仍未分配。当您到达过程中的constants(i) = ... 行时,您会收到该错误,因为constants 未分配。

    我以前从未遇到过这种特别的错误;我真的很震惊 VBA 语言被设置为允许这样做! Microsoft does warn against this强调我的):

    警告:如果ReDim 声明的变量在模块级别或过程中不存在,则它充当声明性语句 等级。如果稍后创建另一个同名变量,即使 在更广泛的范围内,ReDim 将引用后面的变量并且不会 必然会导致编译错误,即使Option Explicit 是 有效。为避免此类冲突,ReDim 不应用作 声明性语句,但仅用于重新定义数组。

    好的,感谢您隐藏的警告,但他们不应该首先提供ReDim 声明性功能。

    【讨论】:

    • 感谢有关声明性 ReDim 的提示。它以前没有抓住我,但预先警告是预先武装的。我以后不会被它骗了!
    • 感谢这真的有帮助,也感谢关于 ReDim 的警告。我只使用 ReDim,因为它是我知道如何创建动态数组的唯一方法。不使用 ReDim 是不是更好的方法?
    • 没有。就是这样使用它——只要你正确拼写数组名!
    【解决方案2】:

    问题出在你的声明中

    Dim constants() As Double 'this declares the dynamic array
    

    但是你 ReDim 一个不同的未声明数组

    ReDim constans(0) 'this resizes the array(rediminsion's the array)
    

    将缺少的“t”添加到“constans”将解决该问题。如果您想避免无意中使用未声明的变量,请转到工具..> 选项..> 编辑器选项卡并确保选中 "需要变量声明 - 这将在顶部插入 Option Explicit您创建的每个模块(但不是您现有的模块)。

    声明 Option Explicit 和 CamelCase 变量后,当您以小写形式输入变量名(即 camelcase)时,下次按 Enter 时,它们将更改为声明的 CamelCase确认输入的名称已被声明。如果它没有改变,那么它是未声明的,当您尝试运行该过程时会导致编译错误。

    运行您的程序之前,编译它通过转到Debug..>编译VBA项目或按 Alt > d > l。如果您没有看到消息框,那么它可能会运行

    PS:您的当前循环可能会得到意想不到的结果,因为我的测试显示 constants(0) = 1 依此类推,直到 constants(last i) = 0。可能不是您想要的,但如果是的,那么……一切都好!

    【讨论】:

    • Option Explicit 在这种情况下无济于事。编译时不会显示错误,因为constans not 未声明;它由ReDim 声明。请参阅my answer,您可能想在发布之前阅读它。不过,关于 camelCase 技巧的要点是;我还建议使用自动完成(Ctrl-空格)来防止拼写错误。
    • @Jean-FrançoisCorbett 我正在慢慢打字,而你却打败了我。在发布之前我确实注意到已经发布了另一个答案,但有点害怕看着它可能会抹掉我所有的工作。
    猜你喜欢
    • 2019-02-06
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2015-01-01
    • 2019-12-15
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多