Excel vba массив

Массивы в VBA

Массивы используются в большинстве языков программирования и VBA, как язык высокого уровня, тоже не мог обойтись без них. Данный материал расскажет о создании массивов, их применении, а так же вы здесь найдете примеры использования массивов. Для начала разберем синтаксис определения массивов.

Объявление массивов

Пример 1. Создание (объявление) одномерного массива выполняется, так:

В данном примере объявляются: одномерный массив Arr1, содержащий ячейки с 0-й до 10-й типа Integer, массив Arr2, содержащий ячейки с 5-й до 10-й типа String и динамический массив Arr3.

Прежде чем использовать динамический массив, его необходимо “инициализировать”, т.е. выделить для него необходимую память. Менять размер динамического массива можно много раз в программе, даже в цикле, если хотите. Правда учитывайте, что выделение памяти для массива – ресурсно-затратная операция, поэтому не стоит менять размер массива очень часто, это сильно замедлит программу.

Пример 2. Инициализация динамического массива и изменение его размеров

В данном примере мы сначала с помощью ReDim задали размер динамического массива в 11 элементов (c 0-го по 10-й), а затем снова увеличили размер до 21-го элемента. Кроме того, использовали ключевое слово Preserve – означающее, что нужно сохранить уже имеющиеся элементы с их значениями (без этого ключевого слова массив обнуляется).

Примечание: изменение размеров функцией ReDim возможно только для динамических массивов. Если размер массива был изначально задан, то его размер уже не будет меняться функцией.

Пример 3. Объявление многомерного массива

Arr4 – двумерных массив 11х11 элементов, а массив Arr5 – трехмерный.

Пример 4. Создание массива массивов

В следующем примере массив Arr2 будет содержать элементы другого массива Arr1

Определение нижней и верхней границы массива

Чтобы узнать какой самый наименьший индекс у массива и какой самый максимальный индекс массива, нужно использовать функции LBound для определения нижней границы и UBound для определения верхней границы.

Пример 5. Определение границ массива

Чтобы определить границы многомерных массивов, нужно просто использовать второй параметр функций UBound и LBound.

Задание нижней границы по-умолчанию

Иногда бывает очень не удобно, что VBA начинает нумерацию элементов массивов с нуля (0), это часто может привести к путанице и усложнению кода программы. Для решения этой проблемы есть специальный оператор Option Base , аргумент которого может быть 0 или 1. Указав значение 1, индексация массивов будет начинаться с 1, а не с 0.

Пример 6. Указание нижней границы по-умолчанию.

В данном примере я намеренно использовал процедуру, чтобы показать, что Option Base нужно применять не внутри процедур и функций, а в разделе “Declarations”. В результате выполнения процедуры Test будет отображено сообщение с индексом нижней границы массива, т.е. “1”.

Примечание: Оператор Option Base так же влияет на функцию Array и не влияет на функцию Split (будут рассмотрены ниже), что означает, что при задании “Option Base 1”, функция Array вернет массив с индексацией с 1-цы, а функция Split вернет массив с индексацией с 0.

Запись данных в массивы

Для сохранения каких-либо значений в массив, можно воспользоваться несколькими способами. С помощью примеров, покажу эти способы.

Пример 7. Запись данных в массив в цикле.

Пример 8. Запись заранее известных данных с помощью Array

Функция Array возвращает массив из перечисленных данных типа Variant. При этом, массив, который будет содержать значения, должен быть динамическим, т.е. без указания его размеров и границ.

Пример 9. Получение массива из строки с разделителями

Обход элементов массива

Обычно, массивы используются для хранения большого кол-ва данных, а не 1-2 значений, поэтому чтобы получить все эелементы и использовать их для чего-то, обычно используют циклы. Наиболее удобны в этом плане циклы For и For Each .

Пример 10. Обход элементов массива циклом For.

Пример 11. Обход элементов массива циклом For Each.

Иногда, бывает необходимость работы с массивом внутри других типов циклов, но получение значение элемента, всё-равно в них будет таким же, как и в цикле For, т.е. через индекс элемента.

Источник: codernotes.ru

VBA Excel. Массивы (одномерные, многомерные, динамические)

Массивы в VBA Excel: одномерные, многомерные и динамические. Объявление и использование массивов. Операторы Public, Dim и ReDim. Функции Array, LBound, UBound.

