固定或暂时锁定此数组(错误 10)
并非所有数组都可以重新确定维度。 即使特别声明为动态的数组和 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。