我正在尝试使用工作表中的数据填充动态数组。我得到“错误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
答案 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”将解决这个问题。如果您想避免无意中使用未声明的变量,请转到工具..>选项..>编辑器选项卡并确保选中“需要变量声明 - 这将在您创建的每个模块的顶部插入Option Explicit
(但不是现有模块)。< / p>
声明Option Explicit
和CamelCase变量时,当您按下 Enter 时,以小写字母(即camelcase
)输入变量名称时,它们将更改为{ {1}}声明确认输入的名称已经宣布。如果它没有改变那么它是未声明的,当你尝试运行该程序时它将导致编译错误。
之前 运行您的程序,编译,转到调试..&gt;编译VBA项目或按 Alt&gt; d>升。如果您没有看到消息框,则可能会运行
PS:你的当前循环可能会得到意想不到的结果,因为我的测试显示常量(0)= 1等等,直到常数(最后一个)= 0.可能不是你想要的但是如果它是,然后......一切都好!