Массивы – это множества однотипных элементов, имеющих одно имя и отличающиеся друг от друга индексами. Они могут быть одномерными (линейными), многомерными и динамическими. Массивы в VBA Excel, как и другие переменные, объявляются с помощью операторов Dim и Public. Для изменения размерности динамических массивов используется оператор ReDim. Массивы с заранее объявленной размерностью называют статическими.

Одномерные массивы

Объявление одномерных (линейных) статических массивов в VBA Excel:

В первом случае публичный массив содержит 10 элементов от 0 до 9 (нижний индекс по умолчанию – 0, верхний индекс – 9), а во втором случае локальный массив содержит 9 элементов от 1 до 9.

По умолчанию VBA Excel считает в массивах нижним индексом нуль, но, при желании, можно сделать нижним индексом по умолчанию единицу, добавив в самом начале модуля объявление «Option Base 1». Вместо верхнего индекса можно использовать переменную.

Многомерные массивы

Объявление многомерных статических массивов в VBA Excel аналогично объявлению одномерных массивов, но с добавлением размерностей дополнительных измерений через запятую:

Третий массив состоит из 10000 элементов – 10×10×10×10.

Динамические массивы

Динамические массивы в VBA Excel, в отличие от статических, объявляются без указания размерности:

Такие массивы используются, когда заранее неизвестна размерность, которая определяется в процессе выполнения программы. Когда нужная размерность массива становится известна, она в VBA Excel переопределяется с помощью оператора ReDim:

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

С помощью оператора ReDim невозможно изменить обычный массив, объявленный с заранее заданной размерностью. Попытка переопределить размерность такого массива вызовет ошибку компиляции с сообщением: Array already dimensioned (Массив уже измерен).

При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения, используйте оператор Preserve:

Обратите внимание!
Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.

Использование массивов

Приведу два примера, где не обойтись без массивов.

1. Как известно, функция Split возвращает одномерный массив подстрок, извлеченных из первоначальной строки с разделителями. Эти данные присваиваются заранее объявленному строковому (As String) одномерному динамическому массиву. Размерность устанавливается автоматически в зависимости от количества подстрок.

2. Данные в массивах обрабатываются значительно быстрее, чем в ячейках рабочего листа. Построчную обработку информации в таблице Excel можно наблюдать визуально по мерцаниям экрана, если его обновление (Application.ScreenUpdating) не отключено. Чтобы ускорить работу кода, можно значения из диапазона ячеек предварительно загрузить в динамический массив с помощью оператора присваивания (=). Размерность массива установится автоматически. После обработки данных в массиве кодом VBA полученные результаты выгружаются обратно на рабочий лист Excel. Обратите внимание, что загрузить значения в диапазон ячеек рабочего листа через оператор присваивания (=) можно только из двумерного массива.

Читайте также:  Как скрыть все примечания в excel одновременно

Функции Array, LBound, UBound

Функция Array

Функция Array возвращает массив элементов типа Variant из первоначального списка элементов, перечисленных через запятую. Нумерация элементов в массиве начинается с нуля. Обратиться к элементу массива можно, указав в скобках его номер (индекс).

Источник: vremya-ne-zhdet.ru

Канал в Telegram

Вы здесь

Статические и динамические массивы в VBA

Что такое массив?

Массив это набор элементов одинакового типа, которые имеют общее имя. А обращение к этим элементам происходит по их индексу. Проще говоря, это множество переменных собранных в одну группу по определенному типу. Для более ясного понимания возьмем, например, жемчужные бусы, одни черного цвета, другие белого. Так вот, бусы черного и белого цвета это массивы жемчужин, сгруппированные по цвету, черный и белый, а жемчужины являются элементами этих массивов.
Массивы бывают одномерными (линейными), те же вышеупомянутые бусы и многомерными – двумерные(матрицы, 2D), трехмерные и т.д. Статические – кол-во элементов массива объявляется на этапе разработки и не изменяется в процессе выполнения программы, и динамические – число элементов и размерность изменяется в процессе работы программы.

Объявление статических массивов в VBA

Массив в VB объявляется как обычная переменная, после ключевого слова Dim или Public, с той лишь разницей, что после имени переменной (перед ключевым словом “As“) должны быть скобки.
Dim Mas () as integer

Статические массивы объявляются с указанием верхней и нижней границы:
Dim Mas (2 to 50) as integer

