Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Изменить размеры можно не для всех массивов. Даже массивы, специально объявленные как динамические, а массивы в переменных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 и обратная связь.