错误9下标超出范围

时间:2013-11-04 07:14:34

标签: excel vba excel-vba

我正在尝试使用工作表中的数据填充动态数组。我得到“错误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

2 个答案:

答案 0 :(得分:3)

你错误拼写了阵列的名字:

ReDim constans(0)

应该是:

ReDim constants(0)

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

我之前从未遇到过这种特殊的搞砸;我真的很震惊VBA语言设置允许这个! Microsoft does warn against this强调我的):

  

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

好的,感谢隐藏得很好的警告,但他们应该首先没有给出ReDim声明功能。

答案 1 :(得分:0)

问题在于您的声明

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

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

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

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

声明Option Explicit和CamelCase变量时,当您按下 Enter 时,以小写字母(即camelcase)输入变量名称时,它们将更改为{ {1}}声明确认输入的名称已经宣布。如果它没有改变那么它是未声明的,当你尝试运行该程序时它将导致编译错误。

之前 运行您的程序,编译,转到调试..&gt;编译VBA项目或按 Alt&gt; d>升。如果您没有看到消息框,则可能会运行

PS:你的当前循环可能会得到意想不到的结果,因为我的测试显示常量(0)= 1等等,直到常数(最后一个)= 0.可能不是你想要的但是如果它是,然后......一切都好!

相关问题