Svinkovod.ru

Бытовая техника
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

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

Индексация массива от 0 или 1 зависит от оператора Option Base. Если не указано Option Base 1, все индексы массива будут начинается с нуля.

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

В приведенном ниже примере кода массив фиксированного размера объявлен массивом целых переменных (Integer) с 11 строками и 11 столбцами:

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

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

В приведенном ниже примере кода сравниваются размеры нескольких массивов.

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

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

Объявив динамический массив, вы сможете менять его размер во время выполнения кода. Используйте операторы Static, Dim, Private или Public, чтобы объявить массив, не указывая значение в скобках, как показано в следующем примере:

Вы можете неявно объявить массив в процедуре при помощи оператора ReDim. Будьте внимательны и вводите имя массива без ошибок при использовании оператора ReDim. Даже если в модуль включен оператор Option Explicit, будет создан второй массив.

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

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

При использовании ключевого слова Preserve внутри динамического массива можно менять только верхнюю границу последнего измерения; изменить количество измерений нельзя.

См. также

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

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

Читайте так же:
Можно ли вешать зеркало на входную дверь

Массивы в 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, т.е. через индекс элемента.

Функции VBA и массивы значений

Создание функций с бесконечным количеством аргументов

В предыдущих примерах мы создавали функции, в которых в качестве аргументов выступало одно значение. Но есть функции, у которых в качестве переменной выступает массив значений. Примерами таких функций встроенных в Excel служат функции СУММ, ВПР, МАКС, СРЗНАЧ и так далее. Давайте теперь создадим свою похожую функцию.

Далее приведен код функции, которая суммирует все четные значения.

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

Как видно из рисунка, мы не перечисляли каждое значение, а использовали диапазон ячеек A2:A11.

Теперь немного разберем код. Мы использовали цикл For Each — Next. Его задача пройтись по каждой ячейке нашего диапазона. Предварительно мы объявили еще одну переменную r типа Range. Она будет хранить значение каждой ячейки.

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

В конце, после цикла, мы присваиваем функции СуммаЧетных значение просуммированных элементов S.

Создание функций с неопределенным количеством аргументов

Предыдущая функция имеет недостаток — если вы попытаетесь использовать в качестве переменной несмежный диапазон ячеек, то получите ошибку. Иногда требуется более универсальная функция, так как на старте мы можем не знать количество аргументов, которые будут использоваться. Например, всем известная функция СУММ может принимать неограниченное количество аргументов =СУММ( A1 ; B1:B5 ;1;2;3), функция все рано вернет верный результат.

Читайте так же:
Меньше либо равно в excel

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

ParamArray — данный модификатор применяется только к последнему аргументу. Аргумент с данным модификатором всегда должен иметь тип данных Variant и всегда является необязательным, ключевое слов Optional не указывается дополнительно

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

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

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

У нас добавился еще один цикл For Each — Next. Т.е. сначала мы проходим по всем аргументам (диапазонам ячеек), а после проходим по всем ячейкам этих диапазонов.

Этот код тоже далек от идеала: если мы будем использовать вместо диапазонов значения, то получим ошибку. Поэтому если необходимо создать идеальную функцию, например как СУММ (она может обработать любые типы аргументов), то придется потрудится и дополнительно проверять тип аргументов. Но об это уже поговорим в другой раз. Перейдем к созданию еще одного типа функций.

Создание функции, возвращающих массив значений

Надеюсь вы знаете, как использовать формулы массивов в Excel. Эти функции вводятся на рабочий лист Excel с помощью сочетания клавиш Ctrl + Shift + Enter. Сейчас мы создадим функцию, которая возвратит массив значений. Например, выведет нам список всех месяцев.

Если мы введем функцию в одну ячейку, то увидим, что результатом будет только Январь. Чтобы понять как работает функция необходимо выделить 12 ячеек по горизонтали, ввести =СписокМесяцев() и нажать сочетание клавиш Ctrl + Shift + Enter.

Если необходимо вывести список месяцев по вертикали, то можно дополнительно использовать функцию =ТРАНСП(СписокМесяцев()).

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

VBA Arrays

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

Читайте так же:
Как в wordpad пронумеровать страницы

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

Как использовать массивы Excel VBA?

Давайте разберемся, как использовать массивы Excel VBA и их типы на некоторых примерах.

Вы можете скачать этот шаблон Excel VBA Arrays здесь — Шаблон Excel VBA Arrays

Пример № 1

Посмотрите на приведенный ниже пример. X — это переменная, которая содержит тип данных integer.

Код:

Теперь присвойте значение 1 объявленной переменной x.

Давайте вставим значение 1 в ячейку A1.

Код:

Значение x равно 1, а в диапазоне A1 значение будет вставлено как значение x, т. Е. Значение x равно 1. Теперь запустите код с помощью клавиши F5 или вручную, чтобы увидеть результаты.

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

Пример № 2

Теперь взгляните на приведенный ниже пример. Имя переменной — x, а тип данных — LONG. Но при объявлении самой переменной я открыл скобку и упомянул от 1 до 5. Это означает, что переменная x будет содержать 5 различных типов значений.

Код:

После этого я присвоил значения каждой переменной. X (1) = 20 означает, что первая переменная должна быть равна значению 20. X (2) = 25 означает, что вторая переменная должна быть равна значению 25 и так далее.

Код:

Позже я объявил еще одну переменную под названием «I», это второй тип переменной и содержит тип данных integer .

На следующем шаге я применил циклы FOR для вставки назначенных номеров в массив в первом столбце. Я установил значение переменной i равным 1, и я дал указание циклу работать от 1 до 5 раз. Когда цикл запускается в первый раз, значение i будет равно 1. CELLS (I, 1) .value = x (i) это означает, что в первый раз i равно 1, т. Е. CELLS (1, 1) .value = x (1), в первом столбце первого ряда (ячейка A1) значением будет значение первого массива ( x (1) ), т. е. 20.

Когда цикл запускается во второй раз, значение i становится равным 2, т.е. CELLS (2, 1) .value = x (2), во втором столбце первого ряда (A2) значением будет значение второго массива ( x (2) ) то есть 25.

Код:

Например, когда циклы продолжают работать, значения будут меняться. Когда циклы запускаются в третий раз, значение ячейки A3 будет равно 44, в четвертом цикле время выполнения цикла значение ячейки А4 будет равно 78, если значение цикла циклов, запущенных в последний раз или в пятый раз, будет равно 96.

Читайте так же:
Где перенос слов в ворде 2010

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

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

Массивы имеют разные типы в VBA. В Excel доступно пять типов массивов.

  • Статический массив
  • Динамический Массив
  • Одномерный массив
  • Двумерный массив
  • Многомерный массив
Статический массив

В этом типе массива длина массива заранее определяется заранее и остается постоянной.

Код:

В приведенном выше коде длина ArrayType определяется заранее от 1 до 3, а тип данных — Integer.

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

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

В этом типе массива длина массива заранее не определяется заранее.

Код:

В этом типе массива данных есть вариант, а длина здесь не определяется. После объявления переменной я присвоил длину массива с помощью функции ReDim . В этот массив будут вставлены следующие значения: Ячейка A1 = Мое имя, Ячейка B1 = есть, Ячейка C1 = Excel.

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

В этом типе массива длина определяется, но в одном измерении это работает.

Код:

Показать эти значения в окне сообщения VBA.

Код:

Запустите этот код, используя клавишу F5 или вручную, и мы получим следующий результат.

Двумерный массив

В этом типе массива длина определяется в двух измерениях, и это работает.

Код:

Теперь сохранить эти значения в ячейках кода ниже.

Код:

Это будет хранить данные, как показано ниже.

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

В этом типе массива длина определяется, но в многомерном она работает.

Код:

Если вы посмотрите на приведенный выше код, во-первых, я объявил массив от 1 до 3, а затем от 1 до 2. Это означает, что когда я пишу массив, во-первых, я могу использовать только от 1 до 3 чисел, но во втором месте я могу использовать только От 1 до 2, а не от 1 до 3.

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

Код:

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

То, что нужно запомнить

  • Массив будет считать значения с нуля, а не с 1.
  • Массив (0, 0) означает первый столбец первого ряда.
  • Этот файл макроса Excel необходимо сохранить как книгу с поддержкой макросов.
  • В случае динамического массива нам нужно присвоить значение массива с помощью функции REDIM в VBA.

Рекомендуемые статьи

Это было руководство к массивам VBA. Здесь мы обсудили типы массивов в VBA и как использовать массивы Excel VBA вместе с некоторыми практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector