Работа с массивами vba excel: VBA Excel. Массивы (одномерные, многомерные, динамические)

Содержание

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

Функции VBA для работы с массивами | Excel для всех Главная » Функции VBA » 28 Апрель 2011       Дмитрий       114672 просмотров
  • Array() — позволяет автоматически создать массив нужного размера и типа и сразу загрузить в него переданные значения:
        'инициализируем переменную с типом Variant
        Dim avArr
        'присваиваем переменной значение массива
        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")
        'показываем 3-ий по порядку элемент
        MsgBox avArr(2)

    ‘инициализируем переменную с типом Variant Dim avArr ‘присваиваем переменной значение массива avArr = Array(«Первый элемент», «Второй элемент», «3», 4, «Последний») ‘показываем 3-ий по порядку элемент MsgBox avArr(2)

    Опечатки нет. avArr(2) действительно выдаст третий элемент, т.к. по умолчанию для массива нижняя граница равна нулю. И да, таким образом можно создать исключительно одномерный массив.

  • Filter() — позволяет на основе одного массива получить другой, отфильтровав в исходном массиве нужные нам элементы.
  • LBound() — возвращает информацию о нижней границе массива (то есть номере первого имеющегося в нем значения)
        Dim avArr
        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")
        'показываем первый элемент
        MsgBox avArr(LBound(avArr))

    Dim avArr avArr = Array(«Первый элемент», «Второй элемент», «3», 4, «Последний») ‘показываем первый элемент MsgBox avArr(LBound(avArr))

  • UBound() — возвращает информацию о верхней границе массива (номер последнего имеющегося значения)
        Dim avArr
        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")
        'показываем последний элемент
        MsgBox avArr(UBound(avArr))

    Dim avArr avArr = Array(«Первый элемент», «Второй элемент», «3», 4, «Последний») ‘показываем последний элемент MsgBox avArr(UBound(avArr))

  • Join() — возможность слить множество строк из массива строк в одну строковую переменную. В качестве разделителя по умолчанию используется пробел, можно указать свой разделитель.
        Dim avArr
        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")
        'объединяем все элементы массива с разделителем "-"
        MsgBox Join(avArr, "-")

    Dim avArr avArr = Array(«Первый элемент», «Второй элемент», «3», 4, «Последний») ‘объединяем все элементы массива с разделителем «-« MsgBox Join(avArr, «-«)

  • Split() — обратная функция, разбивающая строку на массив строк . В качестве разделителя по умолчанию используется пробел, можно указать свой разделитель.
        'инициализируем переменную с типом Variant
        'т.к. затем это будет массив
        Dim sStr
        'разбиваем указанный текст массив. Разделитель - "-"
        sStr = Split("Первый элемент-Второй элемент-3-4-Последний", "-")
        'показываем 3-ий по порядку элемент
        MsgBox sStr(2)

    ‘инициализируем переменную с типом Variant ‘т.к. затем это будет массив Dim sStr ‘разбиваем указанный текст массив. Разделитель — «-« sStr = Split(«Первый элемент-Второй элемент-3-4-Последний», «-«) ‘показываем 3-ий по порядку элемент MsgBox sStr(2)


Статья помогла? Сделай твит, поделись ссылкой с друзьями!

Юридическая информация

Так же с этой статьей читают:

Наши партнеры


Спасибо за сообщение

Ваше сообщение было получено и отправлено администратору.

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

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

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

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


Function СуммаЧетных(Диапазон As Range) As Double
    Dim r As Range
    Dim S As Double
    
    For Each r In Диапазон
        If r.Value Mod 2 = 0 Then S = S + r.Value
    Next
    
    СуммаЧетных = S
End Function

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

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

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


For Each r In Диапазон

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

S.


If r.Value Mod 2 = 0 Then S = S + r.Value

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

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

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

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

.

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

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


Function СуммаЧетных2(ParamArray Значения() As Variant) As Double
    Dim v As Variant
    Dim S As Double
    
    For Each v In Значения
        If v Mod 2 = 0 Then S = S + v
    Next
    
    СуммаЧетных2 = S
End Function

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

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


Function СуммаЧетных3(ParamArray Диапазоны() As Variant) As Double
    Dim v As Variant
    Dim r As Variant
    Dim S As Double
    
    For Each v In Диапазоны
        For Each r In v
            If r Mod 2 = 0 Then S = S + r
        Next
    Next
    
    СуммаЧетных3 = S
