ReDim Preserve停止使用Excel VBA代码

时间:2014-12-06 22:07:58

标签: excel-vba dynamic-arrays vba excel

我有一个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日)我收到了这个错误。有人有想法吗?

谢谢!

2 个答案:

答案 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