3

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

2 回答 2

3

您拼错了阵列的名称:

ReDim constans(0)

应该:

ReDim constants(0)

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

我以前从未遇到过这种特别的错误。我真的很震惊 VBA 语言被设置为允许这样做!微软确实对此提出警告强调我的):

注意ReDim如果它声明的变量在模块级别或过程级别不存在,则该语句充当声明性语句。如果稍后创建另一个具有相同名称的变量,即使在更广泛的范围内,ReDim也会引用后面的变量,并且不一定会导致编译错误,即使Option Explicitis in effect。为避免此类冲突,ReDim不应将其用作声明性语句,而应仅用于重新确定数组的维度。

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

于 2013-11-04T09:31:59.750 回答
0

问题出在您的声明中

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..> Compile VBA Project或按Alt > d > l对其进行编译。如果您没有看到消息框,那么它可能会运行

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

于 2013-11-04T10:01:58.580 回答