固定或暂时锁定此数组(错误 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。