End Function

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

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

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

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


Function СписокМесяцев()
    СписокМесяцев = Array("Январь", "Февраль", "Март", "Апрель", _
                    "Май", "Июнь", "Июль", "Август", _
                    "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")
End Function

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

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

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

Скачать

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

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

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

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

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

Массив в VB объявляется как обычная переменная, после ключевого слова Dim или Public,

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

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

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

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

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

as integer ‘трехмерный массив
Dim V4D (10, 10, 25, 5) as integer ‘четырехмерный массив
и т.д.

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

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

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

x = i +13
Redim MyDynMas (x)

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

Redim Preserve MyDynMas (x)

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

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

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

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

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

Option Explicit
Option Base 1

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

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

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

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

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

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

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

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

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

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

Пример:

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

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

 

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

 

 

VBA Excel. Диапазон ячеек и массив (обмен значениями)

Копирование значений из диапазона ячеек в массив и обратно с помощью VBA Excel. Простейшие примеры обмена значениями между диапазоном и массивом.


Как известно, VBA обрабатывает информацию в массивах значительно быстрее, чем в ячейках рабочего листа Excel. Поэтому, при работе с большими объемами данных, удобнее использовать массивы, чем наблюдать во время выполнения кода за мерцанием изображения на экране или просто смотреть в неизменную картинку, если обновление экрана отключено (Application.ScreenUpdating = False). Здесь обмен значениями между массивом и диапазоном ячеек будет вполне уместен.

Копирование значений из диапазона ячеек в массив

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (As Variant) и присвоить ей значения диапазона ячеек с помощью оператора присваивания (=):

Dim a As Variant

a = Range(«A1:C3»)

VBA Excel автоматически преобразует объявленную переменную в двумерный массив, соответствующий размерности диапазона ячеек, в нашем случае в массив — a(1 To 3, 1 To 3), и заполняет его значениями. Нумерация измерений массивов, созданных таким образом, начинается с единицы (1).

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

Dim a() As Variant

a = Range(«A1:C3»).Value

Стоит отметить, что для копирования значений из диапазона ячеек в массив можно использовать только обычную переменную или динамический массив универсального типа (Variant). VBA Excel автоматически преобразовывает их в двумерный массив. Если объявить двумерный массив с указанной заранее размерностью, использовать его не получится, будет сгенерирована ошибка с сообщением: Can’t assign to array (Нельзя назначать массив).

Копирование значений из массива в диапазон ячеек

Значения в диапазон ячеек добавляются из массива с помощью оператора присваивания (=):

Range(«A6:F15») = a

‘или

Range(«A6:F15»).Value = a

‘где a — переменная двумерного массива

Обратите внимание, что вставить значения в диапазон ячеек можно только из двумерного массива. Размерность такого массива может начинаться с нуля (0). Количество элементов в измерениях массива должно совпадать с количеством строк и столбцов в диапазоне ячеек. Если вам нужно вставить значения в одну строку или в один столбец, укажите размерность единственной строки или единственного столбца как (0) или (1 To 1), если вы хотите использовать нумерацию измерений своего массива с единицы. Например, для записи десяти значений из массива в одну строку можно объявить такой массив — massiv(9, 0), или в один столбец — massiv(0, 9).

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

Простейшие примеры обмена значениями

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

Пример 1

Заполнение двумерного массива значениями и и их присвоение диапазону ячеек на рабочем листе Excel:

Sub Test1()

Dim a(2, 2) As Variant

a(0, 0) = «телепузик»

a(0, 1) = «журналист»

a(0, 2) = «ящерица»

a(1, 0) = «короед»

a(1, 1) = «утенок»

a(1, 2) = «шмель»

a(2, 0) = 200

a(2, 1) = 300

a(2, 2) = 400

Range(«A1:C3»).Value = a

End Sub

В данном случае переменная массива не обязательно должна быть универсального типа (As Variant), например, если бы в нее записывались только текстовые данные, ее можно было бы объявить как строковую (As String), и все бы работало.

Пример 2

Объявление обычной переменной универсального типа, присвоение ей значений из диапазона ячеек «A1:C3», записанных кодом первого примера, и вставка этих значений из полученного двумерного массива в диапазон «D10:F12»:

Sub Test2()

Dim a As Variant

a = Range(«A1:C3»)

Range(«D10:F12») = a

