В этом руководстве будет показано, как объявлять (затемнять), создавать и инициализировать переменные массива в VBA.
Что такое переменная массива VBA?
Переменную массива VBA можно рассматривать как группу переменных, хранящихся под одним и тем же именем и имеющих один и тот же тип данных. Массив может хранить текст, числа или объекты.
Вы ссылаетесь на элемент в массиве, используя его порядковый номер.
Вы можете объявить переменную массива так же, как и любую другую переменную, используя ключевое слово Dim, Static, Public или Private.
Статические массивы
Есть 2 типа массивов - статические и динамические. Статический массив объявляется с размером, указанным при первоначальном объявлении массива. Его также называют фиксированным массивом.
1 | Dim intA (4) как целое число |
Вышеупомянутый массив объявлен с использованием оператора Dim на уровне процедуры или модуля, а размер массива равен 5, поскольку мы не объявили значение LBound для массива.
Нет, это не опечатка! Размер массива равен 5, несмотря на то, что в массив введено 4. Это связано с тем, что индексы массива автоматически начинаются с нуля.
Индексы массивов
Индексы массива автоматически начинаются с нуля, если только Вариант База 1 объявлен в верхней части вашего модуля кода.
Если Вариант База 1 объявлен, тогда массивы автоматически начнутся с 1.
Однако я считаю, что такое объявление переменных проблематично. Рецензенты кода могут не знать, что массивы начинаются с нуля или объявления Option Base 1.
Вместо этого я предпочитаю явно объявлять начальную и конечную позиции массивов:
1 | Dim intA (от 2 до 5) как целое число |
Обратите внимание, что когда вы это сделаете, вы можете начать массив с любого числа (а не только с 1 или 0).
Динамические массивы
Переменная динамического массива - это массив, размер которого можно изменять во время выполнения. Вы объявляете динамические переменные без размера.
1 | Dim intA () как целое число |
Вы можете использовать оператор ReDim, чтобы указать размер массива после создания массива.
1 | ReDim intA (2) |
Вы можете изменить размер динамического массива в любое время. Однако при использовании оператора ReDim все существующие значения стираются. Чтобы сохранить существующие значения массива, используйте ReDim Preserve вместо.
1 | ReDim Preserve intA (2) |
Вы можете объявить динамический массив на уровне процедуры, модуля или глобального уровня, но вы можете использовать оператор ReDim только внутри процедуры.
Варианты массивов
Вариантные массивы - это динамические массивы, с которыми проще работать.
1 | Dim varNames () |
Обратите внимание, что вам не нужно указывать тип данных (предполагается, что он вариантный) или размер массива.
Как мы увидим ниже, вы можете инициализировать вариантные массивы с помощью функции массива (не нужно предварительно изменять размер массивов)!
Объявление модуля и публичных массивов
Как показано выше, массивы могут быть объявлены внутри процедур для использования в этой процедуре:
1234 | Подложка StaticArray ()'объявить массив со значением LBound, равным 1, и значением UBound, равным 4Dim IntA (от 1 до 4) как целое числоКонец подписки |
Но они также могут быть объявлены на модульном или глобальном уровне.
1234567 | Вариант Явный'объявить массив со значением LBound, равным 1, и значением UBound, равным 4Dim IntA (от 1 до 4) как целое числоПодложка StaticArray ()Конец подписки |
В этом примере переменную массива можно вызвать в любом месте этого модуля кода. Вместо этого вы можете объявить публичный массив, который можно использовать в вашем проекте VBA (см. Следующий раздел).
Объявление публичного массива
Вы объявляете публичный статический массив так же, как объявляете публичную переменную.
1 | Public strNames (3) как строка |
Это объявление должно быть в верхней части вашего модуля, ниже Option Explicit. Затем его можно было бы использовать во всем вашем проекте VBA в любом модуле или процедуре.
Если вы объявляете массив в верхней части модуля, но с ключевым словом Dim, то использование этого массива ограничивается этим отдельным модулем. Попытка использовать массив в отдельном модуле приведет к ошибке.
Инициализировать массивы
Вы можете присвоить значения статическому массиву следующим образом.
1234567891011 | Подложка StaticArray ()'объявить массив со значением LBound, равным 1, и значением UBound, равным 4Dim IntA (от 1 до 4) как целое число'инициализировать массивIntA (1) = 10IntA (2) = 20ИнтА (3) = 30ИнтА (4) = 40'показать результат позиции 2 массива в ближайшем окнеОтладка.Печать IntA (2)Конец подписки |
Если вы запустите описанную выше процедуру, значение 20 отобразится в ближайшем окне.
Вы также можете присвоить значения динамическому массиву таким же образом.
12345678910111213 | Sub DynamicArray ()'объявить динамический массив, но без привязанных значенийDim IntA () как целое число'инициализировать массивReDim IntA (от 1 до 4)IntA (1) = 10IntA (2) = 20ИнтА (3) = 30ИнтА (4) = 40'показать результат позиции 2 массива в ближайшем окнеОтладка.ПечатьIntA (2)Конец подписки |
Функция массива
Тем не мение, только с массивом вариантов, вы можете использовать функцию массива, что может быть проще, чем использование стандартного метода.
12 | 'заполнить массивintA () = Массив (10, 20, 30, 40) |
Заполнить массив с помощью цикла
Вы также можете заполнять массивы, просматривая диапазон ячеек в Excel.
1234567891011121314151617 | Sub TestDynamicArrayFromExcel ()'объявить массивDim strNames () как строка'объявить целое число для подсчета строк в диапазонеDim n как целое число'объявить целое число для циклаDim i как целое число'подсчитываем строки в диапазонеn = Диапазон ("A1", Диапазон ("A1"). Конец (xlDown)). Rows.Count'уменьшите размер массива до количества строк в диапазоне.ReDim strNames (n)Для i = 0 К nstrNames (i) = Диапазон ("A1"). Смещение (i + 1, 0)Далее я'показать значения в массивеПрисоединение к MsgBox (strNames ())Конец подписки |
Повторно инициализировать массивы
Вы можете повторно инициализировать свой массив на любом этапе вашего кода, но тогда вы потеряете исходное значение, содержащееся в этой позиции в вашем массиве.
1234567891011121314 | Подложка StaticArray ()'объявить массив со значением LBound, равным 1, и значением UBound, равным 4Dim IntA (от 1 до 4) как целое число'инициализировать массивIntA (1) = 10IntA (2) = 20ИнтА (3) = 30ИнтА (4) = 40'показать результат позиции 2 массива в ближайшем окнеОтладка.Печать IntA (2)'снова инициализировать массивintA (2) = 200Отладка.Печать IntA (2)Конец подписки |
В приведенном выше примере статический массив сохранит все значения, кроме значения в позиции 2 - это значение изменится на 200.
Использование ReDim
Если вы используете динамический массив, оператор ReDim используется для установки размера вашего массива. Вы можете впоследствии использовать оператор ReDim в своем коде, чтобы изменять размер массива столько раз, сколько вам нужно. Строка кода ниже повторно инициализирует массив intA, чтобы он имел размер 2 (помните - индекс массива начинается с 0!)
1 | ReDim intA (1) как целое число |
Таким образом, код, включающий оператор ReDim, будет выглядеть, как в примере ниже.
1234567891011121314151617 | Sub TestDynamicArray ()'объявить массивDim intA () как целое числоReDim intA (2)'заполняем массив числамиintA (0) = 2intA (1) = 5intA (2) = 9'показать число в позиции 1Отладка.Печать intA (1)'изменить размер массива, чтобы изменить размерReDim intA (3)intA (0) = 6intA (1) = 8'на этот раз показать число в позиции 1Отладка.Печать intA (1)Конец подписки |
Если вы запустите вышеуказанную процедуру, значение 5 будет отображаться в непосредственном окне, а затем будет отображаться значение 8 после того, как мы изменим размер массива с помощью ReDim и повторно заполнили его. Однако, поскольку мы не заполнили IntA (2) и не использовали Re-Dim Preserve, значение в этой позиции в массиве будет удалено, а позиции 3 и 4 в массиве будут нулевыми.
Использование ReDim Preserve
Если мы используем ReDim Preserve, он сохранит исходные значения, содержащиеся в массиве.
1234567891011121314151617 | Sub TestDynamicArray ()'объявить массивDim intA () как целое числоReDim intA (2)'заполняем массив числамиintA (0) = 2intA (1) = 5intA (2) = 9'показать число в позиции 2Отладка.Печать intA (2)'переименовывать массивReDim intA (3)intA (0) = 6intA (1) = 8'снова показать число в позиции 2Отладка.Печать intA (2)Конец подписки |
В обоих окнах сообщений, показанных выше, будет отображаться число 9, поскольку оператор ReDim Preserve сохранил это значение в этой позиции.