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