End Sub

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

Пример 3

Допустим, на рабочем листе «Лист1» в ячейках «A1:A5» записано количество какого-то товара, а в ячейках «B1:B5» — его цена. Необходимо к этой информации добавить сумму каждого товара, умножив количество на цену, и перенести данные на «Лист2».

Sub Test3()

Dim a As Variant, i As Long

  a = Лист1.Range(«A1:C5»)

    For i = 1 To 5

      a(i, 3) = a(i, 1) _

      * a(i, 2)

    Next

  Лист2.Range(«A1:C5») = a

End Sub

Массив создан сразу с размерностью 5×3 с элементами под суммы. Даже если на первом листе в ячейках «C1:C5» есть какие-то значения, в массиве они будут перезаписаны результатами вычислений.

Урок 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 массивы (просто структура языков практически одинакова).

Excel vba массив Excelka.ru — все про Ексель

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

Excel vba массив

Массивы очень упрощают процесс программирования. Без них практически невозможно написать универсальную программу. Например, представьте себе, что вы манипулируете информацией о квартирах жилого дома. Вы объявляете переменные 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 . Option base 1 заставляет VBA считать нижней границей массива — единицу, а не ноль.

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

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

таким образом вы в явном виде указываете и нижнюю, и верхнюю границы. Как видите, нижняя граница совершенно не обязательно должна начинаться с 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 для двумерного массива).

Как работать с массивами функций в Excel

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

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

Терминология

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

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

1

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

Виды массивов функций в Excel

В целом, можно перечислить следующие виды массивов функций в Excel:

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

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

2

В свою очередь, одномерные массивы можно разделить на горизонтальные и вертикальные. Первые включают ячейки одного ряда, а вторые – колонки.

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

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

Синтаксис формулы массива

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

Для начала нам нужно выделить диапазон, к какому в дальнейшем будет применена формула. В нашем случае это набор ячеек, начинающийся E3, а заканчивающийся E8.

Затем ставим курсор в строку формул, и там записываем =C3:C8*D3:D8.

3

Превращаем формулу в формат массива. Нужно нажать Ctrl + Shift + Enter.

После этого мы получаем таблицу с готовыми промежуточными итогами.

4

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

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

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

5

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

  1. Выделяем ту ячейку, которая будет содержать результат вычисления по формуле массива.
  2. Вводим туда формулу. В нашем случае мы будем суммировать значения из целевого диапазона, поэтому используем формулу СУММ(C3:C8*D3:D8).
  3. С использованием комбинации Ctrl + Shift + Enter осуществляем трансформацию стандартной формулы в ту, которая работает с массивами данных.

По итогу, получаем следующий результат.

6

В случае, если бы мы не знали, как правильно использовать формулы массива, нам бы пришлось использовать две обычные. А так мы избавлены от этой необходимости. 

Давайте более подробно рассмотрим синтаксис этой формулы. 

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

Составные части формул массива:

  1. Функция массива. Это описание той операции, которую Эксель должен выполнить. 
  2. Массивы диапазона. Это непосредственно те диапазоны, которые будут обрабатываться формулой. 
  3. Оператор массива – знак двоеточия. Обозначает расстояние в определенное количество ячеек между конкретными адресами. 

Чтобы было проще понять, вот небольшой рисунок.

7

Анализ данных с помощью формулы массива

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

17

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

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

18

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

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

В результате получится формула, приведенная на скриншоте.

19

В ней используется 3 множителя. Первый проверяет менеджеров. Второй – товары. А третий – непосредственно определяет сумму заказа.

Как работает эта формула? Да очень просто. Ее алгоритм следующий:

  1. Сначала Excel проверяет всех менеджеров и товары, соответствуют ли они заданным критериям. Если да, функция возвращает значение 1, если нет – 0.

    20

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

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

Пример: товарный чек

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

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

8

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

9

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

10

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

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

11

Правда, если все оставить в таком же виде, то будет выдана ошибка после подтверждения ввода формулы с помощью клавиши Enter. Все потому, что наша формула пока еще не является формулой массива. Для этого нажимаем комбинацию Ctrl + Shift + Enter.

12

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

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

13

Важно! Эти скобки не являются текстовыми. Их нельзя вводить вручную. Если потребуется редактирование формулы, то в конце ввода опять нужно нажимать комбинацию Ctrl+Shift+Enter вместо простого нажатия клавиши «Ввод».

