Массивы VBA

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

Краткое описание массива VBA

Массивы

ОписаниеКод VBAСоздаватьDim arr (от 1 до 3) как вариант
arr (1) = «один»
arr (2) = «два»
arr (3) = «три»Создать из ExcelDim arr (от 1 до 3) как вариант
Тусклая ячейка как диапазон, я как целое число
i = LBound (обр.)
Для каждой ячейки в диапазоне («A1: A3»)
я = я + 1
arr (i) = значение ячейки
Следующая ячейкаПрочитать всеТусклый я как долго
Для i = LBound (arr) To UBound (arr)
MsgBox arr (i)
Далее яСтеретьСтереть обр.Массив в строкуDim sName As String
sName = Присоединиться (arr, «:»)Увеличить размерReDim Preserve arr (от 0 до 100)Установить значениеarr (1) = 22

Быстрые примеры массивов VBA

Давайте рассмотрим полный пример, прежде чем углубляться в детали:

12345678910 Sub ArrayExample ()Dim strNames (от 1 до 4) как StringstrNames (1) = "Шелли"strNames (2) = "Стив"strNames (3) = "Нима"strNames (4) = "Хосе"msgbox strNames (3)Конец подписки

Здесь мы создали одномерный массив строк: strNames с размером четыре (может содержать четыре значения) и присвоили четыре значения. Наконец, мы отображаем 3-е значение в окне сообщения.

В этом случае преимущество использования массива невелико: требуется только одно объявление переменной вместо четырех.

Однако давайте посмотрим на пример, который покажет истинную мощь массива:

12345678 Sub ArrayExample2 ()Dim strNames (от 1 до 60000) как строкаТусклый я до тех пор, покаДля i = от 1 до 60000strNames (i) = Ячейки (i, 1). ЗначениеДалее яКонец подписки

Здесь мы создали массив, который может содержать 60 000 значений, и быстро заполнили массив из столбца A рабочего листа.

Преимущества массива? - Скорость!

Вы можете подумать о массивах, похожих на листы Excel:

  • Каждая ячейка (или элемент в массиве) может содержать собственное значение
  • Доступ к каждой ячейке (или элементу в массиве) можно получить по ее позиции в строке и столбце.
    • Рабочий лист Ex. ячейки (1,4) .value = «Строка 1, столбец 4»
    • Массив Ex. arrVar (1,4) = «Строка 1, столбец 4»

Так зачем возиться с массивами? Почему бы просто не читать и записывать значения непосредственно в ячейки Excel? Одно слово: Скорость!

Чтение / запись в ячейки Excel - медленный процесс. Работать с массивами стало намного быстрее!

Создать / объявить массив (Dim)

Примечание. Массивы могут иметь несколько «измерений». Для простоты мы начнем с работы только с одномерными массивами. Позже в этом руководстве мы познакомим вас с многомерными массивами.

Статический массив

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

Примечание. Если размер вашего массива не изменится, используйте статический массив.

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

Вы можете явно объявить начальную и конечную позиции массива:

123456789101112 Sub StaticArray1 ()'Создает массив с позициями 1,2,3,4Dim arrDemo1 (от 1 до 4) как строка'Создает массив с позициями 4,5,6,7Dim arrDemo2 (от 4 до 7) до тех пор, пока'Создает массив с позициями 0,1,2,3Dim arrDemo3 (от 0 до 3) до тех пор, покаКонец подписки

Или вы можете ввести только размер массива:

123456 Sub StaticArray2 ()'Создает массив с позициями 0,1,2,3Dim arrDemo1 (3) как строкаКонец подписки

Важный! Обратите внимание, что по умолчанию массивы начинаются с позиции 0. Итак Тусклый arrDemo1 (3) создает массив с позициями 0,1,2,3.

Вы можете объявить Вариант База 1 в верхней части вашего модуля, чтобы вместо этого массив начинался с позиции 1:

