并非所有数组都可以重新确定维度。 即使特别声明为动态的数组和 Variant变量中的数组有时也会临时锁定。 此错误的原因和解决方案如下:
您试图使用 ReDim 更改固定大小数组的元素数。 例如,在下面的代码中,
FixedArr过程中的SomeArr接收固定数组NextOne,然后尝试调整SomeArr的大小:Sub FirstOne Dim FixedArr(25) As Integer ' Create a fixed-size array and NextOne FixedArr() ' pass it to another procedure. End Sub Sub NextOne(SomeArr() As Integer) ReDim SomeArr(35) ' Error 10 occurs here. '. . . End Sub通过用 ReDim 声明数组(如果在过程内声明数组)或通过不指定元素数来声明数组(如果在模块级别声明数组)可使原始数组成为动态数组而不是固定数组。
您试图重新确定模块级别动态数组的维度,该数组中的一个元素已作为参数传递给过程。 例如,在以下代码中,
ModArray是一个动态的模块级数组,其第 45 个元素 是通过引用 过程传递的Test:Dim ModArray () As Integer ' Create a module-level dynamic array. '. . . Sub AliasError() ReDim ModArray (1 To 73) As Integer Test ModArray(45) ' Pass an element of the module-level ' array to the Test procedure. End Sub Sub Test(SomeInt As Integer) ReDim ModArray (1 To 40) As Integer ' Error occurs here. End Sub在此情况下,无需传递模块级别数组的元素,因为它在模块的所有过程中都可见。 但如果传递元素,则会锁定数组,以防止为过程中的引用参数取消分配内存,从而在过程返回时引发不可预测的行为。
您尝试为包含数组的 Variant 变量分配一个值,但 Variant 当前已锁定。 例如,如果代码使用 For Each...Next 循环迭代包含数组的变量,数组将在进入循环时锁定,然后在循环终止时释放:
SomeArray = Array(9,8,7,6,5,4,3,2,1) For Each X In SomeArray SomeArray = 301 ' Causes error since array is locked. Next X使用 For...Next 而不是 For Each...Next 循环进行迭代。 当数组是 For Each...Next 循环的对象时,可以读取但不能写入该数组。
有关其他信息,选择有问题的项并按 F1(在 Windows 中)或 HELP(在 Macintosh 上)。
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。