Пример: меняем местами строки и столбцы

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

14

Нам нужно выделить диапазон данных, в котором будет размещаться готовая таблица. Поскольку в нашем примере 8 рядов и 2 колонки, то соответственно нужно выделять наоборот, 8 колонок и 2 ряда. 

После этого надо ввести формулу =ТРАНСП, введя в качестве аргумента функции A1:B8.

15

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

16

Редактирование формулы массива

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

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

Изменение содержимого массива

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

  1. Найти кнопку «Отмена», расположенную слева от строки формул. Еще один вариант – нажатие клавиши Esc, которая выполняет ту же операцию. Во всех случаях блокировка будет снята и все операции можно выполнять заново. 
  2. Снова ввести формулу массива с тем же диапазоном.

Таким образом, изменение содержимого массива возможно лишь если все отменить, а потом заново вводить формулу. Неудобно, конечно, но значительно удобнее, чем использовать стандартные формулы.

Функции массивов

Рассмотрим наиболее часто используемые функции массивов.

Оператор СУММ

Точно так же, как и обычная функция СУММ, этот оператор осуществляет суммирование значений диапазона. Единственное отличие, что с ее помощью можно выполнять свои действия в два этапа: сначала осуществлять первую операцию со всеми значениями диапазона, а потом получившиеся результаты просуммировать между собой. 

Оператор ТРАНСП

Детально, как осуществлять транспонирование с помощью функции массива, было рассмотрено выше. Если подвести итоги, эта функция дает возможность создать диапазон, в котором строки и колонки будут поменяны местами. Например, с ее помощью можно создать два варианта таблицы: горизонтальную и вертикальную.

Оператор МОБР

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

Оцените качество статьи. Нам важно ваше мнение:

Работа с массивами в VBA

? LiveJournal
  • Главный
  • Рейтинги
  • Интересный
  • iOS и Android
  • Отключить рекламу
Авторизоваться
.

Учебное пособие по массивам VBA — Master Excel VBA Arrays

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

Навигация Другие структуры данных VBA

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

Одномерный массив VBA содержит последовательность элементов в одном измерении.Последовательность нумерации этих элементов по умолчанию начинается с 0. Вы можете переопределить начальный и конечный индекс последовательности элементов, используя оператор X to Y . См. Пример ниже:
Одномерный массив VBA
Начнем с представления простого одномерного массива VBA из 10 элементов:

10 наименований типа Long Dim onedimArray (от 1 до 10) до длины ‘Установите значение 2-го элемента на 20 onedimArray (2) = 10

’10 элементов типа Long

Dim onedimArray (от 1 до 10) As Long

‘Установите для второго элемента значение 20

onedimArray (2) = 10

Обратите внимание, что я установил размер массива для индексов от 1 до 10.Это не обязательные утверждения, поскольку я могу также объявить размер массива VBA без диапазона индекса.

Dim onedimArray (9) As Long ’10 элементов типа Long (от 0 до 9)

Dim onedimArray (9) As Long ’10 элементов типа Long (от 0 до 9)

Другой пример массива из 10 элементов, проиндексированных от 2 до 11.

Dim onedimArray (от 2 до 11) As Long ’10 элементов типа Long onedimArray (1) = 10 ‘ОШИБКА! Индекс начинается с 2!

Dim onedimArray (от 2 до 11) As Long ’10 элементов типа Long

onedimArray (1) = 10 ‘ОШИБКА! Индекс начинается с 2!

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

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

Dim twodimArray (5, 15) Как долго twodimArray (1,15) = 10 twodimArray (2,10) = 10 Dim threeedimArray (5, 10, 15) до длины TreedimArray (2, 10, 12) = 3 TreedimArray (5, 10, 15) = 9

Dim twodimArray (5, 15) As Long

twodimArray (1,15) = 10

twodimArray (2,10) = 10

Dim threeedimArray (5, 10, 15) As Long

threeedimArray 2, 10, 12) = 3

threeedimArray (5, 10, 15) = 9

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

Фиксированный массив VBA

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

Dim fixedArray (5) As String ‘это массив фиксированного размера с индексами от 0 до 5 Redim fixedArray (10) ‘ОШИБКА! ЗАПРЕЩЕНО! Dim dynamicArray () как строка Redim dynamicArray (5) ‘ОК.Объявление размера динамического массива