12345678 Вариант База 1Sub StaticArray3 ()'Создает массив с позициями 1,2,3Dim arrDemo1 (3) как строкаКонец подписки

Однако я считаю, что гораздо проще (и менее запутанно) просто явно объявить начальную и конечную позиции массивов.

Устали искать примеры кода VBA? Попробуйте AutoMacro!

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

Динамические массивы - это массивы, размер которых можно изменять (или размер которых не нужно определять).

Есть два способа объявить динамический массив.

Варианты массивов

Первый способ объявить динамический массив - задать для массива тип Вариант.

1 Dim arrVar () как вариант

С Вариант Арраy, вам не нужно определять размер массива. Размер изменится автоматически. Просто помните, что массив начинается с позиции 0 (если вы не добавите Option Base 1 в верхнюю часть вашего модуля)

12345678910111213 Sub VariantArray ()Dim arrVar () как вариант'Определить значения (Размер = 0,1,2,3)arrVar = массив (1, 2, 3, 4)'Изменить значения (Размер = 0,1,2,3,4)arrVar = Array («1a», «2a», «3a», «4a», «5a»)'Выходная позиция 4 ("5a")MsgBox arrVar (4)Конец подписки

Невариантные динамические массивы

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

1234567 Sub DynamicArray1 ()Dim arrDemo1 () как строка'Изменяет размер массива с позициями 1,2,3,4ReDim arrDemo1 (от 1 до 4)Конец подписки

Сначала вы объявляете массив, аналогичный статическому массиву, за исключением того, что вы опускаете размер массива:

1 Dim arrDemo1 () как строка

Теперь, когда вы хотите установить размер массива, вы используете ReDim команда для изменения размера массива:

12 'Изменяет размер массива с позициями 1,2,3,4ReDim arrDemo1 (от 1 до 4)

ReDim изменяет размер массива. Прочтите ниже, чтобы узнать о различиях между ReDim и ReDim Preserve.

ReDim против ReDim Preserve

Когда вы используете ReDim вы очищаете все существующие значения из массива. Вместо этого вы можете использовать ReDim Preserve чтобы сохранить значения массива:

12 'Изменяет размер массива с позициями 1,2,3,4 (с сохранением существующих значений)ReDim Сохранить arrDemo1 (от 1 до 4)

Объявление массивов упрощенным

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

Установить значения массива

Установить значения массива очень просто.

В статическом массиве вы должны определять каждую позицию массива по очереди:

12345678 Sub ArrayExample ()Dim strNames (от 1 до 4) как строкаstrNames (1) = "Шелли"strNames (2) = "Стив"strNames (3) = "Нима"strNames (4) = "Хосе"Конец подписки

С помощью Variant Array вы можете определить весь массив одной строкой (практично только для небольших массивов):

123456 Sub ArrayExample_1Line ()Dim strNames () как вариантstrNames = Array («Шелли», «Стив», «Нима», «Хосе»)Конец подписки

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

1 strNames (5) = "Шеннон"

В разделе «Назначить диапазон для массива» ниже мы покажем вам, как использовать цикл для быстрого назначения большого количества значений массивам.

Получить значение массива

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

1234 Диапазон ("A1"). Значение = strNames (1)Диапазон ("A2"). Значение = strNames (2)Диапазон ("A3"). Значение = strNames (3)Диапазон ("A4"). Значение = strNames (4)

Программирование на VBA | Генератор кода действительно работает для вас!

Назначить диапазон для массива

Чтобы назначить диапазон массиву, вы можете использовать цикл:

12345678 Под RangeToArray ()Dim strNames (от 1 до 60000) как строкаТусклый я до тех пор, покаДля i = от 1 до 60000strNames (i) = Ячейки (i, 1). ЗначениеДалее яКонец подписки

Это будет проходить через ячейки A1: A60000, присваивая значения ячеек массиву.

Выходной массив в диапазон

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

123 Для i = от 1 до 60000Ячейки (i, 1) .Value = strNames (i)Далее я

