Поделиться через


Этот массив является фиксированным либо временно заблокирован (ошибка 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 сорок пятый элемент которого передается по ссылке на процедуру 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 и обратная связь.