Объявить массив также можно указав только кол-во элементов:
Dim Mas (50) as integer

В этом случае нижняя граница будет установлена по умолчанию 0. Если Вы хотите что бы первым индексом во всех массивах была 1, то Вам необходимо в начале модуля (перед первой процедурой) указать следующее:
Option Base 1

Для объявления многомерных массивов используется запись следующего вида:
Dim Matrix (1 to 10, 1 to 10) as integer
Dim V3D (10, 10,10) as integer ‘трехмерный массив
Dim V4D (10, 10, 25, 5) as integer ‘четырехмерный массив
и т.д.

Объявление динамических массивов в VBA

Динамический массив – не имеет предопределенного кол-ва элементов и определяется без указания в скобках границ:
Dim MyDynMas () as integer

Но динамический массив можно будет использовать только после программного определения границ, после ключевого слова ReDim:
Dim MyDynMas () as integer
‘некоторый код или расчет границ
i=4
Redim MyDynMas (i)

x = i +13
Redim MyDynMas (x)

после переопределения кол-ва элементов массива, все элементы обнуляются. Для того чтобы сохранить значения элементов массива, после ReDim необходимо добавить ключевое слово Preserve:

Redim Preserve MyDynMas (x)

Так же возможно переопределить размерность массивов, например с одномерного на двух-трех-мерный:
Dim MyDynMas () as integer
‘некоторый код или расчет границ
i=4
Redim MyDynMas (i)

x = i +13
Redim MyDynMas (i, x)

но учтите, что при переопределении размерности массива, использование ключевого слова Preserve для сохранения значений элементов – невозможно!

Рассмотрим примеры по работе со статическими и динамическими массивами.

Пример 1:
Дан одномерный массив с тремя элементами и матрица 3х4 (3 строки, 4 столбца). Необходимо умножить каждый элемент одномерного массива со всеми элементами строки матрицы, т.е. 1-й элемент умножаем со всеми элементами первой строки матрицы, 2-й со второй строкой и т.д. Результат вывести в виде матрицы в сообщении.

Option Explicit
Option Base 1

Sub StatMas()
Dim Mas(3) As Integer
Dim Matr(3, 4) As Integer
Dim Msg As String
Dim i, j As Integer

‘заполняем масивы
Mas(1) = 2: Mas(2) = 4: Mas(3) = 6

Matr(1, 1) = 4: Matr(1, 2) = 5: Matr(1, 3) = 1: Matr(1, 4) = 7
Matr(2, 1) = 12: Matr(2, 2) = 10: Matr(2, 3) = 2: Matr(2, 4) = 9
Matr(3, 1) = 24: Matr(3, 2) = 11: Matr(3, 3) = 6: Matr(3, 4) = 3

Msg = “Результат:” & Chr(13)
For i = 1 To 3
For j = 1 To 4
Matr(i, j) = Matr(i, j) * Mas(i)
‘добавляем результат в строку сообщения, резделитель TAB (chr(9))
Msg = Msg & CStr(Matr(i, j)) & Chr(9)
Next j
‘добавляем перенос на новую строку chr(13)
Msg = Msg & Chr(13)
Next i
MsgBox Msg
End Sub

Пример 2:
Двухмерный массив не известной длины заполняется следующим образом Mas(i,j) = i * j. Размеры массива вводятся пользователем с помощью формы InputBox. Результат вывести в сообщении.

Sub DynMasTest()
Dim Msg As String
Dim i, j, col, row As Integer
Dim DynMas() As Long

Msg = “Результат:” & Chr(13)

col = InputBox(“Введите кол-во столбцов массива”, _
“Пример создания динамического массива”, 2)
row = InputBox(“Введите кол-во строк массива”, _
“Пример создания динамического массива”, 2)

ReDim Preserve DynMas(col, row)

For i = 1 To col
For j = 1 To row
DynMas(i, j) = i * j
Msg = Msg & CStr(DynMas(i, j)) & Chr(9)
Next j
Msg = Msg & Chr(13)
Next i
MsgBox Msg
End Sub

И напоследок, для того чтобы узнать (получить) длину массива воспользуйтесь функцией UBound(). Запись типа UBound(Mas) вернет кол-во элементов одномерного массива. Если же необходимо узнать длину многомерного массива, то функция примет вид UBound(Matr, 2) – вернет кол-во элементов второго измерения, UBound(Matr, 3) – третьего и т.д. Запись же UBound(Matr, 1) равносильна UBound(Mas).

Sub GetLengthMas()
Dim Matr(3, 4, 5) As Integer

MsgBox “Размер массива: ” & UBound(Matr, 1) & “x” & UBound(Matr, 2) & “x” & UBound(Matr, 3) _
& Chr(13) & “Всего элементов: ” & UBound(Matr, 1) * UBound(Matr, 2) * UBound(Matr, 3)
End Sub

Источник: www.programm-school.ru

Массивы в Visual Basic for Application

Массивы в Visual Basic for Application – это структуры, которые обычно хранят наборы взаимосвязанных переменных одного типа. Доступ к записям массива осуществляется по их числовому индексу.

Например, есть команда из 20 человек, имена которых нужно сохранить для дальнейшего использования в коде VBA. Можно было бы просто объявить 20 переменных для хранения каждого имени, вот так:

Но можно использовать гораздо более простой и организованный способ – сохранить список имён членов команды в массиве из 20 переменных типа String:

В строке, показанной выше, мы объявили массив. Теперь запишем значение в каждый из его элементов, вот таким образом:

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

Читайте также:  Работа с эксель с текстом

Как это работает продемонстрировано ниже на примере кода, который выводит имена каждого члена команды последовательно в ячейки столбца A активного рабочего листа Excel.

Очевидно, что работа с массивом, в котором сохранено 20 имён, значительно менее громоздка и более аккуратна, чем использование 20 отдельных переменных. А что, если этих имён не 20, а 1000? А если, вдобавок, требуется сохранить отдельно фамилии и отчества?! Ясно, что вскоре станет совершенно невозможно справиться с таким объёмом данных в коде VBA без помощи массива.

Многомерные массивы в Excel Visual Basic

Массивы Visual Basic, о которых шла речь выше, считаются одномерными. Это означает, что они хранят простой список имён. Однако, массивы могут иметь множество измерений. Например, двумерный массив можно сравнить с сеткой значений.

Предположим, что нужно сохранить ежедневные показатели продаж за январь для 5 разных команд. Для этого потребуется двумерный массив, состоящий из 5 наборов показателей для 31 дня. Объявим массив таким образом:

Для того, чтобы получить доступ к элементам массива Jan_Sales_Figures, нужно использовать два индекса, указывающих день месяца и номер команды. Например, адрес элемента, содержащего показатели продаж для 2-ой команды за 15-ое января будет записан так:

Таким же образом можно объявить массив с 3-мя и более измерениями – достаточно добавить дополнительные измерения в объявление массива и использовать дополнительные индексы для ссылки на элементы этого массива.

Объявление массивов в Excel Visual Basic

Ранее в этой статье мы уже рассмотрели несколько примеров объявления массивов в VBA, но эта тема заслуживает более подробного рассмотрения. Как было показано, одномерный массив можно объявить вот так:

Такое объявление сообщает компилятору VBA, что массив Team_Members состоит из 20 переменных, к которым можно обратиться по индексам от 1 до 20. Однако, нам может прийти в голову пронумеровать наши переменные массива числами от 0 до 19, и в таком случае массив должен быть объявлен вот так:

На самом деле, по умолчанию нумерация элементов массива начинается с 0, и в объявлении массива начальный индекс может быть не указан вовсе, вот так:

Такую запись компилятор VBA расценит, как объявление массива из 20 элементов с индексами от 0 до 19.

Эти же правила действуют при объявлении многомерных массивов Visual Basic. Как уже было показано в одном из примеров, при объявлении двумерного массива индексы его измерений разделяются запятой:

Однако, если не указывать начальный индекс для обоих измерений массива и объявить его вот так:

то эта запись будет расценена, как двумерный массив, первое измерение которого содержит 32 элемента с индексами от 0 до 31, а второе измерение массива содержит 6 элементов с индексами от 0 до 5.

Динамические массивы

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

Динамический массив объявляется с пустыми скобками, вот так:

Далее нужно будет объявить измерение массива в процессе выполнения кода при помощи выражения ReDim:

И если в процессе выполнения кода потребуется снова изменить размер массива, то можно использовать выражение ReDim снова:

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

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

Источник: office-guru.ru

Массивы в Excel VBA