Это будет делать наоборот: присвоить значения массива ячейкам A1: A60000

2D / многомерные массивы

До сих пор мы работали исключительно с одномерными (1D) массивами. Однако массивы могут иметь до 32 измерений.

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

Примеры многомерных массивов

Теперь продемонстрируем примеры работы с массивами разной размерности.

Программирование на VBA | Генератор кода действительно работает для вас!

Пример 1D массива

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

1234567891011121314 ПодмассивEx_1d ()Dim strNames (от 1 до 60000) как строкаТусклый я до тех пор, пока'Присвоить значения массивуДля i = от 1 до 60000strNames (i) = Ячейки (i, 1). ЗначениеДалее я'Выводить значения массива в диапазонДля i = от 1 до 60000Таблицы ("Вывод"). Ячейки (i, 1) .Value = strNames (i)Далее яКонец подписки

Пример 2D-массива

Эта процедура содержит пример 2D-массива:

123456789101112131415161718 ПодмассивEx_2d ()Dim strNames (от 1 до 60000, от 1 до 10) как строкаDim i до тех пор, j до тех пор'Присвоить значения массивуДля i = от 1 до 60000Для j = от 1 до 10strNames (i, j) = Ячейки (i, j). ЗначениеСледующий jДалее я'Выводить значения массива в диапазонДля i = от 1 до 60000Для j = от 1 до 10Таблицы ("Вывод"). Ячейки (i, j) .Value = strNames (i, j)Следующий jДалее яКонец подписки

Пример 3D-массива

Эта процедура содержит пример 3D-массива для работы с несколькими листами:

12345678910111213141516171819202122 ПодмассивEx_3d ()Dim strNames (от 1 до 60000, от 1 до 10, от 1 до 3) как строкаDim i до тех пор, j до тех пор, k до тех пор'Присвоить значения массивуДля k = от 1 до 3Для i = от 1 до 60000Для j = от 1 до 10strNames (i, j, k) = Sheets ("Sheet" & k) .Cells (i, j) .ValueСледующий jДалее яСледующие k'Выводить значения массива в диапазонДля k = от 1 до 3Для i = от 1 до 60000Для j = от 1 до 10Sheets ("Вывод" & k) .Cells (i, j) .Value = strNames (i, j, k)Следующий jДалее яСледующие kКонец подписки

Длина / размер массива

До сих пор мы познакомили вас с различными типами массивов и научили, как объявлять массивы и получать / устанавливать значения массивов. Далее мы остановимся на других необходимых темах для работы с массивами.

Программирование на VBA | Генератор кода действительно работает для вас!

Функции UBound и LBound

Первым шагом к получению длины / размера массива является использование функций UBound и LBound для получения верхней и нижней границ массива:

123456 Sub UBoundLBound ()Dim strNames (от 1 до 4) как строкаMsgBox UBound (strNames)MsgBox LBound (strNames)Конец подписки

Вычитание двух (и прибавление 1) даст вам длину:

1 GetArrLength = UBound (strNames) - LBound (strNames) + 1

Функция длины массива

Вот функция для получения длины одномерного массива:

1234567 Открытая функция GetArrLength (как вариант) до тех пор, покаЕсли IsEmpty (a), тоGetArrLength = 0ЕщеGetArrLength = UBound (a) - LBound (a) + 1Конец, еслиКонечная функция

Нужно рассчитать размер 2D-массива? Ознакомьтесь с нашим руководством: Расчет размера массива.

Цикл через массив

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

12345678910111213 ПодмассивExample_Loop1 ()Dim strNames (от 1 до 4) как строкаТусклый я до тех пор, покаstrNames (1) = "Шелли"strNames (2) = "Стив"strNames (3) = "Нима"strNames (4) = "Хосе"Для i = от 1 до 4MsgBox strNames (i)Далее яКонец подписки

Однако, если вы не знаете размер массива (если массив динамический), вы можете использовать функции LBound и UBound из предыдущего раздела:

12345678910111213 ПодмассивExample_Loop2 ()Dim strNames (от 1 до 4) как строкаТусклый я до тех пор, покаstrNames (1) = "Шелли"strNames (2) = "Стив"strNames (3) = "Нима"strNames (4) = "Хосе"Для i = LBound (strNames) To UBound (strNames)MsgBox strNames (i)Далее яКонец подписки

Для каждого цикла массива

Второй метод - это цикл для каждого. Это проходит по каждому элементу в массиве:

12345678910111213 ПодмассивExample_Loop3 ()Dim strNames (от 1 до 4) как строкаТусклый элементstrNames (1) = "Шелли"strNames (2) = "Стив"strNames (3) = "Нима"strNames (4) = "Хосе"Для каждого элемента в strNamesЭлемент MsgBoxСледующий пунктКонец подписки

Цикл For Each Array Loop будет работать с многомерными массивами в дополнение к одномерным массивам.

Программирование на VBA | Генератор кода действительно работает для вас!

Цикл через 2D-массив

Вы также можете использовать функции UBound и LBound для циклического просмотра многомерного массива. В этом примере мы переберем 2D-массив. Обратите внимание, что функции UBound и LBound позволяют указать, в каком измерении массива найти верхнюю и нижнюю границы (1 для первого измерения, 2 для второго измерения).

1234567891011121314151617181920 ПодмассивExample_Loop4 ()Dim strNames (от 1 до 4, от 1 до 2) как строкаDim i до тех пор, j до тех порstrNames (1, 1) = "Шелли"strNames (2, 1) = "Стив"strNames (3, 1) = "Нима"strNames (4, 1) = "Хосе"strNames (1, 2) = "Шелби"strNames (2, 2) = "Стивен"strNames (3, 2) = "Немо"strNames (4, 2) = "Джесси"Для j = LBound (strNames, 2) To UBound (strNames, 2)Для i = LBound (strNames, 1) To UBound (strNames, 1)MsgBox strNames (i, j)Далее яСледующий jКонец подписки

Другие задачи с массивами

Очистить массив

Чтобы очистить весь массив, используйте оператор Erase:

1 Стереть strNames

Пример использования:

12345678910 Sub ArrayExample ()Dim strNames (от 1 до 4) как строкаstrNames (1) = "Шелли"strNames (2) = "Стив"strNames (3) = "Нима"strNames (4) = "Хосе"Стереть strNamesКонец подписки

В качестве альтернативы вы также можете ReDim массива, чтобы изменить его размер, очистив часть массива:

1 ReDim strNames (от 1 до 2)

Это изменяет размер массива до размера 2, удаляя позиции 3 и 4.

Подсчет массива

Вы можете подсчитать количество позиций в каждом измерении массива с помощью функций UBound и LBound (обсуждаемых выше).

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

В этом примере выполняется цикл по массиву объектов и подсчитывается количество непустых строк, найденных в массиве:

123456789101112131415 Sub ArrayLoopandCount ()Dim strNames (от 1 до 4) как строкаDim i As Long, n As LongstrNames (1) = "Шелли"strNames (2) = "Стив"Для i = LBound (strNames) To UBound (strNames)Если strNames (i) "" Тогдап = п + 1Конец, еслиДалее яMsgBox n & "обнаружены непустые значения".Конец подписки

Программирование на VBA | Генератор кода действительно работает для вас!

Удалить дубликаты

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

Фильтр

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

1234567891011121314 Sub Filter_Match ()'Определить массивDim strNames как вариантstrNames = Array («Стив Смит», «Шеннон Смит», «Райан Джонсон»)'Массив фильтровDim strSubNames как вариантstrSubNames = Фильтр (strNames, «Смит»)'Подсчет фильтрованного массиваMsgBox «Найдено» и UBound (strSubNames) - LBound (strSubNames) + 1 & «имена».Конец подписки

Функция IsArray

