Redim preserve vba что это
Redim preserve vba что это
Применяется на уровне процедуры для перераспределения памяти для переменных динамического массива.
Параметры
Preserve
Необязательный. Ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности.
имяПеременной
Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
индексы
Обязательный. Размерности переменной массива; допускается описание до 60 размерностей. Аргумент индексы использует следующий синтаксис:
Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
тип
Необязательный. Тип данных переменной; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (для строк переменной длины), String * длина (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или объектный тип. Для каждой описываемой переменной следует использовать отдельное предложение As тип. Для значения типа Variant, содержащего массив, тип описывает тип данных каждого элемента массива, но не заменяет тип Variant на какой-либо другой тип.
Замечания
Инструкция ReDim используется для задания или изменения размера динамического массива, который уже был формально описан с помощью инструкции Private, Public или Dim с пустыми скобками (без индексов размерностей).
Имеется возможность повторно использовать инструкцию ReDim для изменения числа элементов и размерностей массива. Однако не допускается описание массива с одним типом данных и использование инструкции ReDim для последующего изменения типа данных этого массива, если массив не содержится в переменной типа Variant. Тип элементов массива, содержащегося в переменной типа Variant, может быть изменен с помощью предложения As тип, если ранее не было использовано ключевое слово Preserve, запрещающее изменение типа данных.
При использовании ключевого слова Preserve имеется возможность изменить значение только последней размерности массива и не допускается изменение числа размерностей. Например, если массив имеет только одну размерность, имеется возможность изменить эту размерность, так как она является последней и единственной размерностью. Однако, если массив имеет две или более размерности, возможно изменение значения только последней размерности, сохраняя при этом содержимое массива. В следующем примере показывается, как можно увеличить значение последней размерности динамического массива без уничтожения данных, содержащихся в этом массиве.
Кроме того, при использовании ключевого слова Preserve допускается изменение размера массива только за счет изменения верхней границы индекс; попытка изменить нижнюю границу приведет к ошибке.
Если уменьшить размер массива, данные из удаленных элементов будут потеряны. При передаче массива в процедуру по ссылке нельзя изменять размеры массива в процедуре.
При инициализации переменных числовая переменная получает значение 0, строка переменной длины получает значение пустой строки («»), а строка фиксированной длины заполняется нулями. Переменные типа Variant получают при инициализации значение Empty. Каждый элемент переменной типа, определяемого пользователем, при инициализации получает значение, которые он получил бы, если бы являлся одиночной переменной. Переменной со ссылкой на объект перед ее использованием необходимо присвоить существующий объект с помощью инструкции Set. До присвоения объекта описанная объектная переменная имеет специальное значение Nothing, которое указывает, что она не содержит ссылку на какой-либо определенный экземпляр объекта.
Инструкция ReDim действует как инструкция описания, даже если описываемая в ней переменная не существует на уровне модуля или на уровне процедуры. При создании в дальнейшем переменной с тем же именем, возможно, в более широкой области определения, инструкция ReDim будет ссылаться на эту последнюю переменную и не обязательно вызовет ошибку компиляции, даже при действующей инструкции Option Explicit. Во избежание подобных конфликтов не следует использовать инструкцию ReDim как инструкцию описания. Пользуйтесь ей только для изменения размеров массивов.
Для изменения размера массива, содержащегося в переменной типа Variant, нужно явно описать переменную типа Variant перед попыткой изменения размера.
Пример
В данном примере инструкция ReDim используется для выделения и повторного выделения памяти для динамических массивов. Предполагается, что Option Base равняется 1.
Следующая инструкция изменяет размер массива и обнуляет его элементы.
Следующая инструкция изменяет размер массива, но сохраняет существующие элементы.
VBA ReDim
Excel VBA ReDim
Как использовать VBA ReDim Statement?
Мы обсудим, как использовать VBA ReDim Statement, используя несколько примеров.
Когда мы используем Dim для массива, мы не можем изменить значение хранилища данных в массиве. Но когда мы используем Redim, мы можем изменить сохраненное значение в массиве. Этот процесс изменения массива называется изменением размеров массива.
Предположим, у нас есть массив A со значением 4 ячеек, тогда он будет определен с помощью;
Как мы видим, все ячейки имеют «0» в качестве сохраненного значения. Теперь предположим, что если мы Redim the Dim A с 3 ячейками данных и сохраним в нем значение, то это будет выглядеть так, как показано ниже.
Это будет выглядеть как;
Теперь, если мы хотим добавить в него ячейки, мы можем это сделать. Затем он автоматически назначит «0» этим ячейкам. Теперь для реализации ReDim нажмите Alt + F11, чтобы открыть окно VBA. А из меню «Вставка» выберите «Модуль», чтобы открыть новое окно, как показано ниже.
Теперь перед определением ReDim сначала определите любое целое число. Здесь мы определили его как «A» с длиной массива 3. И сохраняем некоторые значения в созданном массиве из 3 ячеек, как показано ниже.
Теперь, печатая значения, хранящиеся в Integer A, нам нужно создать окно сообщения с помощью команды MsgBox, как показано ниже.
Теперь запустите код, нажав на кнопку воспроизведения или клавишу F5, как показано ниже.
Теперь мы будем использовать ReDim, и он будет хранить больше, чем определенные символы в массиве. Для этого используйте ReDim для определенного целого числа A. Во-первых, мы удалим определенное количество ячеек из Dim. Использование функции Redim заключается в следующем:
После этого запустите полный код, нажав кнопку воспроизведения или клавишу F5. Как только мы запустим полный код, мы получим 3 окна сообщений, но с сообщением, содержащим только «0», как показано ниже.
Это потому, что ReDim на самом деле имеет только 3 значения, но не содержит хранимых значений в определенных целых числах. Использование только Redim не сохраняет никаких значений и переносит в них ранее сохраненные значения. Чтобы применить то же самое, нам нужно сохранить значения определенного целого числа A с помощью ReDim. Используя Preserve в VBA, мы можем сохранить значение в ReDim. Для этого мы добавим Preserve после ReDim в коде VBA, показанном ниже.
Теперь снова запустите полный код. Мы увидим 3 окна сообщений со всеми сохраненными значениями, как показано ниже.
Теперь вам должно быть интересно, почему мы использовали A (4) с ReDim Preserve?
Если мы попытаемся увидеть значения, хранящиеся в 4- й и 5- й позиции массива ReDim, то нам нужно также вставить окно сообщения для этих 2 позиций.
Как мы добавили сообщение в штучной упаковке на 4- й и 5- й позиции без сохранения какого-либо значения. Теперь запустите код снова.
Как мы видим на скриншотах выше, для 4- й и 5- й позиции мы получили окна сообщений, но значение отображается как «0». Что означает, объясняет приведенное выше утверждение. Если значение не определено, ReDim Preserve автоматически учитывает и заполняет «0» в остальных ячейках.
Теперь давайте посмотрим, как использовать ReDim Statement с String вместо Integer.
После этого запустите полный код с помощью клавиши F5 или вручную, как показано ниже.
Как мы можем видеть на скриншоте выше, мы получаем все определенные и сохраненные символы в первых 3 окнах сообщений. А в 4- м и 5- м боксе мы ничего не получаем. Поскольку ReDim не хранит значение, если оно не определено. Для целых чисел он будет отображаться как «0», но со строкой он будет показывать только пустые сообщения.
Плюсы Excel VBA ReDim
То, что нужно запомнить
Рекомендуемые статьи
ReDim Statement (Visual Basic)
Reallocates storage space for an array variable.
Syntax
Parts
Term | Definition |
---|---|
Preserve | Optional. Modifier used to preserve the data in the existing array when you change the size of only the last dimension. |
name | Required. Name of the array variable. See Declared Element Names. |
boundlist | Required. List of bounds of each dimension of the redefined array. |
Remarks
You can use the ReDim statement to change the size of one or more dimensions of an array that has already been declared. If you have a large array and you no longer need some of its elements, ReDim can free up memory by reducing the array size. On the other hand, if your array needs more elements, ReDim can add them.
You can use ReDim only at procedure level. Therefore, the declaration context for the variable must be a procedure; it can’t be a source file, a namespace, an interface, a class, a structure, a module, or a block. For more information, see Declaration Contexts and Default Access Levels.
Rules
Multiple Variables. You can resize several array variables in the same declaration statement and specify the name and boundlist parts for each variable. Multiple variables are separated by commas.
Array Bounds. Each entry in boundlist can specify the lower and upper bounds of that dimension. The lower bound is always 0 (zero). The upper bound is the highest possible index value for that dimension, not the length of the dimension (which is the upper bound plus one). The index for each dimension can vary from 0 through its upper bound value.
The number of dimensions in boundlist must match the original number of dimensions (rank) of the array.
Data Types. The ReDim statement cannot change the data type of an array variable or its elements.
Initialization. The ReDim statement cannot provide new initialization values for the array elements.
Rank. The ReDim statement cannot change the rank (the number of dimensions) of the array.
Properties. You can use ReDim on a property that holds an array of values.
Behavior
Array Replacement. ReDim releases the existing array and creates a new array with the same rank. The new array replaces the released array in the array variable.
Example
The following example increases the size of the last dimension of a dynamic array without losing any existing data in the array, and then decreases the size with partial data loss. Finally, it decreases the size back to its original value and reinitializes all the array elements.
The Dim statement creates a new array with three dimensions. Each dimension is declared with a bound of 10, so the array index for each dimension can range from 0 through 10. In the following discussion, the three dimensions are referred to as layer, row, and column.
The second ReDim creates another new array and copies all the elements that fit. However, five columns are lost from the end of every row in every layer. This is not a problem if you have finished using these columns. Reducing the size of a large array can free up memory that you no longer need.
The third ReDim creates another new array and removes another five columns from the end of every row in every layer. This time it does not copy any existing elements. This statement reverts the array to its original size. Because the statement doesn’t include the Preserve modifier, it sets all array elements to their original default values.
Массивы в VBA: как работать с массивами
Мы очень хорошо знаем, что переменная является контейнером для хранения значения. Иногда разработчики могут удерживать более одного значения в одной переменной за раз. Когда ряд значений хранится в одной переменной, он известен как переменная массива.
Объявление массивов
Массивы объявляются так же, как объявлена переменная, за исключением того, что объявление переменной массива использует скобки. В следующем примере размер массива указан в скобках.
Назначение значений массиву
Значения присваиваются массиву, указывая значение индекса массива для каждого из назначаемых значений. Это может быть строка.
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
Value stored in Array index 0 : 1
Value stored in Array index 1 : VBScript
Value stored in Array index 2 : 100
Value stored in Array index 3 : 2.45
Value stored in Array index 4 : 7/10/2013
Value stored in Array index 5 : 12:45:00 PM
Многомерные массивы
Массивы не ограничиваются одним измерением, однако они могут иметь максимум 60 измерений. Двумерными массивами являются наиболее часто используемые.
В следующем примере многомерный массив объявляется с тремя строками и четырьмя столбцами.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
Объявление ReDim
Оператор ReDim используется для объявления переменных динамического массива и распределения или перераспределения пространства для хранения.
В следующем примере массив был переопределен, а затем значения сохранялись при изменении существующего размера массива.
Примечание. При изменении размера массива, меньшего, чем это было первоначально, данные в устраненных элементах будут потеряны.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
Методы массива
В VBScript есть встроенные функции, которые помогают разработчикам эффективно обрабатывать массивы. Все методы, которые используются вместе с массивами, перечислены ниже. Чтобы узнать об этом, нажмите на имя метода.
Функции для работы с массивами
LBound
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The smallest Subscript value of the given array is : 0
The smallest Subscript of the first dimension of arr2 is : 0
The smallest Subscript of the Second dimension of arr2 is : 0
Функция, которая возвращает целое число, соответствующее наименьшему индексу данных массивов.
UBound
Функция UBound возвращает наибольший индекс указанного массива.Следовательно, это значение соответствует размеру массива.
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The Largest Subscript value of the given array is : 5
The Largest Subscript of the first dimension of arr2 is : 3
The Largest Subscript of the Second dimension of arr2 is : 2
Функция, которая возвращает целое число, соответствующее самому большому индексу данных массивов.
Split
Функция Split возвращает массив, который содержит определенное количество значений, разделенных на основе разделителя.
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value of array in 0 is :Red
The value of array in 1 is : Blue
The value of array in 2 is : Yellow
Функция, которая возвращает массив, содержащий указанное количество значений. Разделить на разделитель.
Это функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value of b is :Red Blue Yellow
The Join result after using delimiter is : Red$Blue$Yellow
Функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.
Filter
Функция фильтра, которая возвращает массив на основе нуля, который содержит подмножество массива строк на основе определенных критериев фильтра.
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.p The Filter result 1: Blue
The Filter result 2: Red
The Filter result 2: Blue
The Filter result 2: Yellow
The Filter result 3: Yellow
Функция, которая возвращает массив с нулевым основанием, который содержит подмножество массива строк на основе определенных критериев фильтра.
IsArray
Функция IsArray возвращает логическое значение, указывающее, является ли указанная входная переменная переменной или переменной NOT переменной массива.
Синтаксис IsArray(variablename)
пример
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The IsArray result 1 : True
The IsArray result 2 : False
Функция, возвращающая логическое значение, указывающее, является ли входная переменная массивом.
Erase
Функция Erase используется для сброса значений массивов фиксированного размера и освобождения памяти динамических массивов.Он ведет себя в зависимости от типа массивов.
Добавьте кнопку и добавьте следующую функцию.
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value at Zeroth index of NumArray is
The value at First index of NumArray is
The value at Second index of NumArray is
The value at Third index of NumArray is
Функция, которая восстанавливает выделенную память для переменных массива.
Объявление массивов
Массивы объявляются так же, как и другие переменные, при помощи операторов Dim, Static, Private или Public Отличие скалярных переменных (которые не являются массивами) от переменных массивов заключается в том, что для массива, как правило, необходимо указывать размер. Массив с указанным размером является массивом фиксированного размера. Массив, размер которого можно изменить во время выполнения программы, является динамическим массивом.
Индексация массива от 0 или 1 зависит от оператора Option Base. Если не указано Option Base 1, все индексы массива будут начинается с нуля.
Объявление статического массива
В приведенном ниже примере кода массив фиксированного размера объявлен массивом целых переменных (Integer) с 11 строками и 11 столбцами:
Первый аргумент определяет количество строк, второй — столбцов.
Как и в случае объявления любой другой переменной, если для объявленного массива не указать тип данных, его элементам будет присвоен тип данных Variant. Каждый числовой элемент Variant массива использует 16 байтов. Каждый строчный элемент Variant использует 22 байта. Чтобы написать как можно более компактный код, четко объявите для своих массивов тип данных, отличный от Variant.
В приведенном ниже примере кода сравниваются размеры нескольких массивов.
Максимальный размер массивов зависит от операционной системы и доступного объема памяти. Использование массивов, размер которых превышает объем доступной оперативной памяти вашего компьютера, приводит к снижению скорости, поскольку системе необходимо выполнять запись данных и чтение с диска.
Объявление динамического массива
Объявив динамический массив, вы сможете менять его размер во время выполнения кода. Используйте операторы Static, Dim, Private или Public, чтобы объявить массив, не указывая значение в скобках, как показано в следующем примере:
Вы можете неявно объявить массив в процедуре при помощи оператора ReDim. Будьте внимательны и вводите имя массива без ошибок при использовании оператора ReDim. Даже если в модуль включен оператор Option Explicit, будет создан второй массив.
В процедуре внутри области массива используйте оператор ReDim, чтобы изменить количество измерений, задать количество элементов и определить нижнюю и верхнюю границы каждого измерения. Вы можете менять динамический массив при помощи оператора ReDim в любое время. Однако значения внутри массива при этом не сохраняются. Используйте ReDim Preserve для расширения массива, сохраняя при этом текущие значения.
Например, приведенный ниже оператор увеличивает массив на 10 элементов, сохраняя при этом текущие значения исходных элементов.
При использовании ключевого слова Preserve внутри динамического массива можно менять только верхнюю границу последнего измерения; изменить количество измерений нельзя.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.