Урок 8 по VBA - Массивы. Vba массив задать


Массивы в VBA - Макросы и программы VBA - Excel - Каталог статей

Содержание:

Зачем нужны массивы

Массивы очень упрощают процесс программирования. Без них практически невозможно написать универсальную программу. Например, представьте себе, что вы манипулируете информацией о квартирах жилого дома. Вы объявляете переменные K1 - для первой квартиры, K2 - для второй и так далее. K1=54 будет означать, что площадь первой квартиры 54 кв.м., К2=72 и т.д. Теперь представим, что нам надо подсчитать общую площадь всех квартир в доме. Очевидно, что это что-то типа Total_S = K1+K2+...+Kn. В одном доме у нас 36 квартир, а в другом 144. Представляете бредовость процесса подобного программирования? Если в первом случае я должен буду использовать 36 отдельных переменных для вычисления общей площади, то для второго дома уже 144. Очень быстро вы придёте к мысли, что вам нужна переменная, состоящая из нумерованных ячеек. Тогда обретают смысл все те операторы циклов, входящие в состав любого языка программирования. Но об этом чуть позже...

▲ вверх

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

Массив - переменная, состоящая из некоторого количества однотипных элементов. У массива, как и у любой другой переменной, есть имя. А доступ к конкретному элементу массива осуществляется через указание в скобках после имени его индекса. Например, A(5) означает, что я обращаюсь к элементу с индексом 5 массива, имеющего имя A.

▲ вверх

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

Массивы в VBA и во многих других языках программирования делятся на 2 класса:

  • Фиксированные массивы. Такие массивы состоят из заранее известного количества элементов. Это количество определяется во время объявления массива и уже не может быть изменено в процессе его жизненного цикла. Вы, конечно же, сможете использовать меньшее количество элементов, но не существует способа увеличить количество элементов сверх объявленного.

  • Динамические массивы. Эти массивы можно "переобъявлять" в процессе жизненного цикла. То есть мы можем управлять количеством элементов динамических масивов в зависимости от наших потребностей. Это очень удобно, так как в подавляющем большинстве случаев программист не может заранее знать, с каким объёмом данных он столкнётся. Если вы собираетесь писать более-менее универсальные программы, то этот тип массивов определенно стоит изучить.

▲ вверх

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

Объявление фиксированных массивов

Рекомендация: при объявлении массивов VBA я советую вам давать всем именам префикс "arr". Я сторонник венгерской нотации.

Как мы видим, тут объявлено 2 одномерных массива arrTemp и arrTest. Одномерные массивы в программировании также часто называют векторами. Типом элементов первого массива является Long, второго массива - String. В этом типе синтаксиса в скобках указан максимальный индекс (верхняя граница ) элемента массива. А что насчёт минимального индекса (нижней границы) массива? По-умолчанию минимальным индексом является ноль. В данном случае стандартное поведение интерпретатора языка VBA можно изменить при помощи оператора option base {0|1}. Option base 1 заставляет VBA считать нижней границей массива - единицу, а не ноль.

Таким образом, по-умолчанию массив arrTemp имеет 11 элементов - от 0 до 10. Но, если в начало модуля, в котором этот массив объявляется, вставить оператор Option Base 1, то массив arrTemp будет иметь 10 элементов - от 1 до 10.

Помимо вышеуказанного вы вправе использовать следующий синтаксис, который НЕ зависит от option base {0|1}:

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

Помимо одномерных массивов, можно объявлять и массивы с размерностью больше единицы.

arrMulti - двумерный массив, а arrData3 - трёхмерный. Первый содержит 11*31=341 элемент, второй - 2*3*10=60 элементов. Теоретически допускается объявлять до 60 размерностей массива.

Какие типы данных могут стать элементами массива? Тут всё, как в шутке про фамилию еврея, - абсолютно любой тип данных годится на роль элемента массива, включая объектные типы, User Data Type, другие массивы (через тип Variant). Если вы не указываете при объявлении тип данных массива, то предполагается, что этим типом является тип Variant.

▲ вверх

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

Динамические массивы объявляться так:

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

    ReDim [Preserve] varname(subscripts) [As Type]

Например:

После этого оператора, вы можете использовать элементы массива arrOpen с 0-го по 5-й. Всё, что мы говорили про оператор option base и нижнюю границу, верно и для динамических массивов. Предположим, что вы сохранили информацию в элементах 0-5 и у вас поспела новая порция информации для элементов 6-11. Чтобы разместить в данном массиве новые элементы и не потерять старые, вы должны сделать следующее:

то есть мы тут увеличиваем верхнюю границу массива и используем ключевое слово Preserve, чтобы во время этой операции не потерять текущее содержимое arrOpen, так как в противном случае (без слова Preserve) массив будет расширен, а память заполнена нулями. Вы также вправе вообще не декларировать массив оператором Dim, а сделать это впервые через ReDim и там же указать лип элементов. Но, если вы в первом ReDim (или Dim) указали определенный тип элементов, то в последующих операторах ReDim этот тип переопределён быть не может - возникнет ошибка на этапе компиляции проекта.

▲ вверх

Изменение элементов массива

Пора бы нам уже научиться пользоваться нашими массивами - то есть записывать информацию в их элементы и считывать её оттуда. Это довольно просто:

Как и с обычными переменными запись информации в элемент массива происходит через оператор присваивания (=), но указанием индекса элемента массива.

▲ вверх

Чтение элементов массива

▲ вверх

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

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

    LBound( array [, dimension])
    UBound( array [, dimension])

Для одномерных массивов параметр dimension можно не указывать. Для многомерных массивов его указывать необходимо. Кстати, это означает, что, если вы точно не знаете, с каким массивом имеете дело, но необходимо узнать его первую размерность, то лучше использовать вариант UBound(arrTemp,1), а не UBound(arrTemp), так как последний вариант вызовет ошибку, если массив окажется многомерным.

Если вы ошибётесь с указанием правильного индекса массива, то возникнет ошибка периода исполнения с кодом 9. Эта же ошибка возникнет, если вы в функции LBound / UBound укажете несуществующую размерность массива (например, 3 для двумерного массива).

▲ вверх

Перебор элементов массива

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

Наиболее удобный оператор цикла для перебора элементов массива - это безусловно For ... Next.

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

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

▲ вверх

Передача массивов в подпрограммы

Массивы удобнее всего передавать в подпрограммы в виде параметра типа Variant.

Обратите внимание, что функции GetResult в качестве параметра передаются массивы. При чём, в первом случае это массив с типом элементов Long, а во втором - String. За счёт того, что внутри функции используются переменные типа Variant, то сначала функция нам возвращает сумму элементов массива arrIntegers, а во втором результат сложения (конкатенации) строк массива arrStrings. Кроме того, параметр parArray не описан как массив (parArray As Variant), но мы внутри функции GetResult ведём себя с ним, как с массивом (For Each Element In parArray)! Это возможно, так как переменные типа Variant умеют определять, что им присваивается и вести себя далее в соответствии с тем, что они содержат. Если переменной parArray присвоили массив (через вызов функции - строки 17 и 18), то она себя будет вести как массив.

▲ вверх

Массив с элементами типа массив

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

Результат отладочной печати:

▲ вверх

Функция Array

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

    Array( arglist )

Вызов функции без параметров приведёт к возврату массива нулевой длинны. При этом будет наблюдаться интересный эффект LBound вернёт вам 0, а UBound вернёт -1, то есть верхняя граница окажется меньше нижней границы.

▲ вверх

Функция Split

Split возвращает одномерный массив, содержащий подстроки, из строкового выражении с учётом указанного разделителя

    Split(expression[, delimiter[, limit[, compare]]])
  • expression - строковое выражение, содержащая подстроки и разделители. Обязательный параметр.

  • delimiter - текстовый разделитель. Необязательный параметр. Если опущен, то предполагается, что разделителем является символ пробела.

  • limit - количество подстрок, которое необходимо вернуть. -1 или отсутствие параметра означает, что вернуть надо все подстроки.

  • compare - константа, указывающая тип сравнения для символов разделителей. 1 - текстовое сравнение (без учёта регистра), 0 - бинарное сравнение (с учётом регистра).

Результат выглядит так:

Если вы в качестве разделителя укажете пустую строку, то на выходе получите массив, состоящий из одного элемента. Кстати, split всегда возвращает массив с нулевой нижней границей вне всякой зависимости от наличия option base 1.

▲ вверх

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

Неинициализированный массив

У динамического массива есть такое промежуточное состояние, когда он уже объявлен, но ещё не содержит никаких элементов.

То есть у переменной динамического массива есть такое состояние, когда мы не можем воспользоваться вспомогательными функциями LBound / UBound для определения его (массива) статуса. Это особенно надо учитывать, когда вы пишите подпрограммы, работающие с массивами. Прежде чем работать (перебирать) массив необходимо убедиться, что он проинициализирован, в противном случае программа вылетит с ошибкой 9.

Для этого я предлагаю пользоваться функцией подобной нижеописанной IsNotEmptyArray:

▲ вверх

Расширение массива

Как правило, расширять динамический массив приходится в цикле. Возможны 2 стратегии: расширение на 1 элемент, как только в этом есть необходимость (назовём это эластичным расширением), и расширение авансом, когда вы увеличиваете верхнюю границу скачками, скажем сразу на 100 элементов. Реализовав оба варианта, я для себя сделал вывод, что авансовое расширение получилось и компактнее, и работает быстрее, так как операция расширения, вообще говоря, затратна и, чем реже вызывается, тем лучше.

Результат:

Авансовый метод вышел даже компактнее

▲ вверх

Удаление массива

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

▲ вверх

Получение массива на основе диапазона Excel

Самый эффективный по скорости способ получить содержимое диапазона Excel для манипулирования в VBA - это скопировать его в массив с элементами Variant. Делается так:

Даже, если вы передаёте в массив столбец или строку, получаемый массив всегда будет иметь 2 измерения. Измерение 1 отвечает за строки, измерение 2 - за столбцы. То есть ячейка C5 будет в элементе arrTemp(5,3). Нижняя граница таких массивов всегда будет начинаться с единицы.

▲ вверх

Дополнительные источники

В качестве источника дополнительной информации по массивам я могу порекомендовать замечательный, исчерпывающий ресурс Чарльза Пирсона (Charles H. Pearson). Его сайт следует штудировать всем, кто серьёзно осваивает VBA. Конкретно по массивам там огромное количество готовых подпрограмм для работы с ними, исходные коды, снабженные подробнейшими комментариями, продвинутые объяснения для копающих в глубину. Без преувеличения великолепный ресурс!

▲ вверх

Читайте также:

perfect-excel.ru

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

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

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

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

Dim Arr1(10) As Integer Dim Arr2(5 To 10) As String Dim Arr3() As Long

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

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

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

Dim Arr3() As Long ReDim Preserve Arr3(10) ReDim Preserve Arr3(20)

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

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

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

Dim Arr4(10, 10) As Integer Dim Arr5(5 To 10, 15 To 20, 30) As String

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

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

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

Dim Arr1 As Variant Dim Arr2(10) As Variant Arr1 = Array(10, 20, 30) Arr2(0) = Arr1 For i = LBound(Arr2(0)) To UBound(Arr2(0)) MsgBox Arr2(0)(i) ' Выведет последовательно 10, 20 и 30 Next i

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

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

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

Dim Arr1(2 To 15) As Integer MsgBox LBound(Arr1) ' Выведет: 2 MsgBox UBound(Arr1) ' Выведет: 15 Dim Arr2() As Integer ReDim Arr2(8) MsgBox LBound(Arr2) ' Выведет: 0 MsgBox UBound(Arr2) ' Выведет: 8

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

Dim Arr(1 To 10, 5 To 20) As Integer MsgBox LBound(Arr, 2) ' Выведет: 5 MsgBox UBound(Arr, 2) ' Выведет: 20

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

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

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

Option Base 1 Sub Test() Dim Arr1(10) As Integer MsgBox LBound(Arr1) End Sub

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

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

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

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

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

Dim Arr(10) As Integer For i = 0 To 10 Arr(i) = i * 2 Next i

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

Dim Arr() Arr = Array("красный", "зеленый", "синий") MsgBox Arr(2)

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

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

Dim Arr() As String Arr = Split("красный;зеленый;синий", ";") MsgBox Arr(2)

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

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

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

Dim Sum As Integer Dim Arr() Arr = Array(10, 20, 30) For i = 0 To 2 Sum = Sum + Arr(i) Next i MsgBox Sum

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

Dim Sum As Integer Dim Val As Variant Dim Arr() Arr = Array(10, 20, 30) For Each Val In Arr Sum = Sum + Val Next MsgBox Sum

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

www.codernotes.ru

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

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

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

  1. Одномерные массивы
  2. Многомерные массивы
  3. Динамические массивы
  4. Использование массивов
  5. Функции Array, LBound, UBound

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

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

Public Massiv1(9) As Integer Dim Massiv2(1 To 9) As String

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

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

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

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

'Массив двухмерный Public Massiv1(3, 6) As Integer 'Массив трехмерный Dim Massiv2(1 To 6, 1 To 8, 1 To 5) As String 'Массив четырехмерный Dim Massiv3(9, 9, 9, 9) As Date

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

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

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

Public Massiv1() As Integer Dim Massiv2() As String

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

Public Massiv1() As Integer Dim Massiv2() As String ReDim Massiv1(1 To 20) ReDim Massiv2(3, 5, 4)

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

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

Dim Massiv1(1 To 9, 1 To 9) As String ReDim Preserve Massiv1(1 To 25, 1 To 35)

Однако, если размерность массива в VBA Excel уменьшить, то значения, естественно, сохранятся не все.

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

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

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

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

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

Функция Array

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

Sub Test1() Dim a() As Variant a = Array("text", 25, "solo", 35.62, "stop") MsgBox a(0) & vbNewLine & a(1) & vbNewLine _ & a(2) & vbNewLine & a(3) & vbNewLine & a(4) End Sub

Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения массива, извлеченные по индексу.

Функция LBound

Функция LBound возвращает значение типа Long, равное наименьшему (нижнему) доступному индексу в указанном измерении массива.Синтаксис:LBound (arrayname[, dimension])

  • arrayname - это имя переменной массива, является обязательным аргументом;
  • dimension - это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.

Наименьший индекс по-умолчанию может быть равен 0 или 1 в зависимости от настроек оператора Option Base. Нижняя граница архива, полученного с помощью функции Array, всегда равна 0.

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

Функция UBound

Функция UBound возвращает значение типа Long, равное наибольшему (верхнему) доступному индексу в указанном измерении массива.Синтаксис:UBound( arrayname[, dimension])

  • arrayname - это имя переменной массива, является обязательным аргументом;
  • dimension - это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.

Функция UBound используется вместе с функцией LBound для определения размера массива.

Sub Test2() Dim a(-2 To 53) As String MsgBox "Наименьший индекс = " & LBound(a) & _ vbNewLine & "Наибольший индекс = " & UBound(a) End Sub

Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения наименьшего и наибольшего индекса переменной массива a.

vremya-ne-zhdet.ru

Массивы в Visual Basic

Рекомендуем использовать Visual Studio 2017

Эта документация перемещена в архив и не поддерживается.

Visual Studio 2013

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

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

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

Содержание раздела

В следующем примере объявляется переменная массива для хранения числа учеников в каждом классе школы.

Dim students(6) As Integer

Массив students в предыдущем примере содержит семь элементов. Индексы элементов лежат в диапазоне от 0 до 6. Использовать массив проще, чем объявить семь отдельных переменных.

На следующем рисунке показан массив students. Для каждого элемента массива:

  • Индекс элемента представляет школьный класс (индекс 0 представляет детский сад).

  • Значение, содержащееся в элементе, представляет число учеников в этом классе.

Элементы массива "учеников"

В следующем примере показано обращение к первому, второму и последнему элементу массива students.

Dim kindergarten As Integer = students(0) Dim firstGrade As Integer = students(1) Dim sixthGrade As Integer = students(6) MsgBox("Students in kindergarten = " & CStr(kindergarten)) MsgBox("Students in first grade = " & CStr(firstGrade)) MsgBox("Students in sixth grade = " & CStr(sixthGrade))

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

Массив students в предыдущем примере использует один индекс и считается одномерным. Массив, использующий более одного индекса, называется многомерным массивом. Дополнительные сведения далее в этом разделе в разделе Размерность массивов в Visual Basic.

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

Dim cargoWeights(10) As Double  Dim atmospherePressures(2, 2, 4, 10) As Short  Dim inquiriesByYearMonthDay(20)()() As Byte

Также можно указать размер массива при создании с помощью предложения New, как показано в следующем примере.

cargoWeights = New Double(10) {} atmospherePressures = New Short(2, 2, 4, 10) {} inquiriesByYearMonthDay = New Byte(20)()() {}

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

' Assign a new array size and retain the current element values.  ReDim Preserve cargoWeights(20) ' Assign a new array size and retain only the first five element values.  ReDim Preserve cargoWeights(4) ' Assign a new array size and discard all current element values.  ReDim cargoWeights(15)

Для получения дополнительной информации см. Оператор ReDim (Visual Basic).

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

После объявления массива можно определить его размер с помощью Оператор ReDim (Visual Basic).

В следующем примере объявляется переменная одномерного массива путем добавления пары скобок после типа. В примере также определяется измерения массива с помощью Оператор ReDim (Visual Basic).

' Declare a one-dimensional array.  Dim cargoWeights As Double() ' Dimension the array.  ReDim cargoWeights(15)

В следующем примере объявляется переменная многомерного массива путем добавления одной пары скобок после типа и запятых внутри скобок для разделения измерений массива. В примере также определяется измерения массива с помощью Оператор ReDim (Visual Basic).

' Declare a multidimensional array.  Dim atmospherePressures As Short(,,,) ' Dimension the array.  ReDim atmospherePressures(1, 2, 3, 4)

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

Dim inquiriesByYearMonthDay()()() As Byte

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

К любому местоположению в массиве можно получить доступ, используя индекс типа Integer. Можно сохранять и извлекать значения массива, ссылаясь на местоположение в массиве с помощью индекса места, приведенного в скобках. Индексы для многомерных массивов разделяются запятыми (,). Для каждого измерения массива требуется один индекс. В следующем примере показаны некоторые операторы, которые сохраняют значения в массивах.

Dim i = 4 Dim j = 2 Dim numbers(10) As Integer  Dim matrix(5, 5) As Double numbers(i + 1) = 0 matrix(3, j * 2) = j

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

Dim v = 2 Dim i = 1 Dim j = 1 Dim k = 1 Dim wTotal As Double = 0.0 Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double  Dim lowestValue = sortedValues(0) wTotal += (rawValues(v) ^ 2) Dim firstGuess = estimates(i, j, k)

Можно создать массив, содержащий начальный набор значений, с помощью литерала массива. Литерал массива состоит из списка разделенных запятыми значений, заключенных в фигурные скобки ({}).

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

Dim numbers = New Integer() {1, 2, 4, 8} Dim doubles = {1.5, 2, 9.9, 18}

При использовании вывода типа тип массива определяется главным типом списка значений, предоставленного для литерала массива. Главный тип — это уникальный тип, до которого могут быть расширены все другие типы литерала массива. Если такой уникальный тип нельзя определить, то главным типом будет тип, до которого можно сузить все другие типы массива. Если ни один из указанных уникальных типов нельзя определить, главным типом будет Object. Например, если список значений для литерала массива содержит значения типов Integer, Long и Double, результирующий массив будет иметь тип Double. Типы Integer и Long расширяются только до типа Double. Поэтому Double является главным типом. Для получения дополнительной информации см. Расширяющие и сужающие преобразования (Visual Basic). Данные правила вывода применимы для вывода типов массивов, которые являются локальными переменными, определенными в элементе класса. Несмотря на то что можно использовать литералы массива при создании переменных уровня класса, нельзя использовать вывод типа на уровне класса. В результате литералы массива, заданные на уровне класса, определяют значения, указанные для литерала массива, как тип Object.

Можно явно задать тип элементов в массиве, созданном с помощью литерала массива. В таком случае значения литерала массива должны расширяться до типа элементов массива. В следующем примере кода создается массив типа Double из списка целых чисел.

Dim values As Double() = {1, 2, 3, 4, 5, 6}

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

Dim grid = {{1, 2}, {3, 4}}

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

Примечание

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

Dim values = {({1, 2}), ({3, 4, 5})}

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

Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Дополнительные примеры см. в разделе Практическое руководство. Инициализация переменной массива в Visual Basic.

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

Следующий пример выполняет перебор одномерного массива с помощью оператора Оператор For... Next (Visual Basic). Для каждого измерения массива метод GetUpperBound возвращает максимально допустимое значение индекса. Наименьшее значение индекса всегда равно 0.

Dim numbers = {10, 20, 30} For index = 0 To numbers.GetUpperBound(0) Debug.WriteLine(numbers(index)) Next  ' Output:  ' 10  ' 20  ' 30

Следующий пример выполняет перебор многомерного массива с помощью оператора For...Next. Метод GetUpperBound имеет параметр, который определяет измерение. GetUpperBound(0) возвращает высокое значение индекса для первого измерения, а GetUpperBound(1) возвращает высокое значение индекса для второго измерения.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}} For index0 = 0 To numbers.GetUpperBound(0) For index1 = 0 To numbers.GetUpperBound(1) Debug.Write(numbers(index0, index1).ToString & " ") Next Debug.WriteLine("") Next  ' Output   ' 1 2   ' 3 4   ' 5 6

Следующий пример выполняет перебор одномерного массива с помощью оператора Оператор For Each... Next (Visual Basic).

Dim numbers = {10, 20, 30} For Each number In numbers Debug.WriteLine(number) Next  ' Output:  ' 10  ' 20  ' 30

Следующий пример выполняет перебор многомерного массива с помощью оператора For Each...Next. Однако возможности управления элементами многомерного массива будут шире при использовании вложенного оператора For…Next, как показано в предыдущем примере, вместо оператора For Each…Next.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}} For Each number In numbers Debug.WriteLine(number) Next  ' Output:  ' 1  ' 2  ' 3  ' 4  ' 5  ' 6

Чтобы вернуть массив из процедуры Function, укажите тип данных массива и число измерений в качестве возвращаемого типа Оператор Function (Visual Basic). Внутри функции объявите локальную переменную массива с тем же числом измерений и типом данных. В Оператор Return (Visual Basic) включите локальную переменную массива без скобок.

Чтобы определить массив в качестве параметра в процедуре Sub или Function, задайте параметр как массив с указанными типом данных и количеством измерений. В вызове процедуры отправьте переменную массива с тем же типом данных и количеством измерений.

В следующем примере функция GetNumbers возвращает Integer(). Этот тип массива — одномерный массив типа Integer. Процедура ShowNumbers принимает аргумент Integer().

Public Sub Process() Dim numbers As Integer() = GetNumbers() ShowNumbers(numbers) End Sub  Private Function GetNumbers() As Integer() Dim numbers As Integer() = {10, 20, 30} Return numbers End Function  Private Sub ShowNumbers(numbers As Integer()) For index = 0 To numbers.GetUpperBound(0) Debug.WriteLine(numbers(index) & " ") Next  End Sub  ' Output:  ' 10  ' 20  ' 30

В следующем примере функция GetNumbersMultiDim возвращает Integer(,). Этот тип массива — одномерный массив типа Integer. Процедура ShowNumbersMultiDim принимает аргумент Integer(,).

Public Sub ProcessMultidim() Dim numbers As Integer(,) = GetNumbersMultidim() ShowNumbersMultidim(numbers) End Sub  Private Function GetNumbersMultidim() As Integer(,) Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}} Return numbers End Function  Private Sub ShowNumbersMultidim(numbers As Integer(,)) For index0 = 0 To numbers.GetUpperBound(0) For index1 = 0 To numbers.GetUpperBound(1) Debug.Write(numbers(index0, index1).ToString & " ") Next Debug.WriteLine("") Next  End Sub  ' Output   ' 1 2   ' 3 4   ' 5 6

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

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

' Declare the jagged array.  ' The New clause sets the array variable to a 12-element  ' array. Each element is an array of Double elements.  Dim sales()() As Double = New Double(11)() {} ' Set each element of the sales array to a Double  ' array of the appropriate size.  For month As Integer = 0 To 11 Dim days As Integer = DateTime.DaysInMonth(Year(Now), month + 1) sales(month) = New Double(days - 1) {} Next month ' Store values in each element.  For month As Integer = 0 To 11 Dim upper = sales(month).GetUpperBound(0) For day = 0 To upper sales(month)(day) = (month * 100) + day Next  Next

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

Dim twoDimensionalStrings(-1, 3) As String

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

  • Без риска возникновения исключения NullReferenceException код должен обращаться к членам класса Array, таким как Length или Rank, или вызывать функцию Visual Basic, такую как UBound.

  • Требуется сделать соответствующий код проще, избежав необходимости проверки на значение Nothing как особый случай.

  • Код взаимодействует с интерфейсом API, который требует передачи массива нулевой длины в одну или несколько процедур или возвращает массив нулевой длины из одной или нескольких процедур.

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

В следующем примере показано объявление трехмерного массива:

Dim prices(3, 4, 5) As Long

Общий размер массива в переменной prices составляет (3 + 1) x (4 + 1) x (5 + 1) = 120.

Размер массива можно определить с помощью свойства Length. Длину каждого измерения многомерного массива можно получить с помощью метода GetLength.

Можно изменять размер переменной массива, присваивая ей новый объект массива, или с помощью оператора ReDim.

Существует ряд особенностей, о которых следует помнить при работе с размером массива.

Длина измерения

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

Ограничения длины

Длина каждого измерения массива ограничена максимальным значением типа Integer, которое равно (2 ^ 31) - 1. Тем не менее, общий размер массива также ограничен доступной памятью в системе. При попытке инициализировать массив, размер которого превышает объем доступной оперативной памяти, общеязыковая среда выполнения создает исключение OutOfMemoryException.

Размер и размер элемента

Размер массива не зависит от типа его элементов. Размер всегда представляет общее число элементов, а не число байтов, занимаемое массивом при хранении.

Затраты памяти

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

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

Каждый массив наследуется от класса Array, и можно объявить переменную типа Array, но не нельзя создать массив типа Array. Кроме того, Оператор ReDim (Visual Basic) не может работать с переменной, объявленной как тип Array. По этой причине и для строгой типизации рекомендуется объявить каждый массив как конкретный тип, например Integer, как в предыдущем примере.

Можно выяснить тип данных массива или его элементов несколькими способами.

  • Можно вызвать метод Object.GetType для переменной для получения объекта Type типа переменной времени выполнения. Объект Type содержит подробные сведения в своих свойствах и методах.

  • Можно передать переменную функции TypeName, чтобы получить объект String, содержащий имя типа времени выполнения.

  • Можно передать переменную функции VarType для получения значения VariantType, представляющего классификацию типа переменной.

В следующем примере вызывается функция TypeName для определения типа массива и типа элементов в массиве. Массив имеет тип Integer(,), а элементы массива относятся к типу Integer.

Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {} MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray)) MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))

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

Если требуется изменить размер массива, необходимо использовать Оператор ReDim (Visual Basic). После этого Visual Basic создает новый массив и освобождает предыдущий массив. Это занимает время выполнения. Таким образом, если число элементов при работе изменяется часто или нельзя предсказать максимальное число необходимых элементов, можно получить большую производительность при использовании коллекции.

При работе с некоторыми коллекциями можно присвоить ключ любому объекту, ко

msdn.microsoft.com

Массивы в VBA: как работать с массивами

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

 

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

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

'Method 1 : Using Dim Dim arr1() 'Without Size 'Method 2 : Mentioning the Size Dim arr2(5) 'Declared with size of 5 'Method 3 : using 'Array' Parameter Dim arr3 arr3 = Array("apple","Orange","Grapes")
  • Хотя размер массива указывается как 5, он может содержать 6 значений, поскольку индекс массива начинается с ZERO.
  • Индекс массива не может быть отрицательным.
  • Массивы VBScript могут хранить любой тип переменной в массиве. Следовательно, массив может хранить целое число, строку или символы в одной переменной массива.

Назначение значений массиву

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

Пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() Dim arr(5) arr(0) = "1" 'Number as String arr(1) = "VBScript" 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("Value stored in Array index 0 : " & arr(0)) msgbox("Value stored in Array index 1 : " & arr(1)) msgbox("Value stored in Array index 2 : " & arr(2)) msgbox("Value stored in Array index 3 : " & arr(3)) msgbox("Value stored in Array index 4 : " & arr(4)) msgbox("Value stored in Array index 5 : " & arr(5)) End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

Value stored in Array index 0 : 1Value stored in Array index 1 : VBScriptValue stored in Array index 2 : 100Value stored in Array index 3 : 2.45Value stored in Array index 4 : 7/10/2013Value stored in Array index 5 : 12:45:00 PM

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

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

пример

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

Private Sub Constant_demo_Click() Dim arr(2,3) as Variant ' Which has 3 rows and 4 columns arr(0,0) = "Apple" arr(0,1) = "Orange" arr(0,2) = "Grapes" arr(0,3) = "pineapple" arr(1,0) = "cucumber" arr(1,1) = "beans" arr(1,2) = "carrot" arr(1,3) = "tomato" arr(2,0) = "potato" arr(2,1) = "sandwitch" arr(2,2) = "coffee" arr(2,3) = "nuts" msgbox("Value in Array index 0,1 : " & arr(0,1)) msgbox("Value in Array index 2,2 : " & arr(2,2)) End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

Value stored in Array index : 0 , 1 : OrangeValue stored in Array index : 2 , 2 : coffee

Объявление ReDim

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

Синтаксис ReDim [Preserve] varname(subscripts) [, varname(subscripts)]Параметр Описание
  • Preserve - необязательный параметр, используемый для сохранения данных в существующем массиве при изменении размера последнего измерения.
  • Varname - обязательный параметр, который обозначает имя переменной, которое должно соответствовать стандартным соглашениям об именах.
  • Subscript - требуемый параметр, который указывает размер массива.
пример

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

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

Private Sub Constant_demo_Click() Dim a() as variant i = 0 redim a(5) a(0) = "XYZ" a(1) = 41.25 a(2) = 22 REDIM PRESERVE a(7) For i = 3 to 7 a(i) = i Next 'to Fetch the output For i = 0 to ubound(a) Msgbox a(i) Next End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

XYZ41.252234567

Методы массива

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

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

LBound

Функция LBound возвращает наименьший индекс указанного массива.Следовательно, LBound массива - ZERO.

Синтаксис LBound(ArrayName[,dimension])Параметы и Описание
  • ArrayName - обязательный параметр. Этот параметр соответствует имени массива.
  • Размер - необязательный параметр. Это принимает целочисленное значение, соответствующее размеру массива. Если это «1», то он возвращает нижнюю границу первого измерения;если это «2», то он возвращает нижнюю границу второго измерения и так далее.
пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() Dim arr(5) as Variant arr(0) = "1" 'Number as String arr(1) = "VBScript 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("The smallest Subscript value of the given array is : " & LBound(arr)) ' For MultiDimension Arrays : Dim arr2(3,2) as Variant msgbox("The smallest Subscript of the first dimension of arr2 is : " & LBound(arr2,1)) msgbox("The smallest Subscript of the Second dimension of arr2 is : " & LBound(arr2,2)) End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

The smallest Subscript value of the given array is : 0The smallest Subscript of the first dimension of arr2 is : 0The smallest Subscript of the Second dimension of arr2 is : 0

Функция, которая возвращает целое число, соответствующее наименьшему индексу данных массивов.

UBound

Функция UBound возвращает наибольший индекс указанного массива.Следовательно, это значение соответствует размеру массива.

Синтаксис UBound(ArrayName[,dimension])Параметры и Описание
  • ArrayName - обязательный параметр. Этот параметр соответствует имени массива.
  • Размер - необязательный параметр. Это принимает целочисленное значение, соответствующее размеру массива. Если это «1», то он возвращает нижнюю границу первого измерения;если он равен «2», то он возвращает нижнюю границу второго измерения и т. д.
пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() Dim arr(5) as Variant arr(0) = "1" 'Number as String arr(1) = "VBScript 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("The smallest Subscript value of the given array is : " & UBound(arr)) ' For MultiDimension Arrays : Dim arr2(3,2) as Variant msgbox("The smallest Subscript of the first dimension of arr2 is : " & UBound(arr2,1)) msgbox("The smallest Subscript of the Second dimension of arr2 is : " & UBound(arr2,2)) End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

The Largest Subscript value of the given array is : 5The Largest Subscript of the first dimension of arr2 is : 3The Largest Subscript of the Second dimension of arr2 is : 2

Функция, которая возвращает целое число, соответствующее самому большому индексу данных массивов.

Split

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

Синтаксис Split(expression [,delimiter[, count[, compare]]])Параметры и Описание
  • Выражение - требуемый параметр. Строковое выражение, которое может содержать строки с разделителями.
  • Разделитель - необязательный параметр. Параметр, который используется для преобразования в массивы на основе разделителя.
  • Count - необязательный параметр. Количество подстрок, которые нужно вернуть, и если указано как -1, то возвращаются все подстроки.
  • Compare - Необязательный параметр. Этот параметр указывает, какой метод сравнения следует использовать.
  • 0 = vbBinaryCompare - выполняет двоичное сравнение
  • 1 = vbTextCompare - выполняет текстовое сравнение
пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() ' Splitting based on delimiter comma '$' Dim a as Variant Dim b as Variant a = Split("Red $ Blue $ Yellow","$") b = ubound(a) For i = 0 to b msgbox("The value of array in " & i & " is :" & a(i)) Next End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

The value of array in 0 is :RedThe value of array in 1 is : BlueThe value of array in 2 is : Yellow

Функция, которая возвращает массив, содержащий указанное количество значений. Разделить на разделитель.

Join

Это функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.

Синтаксис Join(List[,delimiter])Параметры и Описание
  • Список - требуемый параметр. Массив, содержащий подстроки, которые должны быть соединены.
  • Разделитель - необязательный параметр. Символ, который используется как разделитель при возврате строки. По умолчанию разделителем является Space.
пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() ' Join using spaces a = array("Red","Blue","Yellow") b = join(a) msgbox("The value of b " & " is :" & b) ' Join using $ b = join(a,"$") msgbox("The Join result after using delimiter is : " & b) End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

The value of b is :Red Blue YellowThe Join result after using delimiter is : Red$Blue$Yellow

Функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.

Filter

Функция фильтра, которая возвращает массив на основе нуля, который содержит подмножество массива строк на основе определенных критериев фильтра.

Синтаксис Filter(inputstrings, value[, include [,compare]])Параметры и Описание
  • Inputstrings - обязательный параметр. Этот параметр соответствует массиву строк для поиска.
  • Значение - требуемый параметр. Этот параметр соответствует строке для поиска по параметру inputstrings.
  • Include - необязательный параметр. Это логическое значение, которое указывает, следует ли возвращать подстроки, которые включают или исключают.
  • Compare - Необязательный параметр. Этот параметр описывает, какой метод сравнения строк должен использоваться.
  • 0 = vbBinaryCompare - выполняет двоичное сравнение
  • 1 = vbTextCompare - выполняет текстовое сравнение
пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() Dim a,b,c,d as Variant a = array("Red","Blue","Yellow") b = Filter(a,"B") c = Filter(a,"e") d = Filter(a,"Y") For each x in b msgbox("The Filter result 1: " & x) Next For each y in c msgbox("The Filter result 2: " & y) Next For each z in d msgbox("The Filter result 3: " & z) Next End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.p The Filter result 1: BlueThe Filter result 2: RedThe Filter result 2: BlueThe Filter result 2: YellowThe Filter result 3: Yellow

Функция, которая возвращает массив с нулевым основанием, который содержит подмножество массива строк на основе определенных критериев фильтра.

IsArray

Функция IsArray возвращает логическое значение, указывающее, является ли указанная входная переменная переменной или переменной NOT переменной массива.

Синтаксис IsArray(variablename)пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() Dim a,b as Variant a = array("Red","Blue","Yellow") b = "12345" msgbox("The IsArray result 1 : " & IsArray(a)) msgbox("The IsArray result 2 : " & IsArray(b)) End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

The IsArray result 1 : TrueThe IsArray result 2 : False

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

Erase

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

Синтаксис Erase ArrayName
  • Фиксированный числовой массив, каждый элемент в массиве сбрасывается до нуля.
  • Исправлен строковый массив, каждый элемент в массиве сбрасывается до нулевой длины "".
  • Массив объектов, каждый элемент в массиве сбрасывается до специального значения Nothing.
пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() Dim NumArray(3) NumArray(0) = "VBScript" NumArray(1) = 1.05 NumArray(2) = 25 NumArray(3) = #23/04/2013# Dim DynamicArray() ReDim DynamicArray(9) ' Allocate storage space. Erase NumArray ' Each element is reinitialized. Erase DynamicArray ' Free memory used by array. ' All values would be erased. msgbox("The value at Zeroth index of NumArray is " & NumArray(0)) msgbox("The value at First index of NumArray is " & NumArray(1)) msgbox("The value at Second index of NumArray is " & NumArray(2)) msgbox("The value at Third index of NumArray is " & NumArray(3)) End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

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

Функция, которая восстанавливает выделенную память для переменных массива.

 С уважением, авторы сайта Компьютерапия

Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

maxfad.ru

Статические и динамические массивы в 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 integerDim 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=4Redim MyDynMas (i)

x = i +13Redim MyDynMas (x)

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

Redim Preserve MyDynMas (x)

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

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

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

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

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

Option ExplicitOption Base 1

Sub StatMas()Dim Mas(3) As IntegerDim Matr(3, 4) As IntegerDim Msg As StringDim 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) = 7Matr(2, 1) = 12: Matr(2, 2) = 10: Matr(2, 3) = 2: Matr(2, 4) = 9Matr(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 iMsgBox MsgEnd Sub

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

Sub DynMasTest()Dim Msg As StringDim i, j, col, row As IntegerDim 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 iMsgBox MsgEnd 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

 

Прикрепленный файл: work_mass_vba.zip

 

 

www.programm-school.ru

Урок 8 по VBA - Массивы

Всем привет, в этой статье мы рассмотрим массивы VBA языка. Но сначала немного теории… Как мы уже знаем, данные удобно хранить в переменных, но это не всегда эффективно, например: есть десять значений (номера телефонов), объявлять для каждого значения переменную довольно громоздко, да и объем кода увеличивается, более эффективно объявить одну структуру и сохранить в ней все данные, к которые можно будет обратиться по порядковому номеру (индексу). Такая структура и будет называться массивом.

VBA массивы могут быть как одномерными (список), так и многомерными:

VBA одномерный массив

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

Тут мы объявили одномерный VBA массив, состоящий из трех элементов (нумерация элементов начинается с нуля) и задали целый тип данных. Можно и не задавать тип данных, например:

Для примера, создадим форму с темя текстовыми метками (объект Label) и одной кнопкой и попишем в редакторе кода:

Private Sub CommandButton1_Click() Dim MyArr(2) As Integer     MyArr(0) = 10     MyArr(1) = 20     MyArr(2) = 30     Label1.Caption = "Значение: " & MyArr(0)     Label2.Caption = "Значение: " & MyArr(1)     Label3.Caption = "Значение: " & MyArr(2) End Sub   Private Sub UserForm_Initialize()     Label1.Caption = ""     Label1.FontSize = 15     Label1.ForeColor = vbBlue       Label2.Caption = ""     Label2.FontSize = 15     Label2.ForeColor = vbRed       Label3.Caption = ""     Label3.FontSize = 15     Label3.ForeColor = vbGreen     CommandButton1.Caption = "Значения" End Sub

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

Private Sub CommandButton1_Click() Dim MyArr(2)     MyArr(0) = "Строка"     MyArr(1) = #12/30/1986#     MyArr(2) = 124.55     Label1.Caption = "Значение: " & MyArr(0)     Label2.Caption = "Значение: " & MyArr(1)     Label3.Caption = "Значение: " & MyArr(2) End Sub

В данном случае мы присвоили значения разных типов (строка, дата и вещественное число), при этом, сам тип данных для массива VBA мы не указывали, иначе, произошла бы ошибка Type mismatch (несоответствие типов).

VBA многомерный и двумерный массив

Помимо одномерных, можно объявлять и многомерные массивы до 60 измерений, например:

Private Sub CommandButton1_Click() Dim MyArr(0 To 1, 0 To 3) As Integer     MyArr(0, 0) = 10     MyArr(0, 1) = 11     MyArr(0, 2) = 12     MyArr(0, 3) = 13       MyArr(1, 0) = 20     MyArr(1, 1) = 21     MyArr(1, 2) = 22     MyArr(1, 3) = 23     Label1.Caption = MyArr(0, 0) & MyArr(0, 1) & MyArr(0, 2) & MyArr(0, 3)     Label2.Caption = MyArr(1, 0) & MyArr(1, 1) & MyArr(1, 2) & MyArr(1, 3) End Sub

Строка Dim MyArr(0 To 1, 0 To 3) As Integer говорит, что мы объявили двумерный VBA массив размером два на четыре, при этом, мы сразу указали нумерацию, для сравнения:

Dim MyArr(2 To 3, 3 To 5) As Integer     MyArr(2, 3) = 10     MyArr(2, 4) = 11     MyArr(2, 5) = 12       MyArr(3, 3) = 20     MyArr(3, 4) = 21     MyArr(3, 5) = 22     Label1.Caption = MyArr(2, 3) & MyArr(2, 3) & MyArr(2, 5)     Label2.Caption = MyArr(3, 3) & MyArr(3, 4) & MyArr(3, 5)

Хотя можно прописать и так MyArr(2,3), в этом случае нумерация будет идти от нуля автоматически.

Динамические массивы VBA – довольно часто может возникнуть ситуация, когда точно количество элементов массива не известно, или же его размер надо изменить. При объявлении динамического массива его размер не указывается:

Для изменения размера используется ключевое слово ReDim:

ReDim автоматически удаляет все предыдущие значения, что бы они сохранились (например, предыдущий размер составлял 4 элемента и хранил данные, а теперь надо расширить размер до 6 элементов, сохранив предыдущие значения), используется ключевое слово Preserve:

Оператор Option Base 1 – данные оператор позволяет указать, что бы нумерация элементов начиналась не с нуля, а с единицы.

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

Array() – данная функция VBA позволяет сразу задавать значения одномерного массива:

Dim MyArr MyArr = Array(10, 22, 100, 5)

Видим, что сначала надо объявить переменную, а уже потом использовать функцию для формирования одномерного VBA массива.

Erase – очищает содержимое:

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

Есть и другие функции для работы с массивами VBA, плюс, можно создавать вложенные массивы, более детально можете почитать в статье VBScript массивы (просто структура языков практически одинакова).

scriptcoding.ru