Вы можете проверить, является ли переменная массивом, используя функцию IsArray:

123456789101112 Подложка IsArrayEx ()'Создает массив с позициями 1,2,3Dim arrDemo1 (3) как строка'Создает обычную строковую переменнуюDim str As StringMsgBox IsArray (arrDemo1)MsgBox IsArray (str)Конец подписки

Присоединиться к массиву

Вы можете быстро «объединить» весь массив с помощью функции объединения:

123456789101112 Sub Array_Join ()Dim strNames (от 1 до 4) как строкаDim joinNames как строкаstrNames (1) = "Шелли"strNames (2) = "Стив"strNames (3) = "Нима"strNames (4) = "Хосе"joinNames = Присоединиться (strNames, ",")MsgBox joinNamesКонец подписки

Программирование на VBA | Генератор кода действительно работает для вас!

Разделить строку на массив

Функция разделения VBA разбивает строку текста на массив, содержащий значения из исходной строки. Давайте посмотрим на пример:

123456789 Подмассив_сплит ()Тусклые имена () в виде строкиDim connectedNames As StringjoinNames = "Шелли, Стив, Нема, Хосе"Names = Split (connectedNames, ",")Имена MsgBox (1)Конец подписки

Здесь мы разбиваем эту строку текста «Шелли, Стив, Нема, Хосе» на массив (размер 4), используя разделитель запятой (, »).

Const Массив

Массив не мочь быть объявленным как константа в VBA. Однако вы можете обойти это, создав функцию для использования в качестве массива:

123456789 'Определить ConstantArrayФункция ConstantArray ()ConstantArray = Массив (4, 12, 21, 100, 5)Конечная функция'Получить значение ConstantArraySub RetrieveValues ​​()MsgBox ConstantArray (3)Конец подписки

Копировать массив

Нет встроенного способа скопировать массив с помощью VBA. Вместо этого вам нужно будет использовать цикл для присвоения значений из одного массива другому.

12345678910111213141516171819 Sub CopyArray ()Dim Arr1 (от 1 до 100) до тех пор, покаDim Arr2 (от 1 до 100) по всей длинеТусклый я до тех пор, пока'Создать массив1Для i = от 1 до 100Arr1 (i) = iДалее я'CopyArray1 в Array2Для i = от 1 до 100Arr2 (i) = Arr1 (i)Далее яMsgBox Arr2 (74)Конец подписки

Транспонировать

Нет встроенной функции VBA, позволяющей транспонировать массив. Однако мы написали функцию для транспонирования 2D-массива. Прочтите статью, чтобы узнать больше.

Программирование на VBA | Генератор кода действительно работает для вас!

Массив возврата функции

Распространенный вопрос разработчиков VBA - как создать функцию, возвращающую массив. Я думаю, что большинство трудностей решаются с помощью Variant Arrays. Мы написали статью на тему: Массив, возвращаемый функцией VBA.

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

Большинство приведенных выше примеров массивов работают в Access VBA точно так же, как и в Excel VBA. Одно из основных различий заключается в том, что когда вы хотите заполнить массив с помощью данных Access, вам нужно будет выполнить цикл через объект RecordSet, а не объект Range.

1234567891011121314151617181920212223 Sub RangeToArrayAccess ()При ошибке Возобновить ДалееDim strNames () как строкаТусклый я до тех пор, покаDim iCount, покаDim dbs как база данныхDim rst As RecordsetУстановите dbs = CurrentDbУстановите rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)С первой.MoveLast.MoveFirstiCount = .RecordCountReDim strNames (1 в iCount)Для i = 1 в iCountstrNames (i) = rst.Fields ("ClientName").MoveNextДалее яКонец ссначала закрытьУстановить rst = ничегоУстановить dbs = NothingКонец подписки
Учебники по массивам
Мега-руководство по массивуда
Получить размер массива
Очистить массив
Массив фильтров
Транспонировать массив
Массив возврата функции
Удалить дубликаты

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave