我有一个Excel VBA宏,同事们已经使用了几年没有问题,并且突然到12月1日,每个人都收到“运行时错误'9':下标超出范围”错误。下面的代码总结了问题的要点:
Dim before As Long
Dim after As Long
Dim baseInd As Variant
baseInd = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
before = LBound(baseInd)
ReDim Preserve baseInd(1 To 18)
after = LBound(baseInd)
即使在指定数组baseInd应该从索引1开始之后,它仍然从0开始(这里的变量在值为0之后变量,之前是变量),这最终导致我的其余代码崩溃。我最近了解了Option Base 1指令,但我不能在这里使用它,因为这会导致其他数组出现问题。
以前这个曾经很好地工作过,我没有丝毫的线索,为什么突然间(2014年12月1日)我收到了这个错误。有人有想法吗?
谢谢!
答案 0 :(得分:0)
据我所知,VBA在2014年1月12日没有任何改变会导致这种情况发生。如果没有更多代码,就无法知道代码中的原因。
但是,这突出了依赖默认数组下限的危险。您应该返回并在所有数组声明中指定下限。
例如
Redim arr(5 to 42) As SomeType
请注意,虽然您可以使用Option Base ...
指定默认下限,但这仅适用于未指定显式下限的数组。
另一种选择(以及我的思想,劣等)方式是省略Redim的下限:
ReDim Preserve baseInd(GL_LABL_ORI)
更新OP的后续行动
你说即使指定了数组baseInd应该从索引1开始,但你的代码中没有任何地方指定下限为1.下限实际上是由{{1功能。有关详细信息,请参阅VBA在线帮助。
答案 1 :(得分:0)
从我们在公司看到的情况以及经过大量研究后,最近发布的MS KB3003057安全补丁似乎打破了ReDim Preserve功能。有关其他人如何看待相同问题的详细信息,请参阅this forum。