В данной статье подробно рассматриваются массивы на языке программирования Excel VBA. Рассматриваются различные вопросы и схемы применения, такие как:

  • Зачем нужны массивы
  • Когда нужно применять массивы
  • Типы массивов
  • Использования многомерных массивов
  • Объявление массивов
  • Добавление значений
  • Просмотр всех элементов
  • Эффективный способ чтения диапазонов (Range) в массив
Задача Статический массив Динамический массив
Объявление Dim arr(0 To 5) As Long Dim arr() As Long
Dim arr As Variant
Задать размер см. выше ReDim arr(0 To 5)As Variant
Получить размер(количество элементов) см. функцию ArraySize . см. функцию ArraySize
Увеличить размер (с сохранением данных) Только динамический массив ReDimPreserve arr(0 To 6)
Задать значение arr(1) = 22 arr(1) = 22
Получить значение total = arr(1) total = arr(1)
Первый элемент LBound(arr) LBound(arr)
Последний элемент Ubound(arr) Ubound(arr)
Прочитать все элементы(1D) For i = LBound(arr) To UBound(arr)
Next i
Or
For i = LBound(arr,1) To UBound(arr,1)
Next i
For i = LBound(arr) To UBound(arr)
Next i
Or
For i = LBound(arr,1) To UBound(arr,1)
Next i
Прочитать все элементы(2D) For i = LBound(arr,1) To UBound(arr,1)
For j = LBound(arr,2) To UBound(arr,2)
Next j
Next i
For i = LBound(arr,1) To UBound(arr,1)
For j = LBound(arr,2) To UBound(arr,2)
Next j
Next i
Прочитать все элементы Dim item As Variant
For Each item In arr
Next item
Dim item As Variant
For Each item In arr
Next item
Передать в процедуру Sub MySub(ByRef arr() As String) Sub MySub(ByRef arr() As String)
Вернуть из функции Function GetArray() As Long()
Dim arr(0 To 5) As Long
GetArray = arr
End Function
Function GetArray() As Long()
Dim arr() As Long
GetArray = arr
End Function
Получить из функции Только динамические массивы Dim arr() As Long
Arr = GetArray()
Стереть массив Erase arr
*сбрасывает все значения по умолчанию
Erase arr
*удаляет массив
Строку в массив Только динамические массивы Dim arr As Variant
arr = Split(“James:Earl:Jones”,”:”)
Массив в строку Dim sName As String
sName = Join(arr, “:”)
Dim sName As String
sName = Join(arr, “:”)
Заполнить значениями Только динамические массивы Dim arr As Variant
arr = Array(“Значение1”, “Значение2”, “Значение3”)
Диапазон в массив Только динамические массивы Dim arr As Variant
arr = Range(“A1:D2”)
Массив в диапазон также как в динамическом массиве Dim arr As Variant
Range(“A5:D6”) = arr

Типы массивов VBA

В VBA есть два типа массивов:
Статический – массив фиксированного размера.
Динамический – массив, в котором размер задается во время выполнения.
Разница между этими массивами в основном в том, как они создаются. Доступ к значениям в обоих типах массивов абсолютно одинаков. В следующих разделах мы рассмотрим оба типа.

Объявление массива

Статический массив объявляется следующим образом

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

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

Динамические массивы не имеют таких проблем. Размер массивы не указывается при объявлении. Поэтому его размер может расти и уменьшаться по мере необходимости

Динамический массив не создается, пока вы не используете оператор ReDim. Преимущество в том, что вы можете подождать, пока не узнаете количество элементов, прежде чем устанавливать размер массива. Со статическим массивом вы должны указать размер заранее.

Чтение из диапазона ячеек в массив

VBA имеет очень эффективный способ чтения из диапазона ячеек в массив и наоборот

Динамический массив, созданный в этом примере, будет двухмерным массивом. Как видите, мы можем прочитать весь диапазон ячеек в массив всего за одну строку.

В следующем примере будут считаны данные из диапазона C3: E6 листа Sheet1 и отображены в окне Immediate Window.

Как сделать выполнение ваших макросов супер скоростным

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

Обновление значений в массивах происходит гораздо быстрее, чем обновление значений в ячейках.

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

  1. Копируем данные из ячеек в массив.
  2. Изменяем данные в массиве.
  3. Копируем обновленные данные из массива обратно в ячейки.

Например, следующий код будет намного быстрее, чем код ниже

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

Источник: planacademy.ru

Excel vba массив

Об’явление (описание) массива :

Прежде чем использовать массив его необходимо описать прим. * Так как массив является переменной, то действия с массивом во многом похожи на действия с обычными переменными. В массивах используются те же типы данных, что и в обычных переменных, причём массив должен содержать только однотипные данные, однако его ограничение можно обойти, если создать массив типа Variant.

прим. * На самом деле существует функция Array , которая позволяет создавать массив в ходе выполнения программы, без предварительного описания.

При об’явлении массива необходимо учитывать, что массивы делятся также на фиксированные и динамические. Фиксированный массив – это массив с заданным размером, который в свою очередь определяется количеством элементов. Динамический массив – это массив с переменным размером, т.е. количество элементов может изменяться во время выполнения программы.

Об’явление одномерного фиксированного массива :

Dim iString(3) As String

Об’явление двухмерного фиксированного массива :

Dim iData(5, 2) As Double

Об’явление динамического массива :

Dim iWhatIs() As Integer

При об’явлении (описании) динамического массива его размер не указывается. В процессе выполнения программы его размер может изменяться, причём неоднократно. Поэтому динамический массив применяют, если предполагается, что размер массива не будет постоянным.

ReDim – инструкция, которая позволяет изменять динамический массив.

Dim iWhatIs() As Integer

Примечание :
Обратите внимание на то, что элементы массива, которые были созданы ранее, после использования ReDim не сохраняются.

ReDim Preserve – инструкция, которая позволяет изменять динамический массив, с сохранением всех элементов массива.

ReDim Preserve iWhatIs(2)
iWhatIs(0) = 1
iWhatIs(1) = 2
iWhatIs(2) = 3

ReDim Preserve iWhatIs(3)
iWhatIs(3) = 4

Номер первого элемента и границы массива :

Номер первого элемента по умолчанию начинается с 0, для того чтобы изменить нумерацию используйте инструкцию Option Base или используйте явное указание номера первого элемента.

Пример фиксированного массива, где нумерация элементов начинается с 1

Dim iString(3) As String

Dim iData(5, 2) As Double

Примечание :
Инструкцию Option Base необходимо расположить в самом начале модуля VBA.

Пример об’явления фиксированных массивов с явным описанием нижней границы :

Dim iString(1 To 3) As String

Dim iData(1 To 5, 1 To 2) As Double

В обоих примерах мы об’явили (описали) два абсолютно одинаковых массива, но начать нумерацию массива можно с любого числа, но для этого Вы должны явно указать нижнюю границу массива.

Dim iString(5 To 10)

Dim iData(1 To 5, 2 To 5)

Примечание : Указывать тип данных содержащихся в массиве вовсе не обязательно. В случае отсутствия явного описания типа массива, он будет представлен как тип Variant.

Макрофункции для работы с массивом :

Array – функция позволяет создавать массив в ходе выполнения программы, без предварительного описания.

iArray = Array(“ivan”, “john”, “maurizio”)

Erase – функция используется для удаления данных, хранимых в элементах массива. Массив фиксированного размера очищается полностью, но память, отведённая под его хранение остаётся за ним. Динамический же массив уничтожается полностью.

IsArray – функция проверяет, является ли переменная массивом. IsArray имеет всего один аргумент (переменную) и в зависимости от результатов проверки возвращает True – если переменная является массивом, или False – если нет.

Пример проверки динамического массива :

ReDim Preserve iArray(1 To 3)
iArray(1) = “ivan”
iArray(2) = “john”
iArray(3) = “maurizio”

ReDim Preserve iArray(1 To 4)
iArray(4) = “it’s very good man’s”

If IsArray(iArray) = True Then
MsgBox “iArray – это массив”, , “”
Else
MsgBox “iArray – это не массив”, , “”
End If

Пример проверки массива, созданного с помощью функции Array :

iArray = Array(“ivan”, “john”, “maurizio”)

If IsArray(iArray) = True Then
MsgBox “iArray – это массив”, , “”
Else
MsgBox “iArray – это не массив”, , “”
End If

LBound – функция определит нижнюю границу массива.
UBound – функция определит верхнюю границу массива.

Dim iData(5 To 15, 1 To 100) As Double
iLBound = LBound(iData)
iUBound = UBound(iData)

MsgBox “Нижняя граница массива : ” & iLBound & Chr(10) _
& “Верхняя граница массива : ” & iUBound, , “”

Источник: msoffice-nm.ru