Оператор ReDim

Используется на уровне процедуры для перераспределения дискового пространства для переменных динамического массива.

Синтаксис

ReDim [ Preserve ] varname ( subscripts ) [ Astype ], [ varname ( subscripts ) [ Astype ]] . .

Синтаксис оператора ReDim состоит из таких частей:

Part Описание
Сохранить Необязательный параметр. Ключевое слово, которое используется, чтобы сохранить данные в существующем массиве при изменении размера только последнего измерения.
варнаме Обязательно. Имя переменной; соответствует стандартным соглашениям об именовании переменных.
Индексы Обязательно. Измерения любой переменной массива; может быть объявлено до 60 множественных измерений. Аргумент subscriptsиспользует следующий синтаксис:

[lowerTo] upper [ , [lowerTo] upper ] . .

Если явно не указано в нижней части, нижняя граница массива управляется оператором Option Base . Если оператор Option Base отсутствует, нижняя граница равна нулю.
type Необязательный параметр. Тип данных переменной; Может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (для строк переменной длины), Stringlength (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или тип объекта.

Используйте отдельное предложение типаAs для каждой определяемой переменной. В случае переменной типа Variant, содержащей массив, type описывает тип каждого элемента массива, но не меняет тип Variant на другой.

Замечания

Инструкция ReDim используется для изменения размера или изменения размера динамического массива, который уже официально объявлен с помощью инструкций Private, Public или Dim с пустыми скобками (без индексов измерения).

Многократно используйте инструкцию ReDim , чтобы изменить количество элементов и измерений в массиве. Однако вы не можете объявить массив с одним типом данных, а затем использовать ReDim, чтобы изменить тип массива, если этот массив не содержится в переменной Variant. Если массив содержится в типе Variant, тип элементов можно изменить с помощью предложения типаAs, если вы не используете ключевое слово Preserve, в этом случае изменение типа данных не допускается.

Если вы используете ключевое слово Preserve, вы можете изменить только размер последнего измерения массива, но не количество измерений. Например, если у вашего архива всего одно измерение, вы не сможете изменить размер этого измерения, потому что оно является последним и единственным. Однако, если у вашего массива два и более измерений, вы можете изменить размер только последнего измерения и сохранить содержание архива.

В следующем примере показано, как вы можете увеличить размер последнего измерения динамического массива, не удаляя данные из массива.

ReDim X(10, 10, 10) 
. . . 
ReDim Preserve X(10, 10, 15) 

Также, когда вы пользуетесь Preserve, вы можете изменить размер массива, лишь изменяя верхнюю границу; изменение нижней границы вызовет ошибку.

Если вы уменьшаете массив, данные удаленных элементов будут потеряны.

При инициализации переменных числовой переменной присваивается значение 0, строке переменной длины — строка нулевой длины (""), а строка фиксированной длины заполняется нулями. Переменные типа Variant при инициализации получают значение Empty. Каждый элемент переменной определяемого пользователем типа инициализируется как отдельная переменная.

Переменная, ссылающаяся на объект, должна быть назначена существующему объекту с помощью инструкции Set , прежде чем его можно будет использовать. Пока ему не назначен объект, объявленная объектная переменная имеет специальное значение Nothing, которое указывает, что она не ссылается на какой-либо конкретный экземпляр объекта.

Оператор ReDim действует как декларативный оператор, если объявленная переменная не существует на уровне модуля или процедуры. Если позже создается другая переменная с тем же именем, даже расширенная, оператор ReDim будет относиться к более поздней переменной и не обязательно вызовет ошибку компиляции, даже если действует Option Explicit. Для предотвращения таких конфликтов ReDim не следует использовать как оператор объявления, а лишь для изменения измерений архивов.

Примечание.

Чтобы изменить размер массива, который содержится в переменной Variant, сначала нужно ее явнообъявить.

Пример

В этом примере оператор ReDim выделяет и перераспределяет место для хранения переменных динамического архива. В нем предполагается, что оператор Option Base имеет значение 1.

Dim MyArray() As Integer ' Declare dynamic array. 
Redim MyArray(5) ' Allocate 5 elements. 
For I = 1 To 5 ' Loop 5 times. 
 MyArray(I) = I ' Initialize array. 
Next I 

Следующий оператор изменяет размер массива и удаляет элементы.

Redim MyArray(10) ' Resize to 10 elements. 
For I = 1 To 10 ' Loop 10 times. 
 MyArray(I) = I ' Initialize array. 
Next I 

Следующий оператор изменяет размер массива, но не удаляет элементы.

Redim Preserve MyArray(15) ' Resize to 15 elements. 

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.