Dim fixedArray (5) As String ‘это массив фиксированного размера, индексированный от 0 до 5

Redim fixedArray (10)’ ОШИБКА! ЗАПРЕЩЕНО!

Dim dynamicArray () As String

Redim dynamicArray (5) ‘ОК. Объявление размера динамического массива

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

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

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

Dim dynamicArray () As Long ‘Объявить динамический массив ‘Установите размер массива на 10 элементов (от 0 до 9) ReDim dynamicArray (9) dynamicArray (1) = 20

Dim dynamicArray () As Long ‘Объявить динамический массив

‘ Установить размер массива 10 элементов (от 0 до 9)

ReDim dynamicArray (9)

dynamicArray (1) = 20

Если вы хотите установить свой собственный диапазон индексов, не стесняйтесь использовать оператор ReDim как таковой:

‘Объявить динамический массив Dim dynamicArray () как долго ‘Установите размер массива на 10 элементов ReDim dynamicArray (от 2 до 11) dynamicArray (1) = 20

‘Объявить динамический массив

Dim dynamicArray () As Long

‘ Установить размер массива 10 элементов

ReDim dynamicArray (от 2 до 11)

dynamicArray (1) = 20

Заявление

ReDim — изменение размера динамического массива VBA

Оператор ReDim используется для установки размера массива VBA или для его изменения при необходимости.См. Пример ниже.

‘Объявить динамический массив Dim dynamicArray () как долго ‘Установить размер массива 10 элементов ReDim dynamicArray (9) dynamicArray (2) = 5 ‘Измените размер массива с 10 до 15 (стирая все элементы) ReDim dynamicArray (14) Debug.Print dynamicArray (2) ‘Результат: 0 — элемент не сохраняется

‘Объявить динамический массив

Dim dynamicArray () As Long

‘ Установить размер массива 10 элементов

ReDim dynamicArray (9)

dynamicArray (2) = 5

‘Resize размер массива от 10 до 15 (стирание всех элементов)

ReDim dynamicArray (14)

Debug.Печать dynamicArray (2) ‘Результат: 0 — элемент не сохраняется

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

‘Объявить динамический массив Dim dynamicArray () как долго ‘Установите размер массива на 10 элементов ReDim dynamicArray (9) dynamicArray (2) = 5 ‘Изменить размер массива и сохранить элементы ReDim Preserve dynamicArray (14) Отлаживать.Печать dynamicArray (2) ‘Результат: 5 — элемент сохранен

‘Объявить динамический массив

Dim dynamicArray () As Long

‘ Установить размер массива 10 элементов

ReDim dynamicArray (9)

dynamicArray (2) = 5

‘Изменить размер Элементы массива и сохранения

ReDim Preserve dynamicArray (14)

Debug.Print dynamicArray (2) ‘Результат: 5 — элемент сохранен

Удаление динамических массивов VBA

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

Dim arr () Пока ReDim обр. (100,100) arr (0,0) = 0 * 0 ‘… прибл (100,100) = 100 * 100 Erase arr ‘Сотрите массив и освободите память!

Dim arr () As Long

ReDim arr (100,100)

arr (0,0) = 0 * 0

‘…

arr (100,100) = 100 * 100

Erase arr ‘Стереть массив и освободить память!

Определение размеров и перемещение по массивам

Размер массивов VBA

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

VBA Размер массива

Чтобы получить размер массива VBA, используйте следующую функцию:

UBound (массив) — LBound (массив) + 1

UBound (массив) — LBound (массив) + 1

Получение размера массивов VBA всегда вызывало некоторую путаницу.Сначала давайте разберемся с функциями UBound и LBound :

LBound по сравнению с UBound

‘Объявить динамический массив Dim dynamicArray () как долго ‘Установить размер массива ReDim dynamicArray (от 1 до 10) Debug.Print UBound (dynamicArray) ‘Результат: 10 Debug.Print LBound (dynamicArray) ‘Результат: 1 ‘Изменить размер массива ReDim Preserve dynamicArray (от 2 до 20) Debug.Print UBound (dynamicArray) ‘Результат: 20 Debug.Print LBound (dynamicArray) ‘Результат: 2

‘Объявить динамический массив

Dim dynamicArray () As Long

‘ Установить размер массива

ReDim dynamicArray (от 1 до 10)

Debug.Печать UBound (dynamicArray) ‘Результат: 10

Debug.Print LBound (dynamicArray)’ Результат: 1

‘Изменение размера массива

ReDim Preserve dynamicArray (от 2 до 20)

Debug.Print UBound Результат: 20

Debug.Print LBound (dynamicArray) ‘Результат: 2

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

‘Объявить динамический массив Dim dynamicArray () как долго ‘Установить размер массива ReDim dynamicArray (от 1 до 10) ‘Размер печати массива Отлаживать.Выведите UBound (dynamicArray) -LBound (dynamicArray) +1 ‘Результат: 10. ПРАВИЛЬНО!

‘Объявить динамический массив

Dim dynamicArray () As Long

‘ Установить размер массива

ReDim dynamicArray (от 1 до 10)

‘Размер печати массива

Debug.Print. (dynamicArray) -LBound (dynamicArray) +1 ‘Результат: 10. ПРАВИЛЬНО!

Обход массива VBA

Для обхода (итерации) через массив VBA вы можете использовать циклы For или For Each .

Для каждого примера

‘Обход и печать элементов массива Dim arr (10) По длине … Для каждого arrItem In arr Debug.Print arrItem Следующий arrItem

‘Перемещение и печать элементов массива

Dim arr (10) As Long

Для каждой arrItem In arr

Debug.Print arrItem

Next arrItem

Например

‘Обход и печать элементов массива Dim arr (10) Пока, я до тех пор … Для i = LBound (arr) в UBound (arr) Отладка.Печать arr (i) Далее я

‘Элементы массива перемещения и печати

.

Динамические, многомерные типы с примером

  • На главную
  • Тестирование

      • Назад
      • Гибкое тестирование
      • BugZilla
      • Cucumber
      • Тестирование базы данных
      • 000
      • J27 Тестирование базы данных
      • 9A
      • JUnit
      • LoadRunner
      • Ручное тестирование
      • Мобильное тестирование
      • Mantis
      • Почтальон
      • QTP
      • Назад
      • Центр качества (ALM)
      • 000
      • Центр контроля качества (ALM)
      • 000 Управление тестированием
      • TestLink
  • SAP

      • Назад
      • ABAP
      • APO
      • Начинающий
      • Basis
      • BODS
      • BI
      • BPC
      • CO
      • Назад
      • CRM
      • Crystal Reports
      • QM4000
      • QM4
      • Заработная плата
      • Назад
      • PI / PO
      • PP
      • SD
      • SAPUI5
      • Безопасность
      • Менеджер решений
      • Successfactors
      • Учебники SAP

        • Apache
        • AngularJS
        • ASP.Net
        • C
        • C #
        • C ++
        • CodeIgniter
        • СУБД
        • JavaScript
        • Назад
        • Java
        • JSP
        • Kotlin
        • Linux
        • Linux
        • Kotlin
        • Linux
        • js
        • Perl
        • Назад
        • PHP
        • PL / SQL
        • PostgreSQL
        • Python
        • ReactJS
        • Ruby & Rails
        • Scala
        • SQL
        • 000
        • SQL
        • 000 0003 SQL 000 0003 SQL 000
        • UML
        • VB.Net
        • VBScript
        • Веб-службы
        • WPF
    • Обязательно учите!

        • Назад
        • Бухгалтерский учет
        • Алгоритмы
        • Android
        • Блокчейн
        • Business Analyst
        • Создание веб-сайта
        • CCNA
        • Облачные вычисления
        • 00030003 COBOL
            9000 Compiler
              9000 Встроенные системы
            • 00030003 9000 Compiler 9000
            • Ethical Hacking
            • Учебные пособия по Excel
            • Программирование на Go
            • IoT
            • ITIL
            • Jenkins
            • MIS
            • Сети
            • Операционная система
            • 00030003
            • Назад
            • Управление проектами Обзоры
            • Salesforce
            • SEO
            • Разработка программного обеспечения
            • VB A
        • Big Data

            • Назад
            • AWS
            • BigData
            • Cassandra
            • Cognos
            • Хранилище данных
            • 0003
            • HBOps
            • 0003
            • HBOps
            • 0003
            • MicroStrategy
        .

        excel — вставка формулы массива через VBA

        Переполнение стека
        1. Около
        2. Продукты
        3. Для команд
        1. Переполнение стека Общественные вопросы и ответы
        2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
        3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
        4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
        5. Реклама Обратитесь к разработчикам и технологам со всего мира
        6. О компании
        .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa