Разное

Vba массив массивов: Массив в массиве vba — CodeRoad

Содержание

Массив в массиве vba — CodeRoad

я должен создать массив в массиве

вот мой код:

Dim servers(2) As String
Dim parameters(3) As String
Dim i, j As Integer

parameters(0) = "db1"
parameters(1) = "server1"
parameters(2) = "user1"
parameters(3) = "password1"

For i = 0 To 2
    For j = 0 To 3
       servers(i) = parameters(j)
    Next j
Next i

Я сделал графический пример с результатом и действительно не знаю как это сделать:
https://i.stack.imgur.com/1uSme.png

arrays

vba

Поделиться

Источник


Alessandro95    

19 апреля 2017 в 12:30

3 ответа


  • Массив из 600 + строк в excel VBA

    Я делаю цикл для каждой строки в массиве таким образом, что filename = Array(file1,file2…..file600) Однако VBA получает ошибку компиляции, которая вызвана тем, что массив занимает 8 строк. Насколько мне известно, он допускает только 1 строку (ошибка говорит, что ожидаемый список или разделитель)…

  • Добавление значений строк в массив: VBA

    Я строю генетический алгоритм в VBA, и моя функция пригодности зависит от того, сколько единиц имеет строка массива. Массив представляет собой комбинацию 1 и 0. Массив может быть любого размера (2D), и мне нужно добавить число 1 в строке и сравнить его с rest значениями. Я рассматривал возможность…



4

Похоже, что определенный пользователем тип может вам помочь:

Type tServerData
    DBname As String
    ServerID As String
    UserName As String
    Password As String
End Type

Dim ServerData(0 To 2) As tServerData

Теперь у вас есть arrray для 3 серверов, например:

ServerData(0).DBname= "db1"

и т.д.

Поделиться


Paul Ogilvie    

19 апреля 2017 в 12:40



1

На самом деле вам нужен массив 2-D для заполнения вашего servers, попробуйте следующий код:

Option Explicit

Sub x()

Dim servers(2, 3) As String
Dim parameters() As Variant
Dim i As Long, j As Long

parameters = Array("db", "server", "user", "password")

For i = 0 To 2
    For j = LBound(parameters) To UBound(parameters)
       servers(i, j) = parameters(j) & i + 1
    Next j
Next i

End Sub

Поделиться


Shai Rado    

19 апреля 2017 в 12:39



0

Попробуйте использовать двумерный массив:

Dim parameters(10,10) As String

parameters(1,1) = "db1"
parameters(1,2) = "server1"
. ..
parameters(2,1) = "db2"
parameters(2,2) = "server2"
...

Поделиться


David G    

19 апреля 2017 в 12:38


  • Получение индекса элемента в массиве VBA

    Я пытаюсь получить индекс элемента в массиве VBA, но у меня есть проблема с его получением. Const NoOfVol As Integer = 5 Dim vol(NoOfVol) As Integer For Index = 1 To NoOfVol vol(Index) = Cells(15 + Index, 8).Value Next Массив выглядит следующим образом: (-2500,-1250,0,1250,2500). Я вызываю функцию…

  • Как хранить имена массивов в массиве в VBA

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


Похожие вопросы:

Возвращаемый индекс элемента в массиве Excel VBA

У меня есть массив prLst, который представляет собой список целых чисел. Целые числа не сортируются, поскольку их положение в массиве представляет определенный столбец в электронной таблице. Я хочу…

Преобразование массива VBA в массив «column»

Как мне теперь известно, массив в Excel имеет два вида представления : {1,2,3,4} also known as one-dimensional horizontal array и {1;2;3;4} also known as one-dimensional vertical array Я создал…

Хранить VBA вычислять значения в массиве

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

Массив из 600 + строк в excel VBA

Я делаю цикл для каждой строки в массиве таким образом, что filename = Array(file1,file2. ….file600) Однако VBA получает ошибку компиляции, которая вызвана тем, что массив занимает 8 строк….

Добавление значений строк в массив: VBA

Я строю генетический алгоритм в VBA, и моя функция пригодности зависит от того, сколько единиц имеет строка массива. Массив представляет собой комбинацию 1 и 0. Массив может быть любого размера…

Получение индекса элемента в массиве VBA

Я пытаюсь получить индекс элемента в массиве VBA, но у меня есть проблема с его получением. Const NoOfVol As Integer = 5 Dim vol(NoOfVol) As Integer For Index = 1 To NoOfVol vol(Index) = Cells(15 +…

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

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

VBA: массив & СЧЕТЕСЛИ

Все, Я изо всех сил пытаюсь найти подход к следующему случаю в Excel VBA: Из разных листов я создал массив в VBA (4 столбца: ключ, тип, дата действия A, дата действия B), например: Я решил не…

Найти среднее значение значений в массиве (Excel VBA)

Как найти среднее значение значений, содержащихся в массиве 2D в excel VBA? У меня есть массив с именем Numbers, который имеет значения 1,2,3,4,6 как мне ввести среднее значение в значение с именем…

Хранить элемент из excel в массив VBA

У меня есть некоторые данные в терминах столбца, которые я хочу сохранить в массиве с помощью VBA. После его сохранения я буду ссылаться на элемент в массиве и делать сравнение. Dim tRange As Range…

Обработка массивов — VBA

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

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

Данные в массивах

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

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

Все действия с массивами выполняются поэлементно, в цикле. Поскольку массив — это последовательность с известным числом элементов, удобнее использовать цикл For.

Пример 1

Пример. Вычислить средний рост по данным, записанным в электронной таблице.

Результат вычисления среднего роста будут записаны в ячейку B9.

Решение.

Sub средний_рост()
Dim Rost(6) As Double
Dim i As Integer
Dim Сумма, Среднее As Double
 
' ввод таблицы для обработки
For i = 1 To 6
Rost(i) = Cells(1 + i, 2).Value
Next i
 
' нахождение суммы чисел в таблице
Сумма = 0
For i = 1 To 6
Сумма = Сумма + Rost(i)
Next i
 
' вычисление среднего
Среднее = Сумма / 6
 
'вывод
Cells(9, 2).Value = Среднее
MsgBox (Среднее)
End Sub

Пояснение решения.

В строке Dim Rost(6) As Doubl объявляется массив чисел двойной точности именем Rost размерностью 6, то есть одномерная таблица Rost емкостью 6 (шесть) ячеек.

Аналогичным образом можно обрабатывать и двумерные массивы.

Пример 2

Пример. Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали. Данные записаны в электронной таблице.

Решение.

Sub simetria()
Const n = 4
Dim i, j
Dim x(n, n)
Dim t, check As Boolean
For i = 1 To n
For j = 1 To n
x(i, j) = Cells(i, j)
Next
Next
t = True 'предположим, что матрица симметрична
i = 2
While t And (i < n)
j = 1
While (j < i) And (x(i, j) = x(j, i))
j = j + 1
Wend
t = (j = i)
i = i + 1
Wend
check = t
MsgBox check
End Sub

arrays — Объединение двух массивов в VBA?

Как мне объединить эти массивы с результатами (2, 4, 5, 3, 7, 6)?

array1 = Array(4,5,3,7,6)

array2 = Array(2)

3

attemptingpython

11 Дек 2018 в 18:41

3 ответа

Лучший ответ

Вы могли бы потенциально Join() и объединить ваши два массива, а затем Split() результат обратно в новый массив:

array3 = Split(Join(array2, ",") & "," & Join(array1, ","), ",")

Объяснение :
Join() вернет строку, в которой каждый элемент массива (первый параметр) разделен "," (вторым параметром). Мы объединяем эти два объединенных массива еще с одной запятой, чтобы получить строку типа 2,4,5,3,7,6. Затем мы используем Split(), чтобы превратить эту строку обратно в массив, сообщающий Split(), что разделитель является запятой ",".

6

JNevill
11 Дек 2018 в 15:59

Вы можете использовать arrayLists. Это также обеспечивает легкую сортировку, если требуется.

Option Explicit
Public Sub test()
    Dim list1 As Object, list2 As Object

    Set list1 = CreateObject("System.Collections.Arraylist")
    Set list2 = CreateObject("System.Collections.Arraylist")
    list1.Add 4
    list1.Add 5
    list1.Add 3
    list1.Add 7
    list1.Add 6
    list2.Add 2
    list1.addRange list2
    list1.Sort
End Sub

4

QHarr
11 Дек 2018 в 15:56

Поздно на вечеринку, но я также добавлю свои два цента

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

Sub Test()

Dim arr1 As Variant: arr1 = Array(4, 5, 3, 7, 6)
Dim arr2 As Variant: arr2 = Array(2)
Dim arr3 As Variant: arr3 = arr2

ReDim Preserve arr3(UBound(arr1) + Ubound(arr2) + 1)
For x = (UBound(arr3) - UBound(arr1)) To UBound(arr3)
    arr3(x) = arr1(x - UBound(arr2) - 1)
Next x

End Sub

Чтобы продемонстрировать возврат различных Data Type с использованием некоторых Type преобразований:

Sub Test()

Dim arr1 As Variant: arr1 = Array(CDbl(4), CLng(5), CStr(3), CDate(7), CCur(6))
Dim arr2 As Variant: arr2 = Array(2)
Dim arr3 As Variant: arr3 = arr2

ReDim Preserve arr3(UBound(arr1) + Ubound(arr2) + 1)
For x = (UBound(arr3) - UBound(arr1)) To UBound(arr3)
    arr3(x) = arr1(x - UBound(arr2) - 1)
Next x

End Sub

1

JvdV
6 Фев 2020 в 21:13

Тема: Массивы в vba — Контрольные вопросы

Практическая
работа

Тема: Массивы в VBA

Цель: Освоить технологию обработки
массивов в VBA

Задачи

  1. Изучение теоретического материала

  2. Привитие навыков самостоятельной
    работы с электронными материалами

Задания

  1. Изучить предложенный материал

  2. Разобрать и проверить примеры

  3. Ответить в конспекте на контрольные
    вопросы

  4. Выполнить индивидуальные задания

Контрольные вопросы

  1. Что такое сортировка массива? Для чего
    она производится?

  2. Каким образом производится удаление
    элементов массива?

  3. Каким образом производится вставка
    элементов массива?

Массивы

Часто
бывает необходимо работать с некоторым
набором однотипных данных как с единым
целым. j)

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

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

Dim Имя массива
(Размерность массива) As
Тип элементов.

Пример

Dim
A (100) As Integer

Dim
B (50) As Byte

Dim
С (40) As
Double

При
таком описании массива его элементы
индексируются (т.е. нумеруются), начиная
с нуля.

Если
оператор описания будет выглядеть
следующим образом:

Dim
A (1 To 100) As Integer,

то элементы массива индексируются с
единицы.

Заполнение массива может происходить:

  • с
    клавиатуры

  • по
    некоторому алгоритму

  • случайными
    значениями при помощи генератора
    случайных чисел, который инициализируется
    инструкцией Randomize
    без аргумента, и активизируется функцией
    Rnd, возвращающей
    вещественное значение из диапазона
    [0;1)
    .

Пример

Randomize

For
i = 1 To 10

A(i)
= Int(Rnd
* 101) – 50 ‘заполнение
массива целыми числами [-50;50]

Next
i

Сортировка элементов одномерного
массива методом “пузырька”

Рассмотрим одномерный массив А:

– 4 6 – 2 10

Нужно расставить элементы этого массива
по убыванию.

Метод “пузырька” заключается в том,
что сравниваются два соседних элемента
массива и, если первый из них меньше
второго, то их переставляют местами
(сортировка по убыванию).

I просмотр

– 4 6 – 2 10

6 – 4 – 2 10

6 – 2 – 4 10

6 – 2 10 – 4

II
просмотр

6 – 2 10 – 4

6 10 – 2 – 4

III
просмотр

6 10 – 2 – 4

10 6 – 2 – 4

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

Option
Explicit

Sub
PR19()

Dim A(30) As Integer

Dim
N As Integer

Dim
I As Integer

Dim
K As Integer

Dim
R As Integer

N = Val(InputBox(«Введите
N»))

For I = 1 To
N

Cells(1,I) =
Int(Rnd * 100 –
50) ‘ Заполнение ячеек рабочего листа

‘ случайными числами

A(I) = Cells(1,I) ‘ Заполнение
массива

Next
I

‘ Сортировка массива

For K = 1 To
N–1

For I = 1 To N–K

If A(I)

R = A(I) ‘ Перестановка
элементов

A(I) = A(I+1)

A(I+1) = R

End If

Next I

Next K

‘ Распечатка полученного массива на
рабочем листе Excel

Cells(3,3) = «Упорядоченный
массив»

For
I = 1 To N

Cells(5,I) = A(I)

Next I

End Sub

Самостоятельная работа № 10

В 1

  1. Упорядочить
    элементы массива по возрастанию и
    вычислить сумму первого и последнего
    элементов.

  2. Упорядочить
    элементы массива по убыванию и переставить
    местами первый и последний элементы.

В 2

  1. Упорядочить
    элементы массива по возрастанию и найти
    максимальный из двух первых элементов.

  2. Упорядочить
    элементы массива по убыванию и вычислить
    произведение первого и последнего
    элементов.

В 3

  1. Упорядочить
    элементы массива по возрастанию и
    вычислить сумму первых трех элементов.

  2. Упорядочить
    элементы массива по убыванию и переставить
    местами второй и предпоследний элементы.

В 4

  1. Упорядочить
    элементы массива по возрастанию и
    вычислить минимальный из четных
    элементов.

  2. Упорядочить
    элементы массива по убыванию и найти
    произведение первого и третьего
    элементов.

В 5

  1. Упорядочить
    элементы массива по возрастанию и найти
    сумму первого и четвертого элементов.

  2. Упорядочить
    элементы массива по убыванию и поменять
    местами первый и пятый элементы.

В 6

  1. Упорядочить
    элементы массива по возрастанию и найти
    максимальный элемент в первой половине
    массива.

  2. Упорядочить
    элементы массива по убыванию и найти
    произведение последних двух элементов.

В 7

  1. Упорядочить
    элементы массива по возрастанию и
    поменять местами второй и последний
    элементы.

  2. Упорядочить
    элементы массива по убыванию и найти
    минимальный из первого и пятого
    элементов.

В 8

  1. Упорядочить
    элементы массива по возрастанию и найти
    сумму положительных элементов.

  2. Упорядочить
    элементы массива по убыванию и переставить
    местами второй и минимальный элемент.

В 9

  1. Упорядочить
    элементы массива по возрастанию и найти
    сумму второго и пятого элементов.

  2. Упорядочить
    первую половину массива по убыванию и
    переставить первый и последний элементы.

В 10

  1. Упорядочить
    вторую половину массива по возрастанию
    и найти произведение первого и шестого
    элементов.

  2. Упорядочить
    элементы массива по убыванию и поменять
    местами максимальный и минимальный
    элементы.

Самостоятельная работа № 11

В 1

Задан целочисленный массив А(10).
Упорядочить по убыванию четные элементы.

В 2

Задан целочисленный массив А(10).
Упорядочить по возрастанию нечетные
элементы.

В 3

Задан целочисленный массив А(10).
Упорядочить по убыванию элементы
массива, кратные 7.

В 4

Задан целочисленный массив А(10).
Упорядочить по убыванию положительные
элементы.

В 5

Задан целочисленный массив А(10).
Упорядочить по возрастанию те элементы
массива, которые стоят на четных местах.

В 6

Задан целочисленный массив А(10).
Упорядочить по возрастанию те элементы
массива, которые стоят на нечетных
местах.

В 7

Задан целочисленный массив А(10).
Упорядочить элементы, стоящие на четных
местах, по возрастанию, а стоящие на
нечетных местах, по убыванию.

В 8

Задан целочисленный массив А(10).
Упорядочить положительные элементы по
возрастанию, а отрицательные по убыванию.

В 9

Задан целочисленный массив А(10).
Упорядочить элементы, кратные 3, по
убыванию, а некратные 3 по возрастанию.

В 10

Задан целочисленный массив А(10).
Упорядочить по возрастанию элементы
кратные 5.

В 11

Задан целочисленный массив А(10).
Упорядочить по убыванию элементы,
принадлежащие интервалу (–2; 12).

Удаление
одного или группы элементов из одномерного
массива

Удаление
одного элемента из одномерного массива
происходит по следующей схеме:

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

  2. все элементы, стоящие за удаляемым
    элементом сдвигаются на одну позицию
    влево;

  3. количество элементов уменьшается на
    единицу.

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

Пример
1

Дан
массив Х = (– 4 8 – 6 5 8 4).

Удалить
из массива элемент, стоящий на третьем
месте.

Фрагмент
программного кода, в котором удаляется
третий элемент массива Х, выглядит
следующим образом:

k
= 3

For
i
= k
To
N
– 1 ‘ начиная
с
k-го
и до предпоследнего элемента

X(i)
= X(i
+ 1) ‘ сдвигаем
элементы массива влево

Next
i

N
= N
– 1 ‘уменьшаем
длину массива на 1

Пример
2

Сформировать
одномерный массив из случайных чисел.
Удалить из массива минимальный и
максимальный элементы.

Программный
код

Sub
PR20()

Dim
x(40) As Integer

Dim
n As Integer

Dim
i As Integer

Dim
Min As Integer, Max As Integer

Dim
IMin As Integer, IMax As Integer

n
= Val(InputBox(«Введите
число элементов N»))

Label1.caption
= «Исходный
массив»

For
i = 1 To n

x(i)
= Int(Rnd * 100) – 50

ListBox1.AddItem
Str(x(i))

Next
i

‘ Поиск
минимального и максимального элементов

Min
= x(1): Max = x(1)

For
i = 2
To n

If
x(i)

If
x(i) > Max Then Max = x(i): IMax = i

Next
i

MsgBox()

‘ Удаление
минимального элемента

For
i = IMin To n – 1

x(i)
= x(i + 1)

Next
i

n
= n – 1

‘ если
максимальный элемент стоял правее
минимального, то он

‘ сдвигается
влево на одну позицию

If
IMax > IMin Then IMax = IMax – 1

‘ Удаление
максимального элемента

For
i = IMax To n – 1

x(i)
= x(i + 1)

Next
i

n
= n – 1

Label2.caption
= «Полученный массив»

For
i
= 1 To
n

ListBox2.AddItem
Str(x(i))

Next
i

End
Sub

Удаление из массива
группы элементов

Пример

Задан
одномерный массив 6 – 4 – 9 9 2 7
4 8. Удалить из него все элементы, кратные
3.

I
удаление 6 – 4 – 9 9 27 4 8

результат
– 4 – 9 9 27 4 8

II
удаление – 4 – 9 9 27 4 8

результат – 4 9 27 4 8

III
удаление – 4 9 27 4 8

результат – 4 27 4 8

IV удаление – 4 27 4
8

результат
– 4 4 8

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

i
= 1

While
i

If
x(i) Mod 3 = 0 Then

For
j = i To n – 1

x(j)
= x(j + 1)

Next
j

n
= n – 1

Else

i
= i + 1

End
If

Wend

Вставка одного элемента
в массив

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

Вставка группы
элементов в массив

Пример

В
одномерный массив перед каждым числом
0 вставить сумму всех элементов массива.

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

i
= 1

While
i

If
x(i) = 0 Then

For
j = n + 1 To i + 1 Step -1

x(j)
= x(j – 1)

Next
j

x(i)
= s

n
= n + 1

i
= i + 2

Else

i
= i + 1

End
If

Wend

Практическая
работа № 12

В 1

  1. Удалить
    последний четный элемент массива.

  2. Вставить
    2 перед каждым элементом большим
    заданного числа В.

В 2

  1. Удалить
    все элементы кратные 3.

  2. Вставить
    3 перед каждым элементом большим
    заданного числа В.

В 3

  1. Удалить
    все нечетные элементы.

  2. Вставить
    заданное число В после каждого элемента,
    меньшего В.

В 4

  1. Удалить
    первый элемент кратный 5.

  2. Вставить
    заданное число В, после первого
    отрицательного элемента массива.

В 5

  1. Удалить
    все отрицательные элементы массива.

  2. Вставить3
    после max и перед max
    элементом массива.

В 6

  1. Удалить
    первый отрицательный элемент массива.

  2. Вставить
    100 перед 5 элементом массива

В 7

  1. Удалить
    последний элементы массива больше
    заданного числа С.

  2. Вставить
    перед каждым отрицательным элементом
    массива заданное число В.

В 8

  1. Удалить
    все элементы массива, которые больше
    заданного числа.

  2. Вставить
    заданное число B, после
    первого четного числа в массиве.

В 9

  1. Удалить
    все четные элементы массива.

  2. Вставить
    перед последним отрицательным элементом
    массива число В.

В 10

  1. Удалить
    последний нечетный элемент массива.

  2. Вставить
    перед последним отрицательным элементом
    массива число В.

В 11

  1. Удалить
    все четные отрицательные элементы.

  2. Вставить
    число А, перед каждым отрицательным
    элементом кратным Д, а число В после
    каждого положительного элемента,
    кратного Д.

В 12

  1. Удалить
    первый положительный четный элемент.

  2. Вставить
    1 после всех элементов, больших P.

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

Главная

Новости

Опубликовано: 01. 09.2018

Вставка данных из Excel

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


Именованные диапазоны в Excel

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

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


Курсы программирования. Алгоритм №2. Удаление пробелов в конце строки

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

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (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

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

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

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

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

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

Исходники программ. Репетитор по программированию. Код для студентов


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


Любой студент-второкурсник знает:

  • Выделение часто повторяющегося действия в отдельную функцию в разы сокращает исходный код;
  • Использование параметров в этой функции делает ее более универсальной и гибкой;
  • Функции из одной области (допустим, графика или базы данных) целесообразно объединять в
    отдельный модуль и подключать его к новой программе в случае необходимости;
  • и т.д.



Продолжу на эту же тему:

  • Структуры и Классы это вообще клад, так как представляют собой концентрированное выражение знаний
    (метаданных и алгоритмов) из определенной области. Сторонние пакеты классов предоставляются в
    виде библиотек (например *.dll).;
  • Найти в нужный момент нужный класс это огромная удача. Иначе придется писать его самому, отлаживать, тестировать.
    Но, как говорится, «что Бог ни дает все к лучшему». В этом случае Вы становитесь автором и обладателем
    «сокровища». Сохраняйте и берегите его. В нужный момент, Вы обязательно вспомните, что в ваших запасах уже
    имеется что-то похожее и пригодное к использованию или доработке.


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


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


Я буду рад, если Вы найдете на этом сайте, что-то полезное, как «детали конструктора». Творите. Перерабатывайте.
Объединяйте и комбинируйте.



В крайнем случае, если цейтнот и времени не хватает катастрофически (а для студентов это очень характерно всегда не хватает
времени и денег), можно поручить сборку мне, т.к. составление пошаговых инструкций для компьютера на одном из языков:
C, C++, C#, Delphi, Visual Basic, Pascal, VBA — является достаточно специфическим видом деятельности. Чтобы им заниматься
— это надо любить.


А с недавнего времени, я добавил услугу Скайп-Консультирование! Это для тех, кто уже пишет код сам,
но вдруг уперся в стену на какой-то мелочи

Ведь Skype предоставляет возможности

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


И это очень эффективно!!!


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

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

А сейчас, ВНИМАНИЕ! Отличительная особенность моих услуг!


Если вы позвоните на указанный телефон, то Вам отвечу я.

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

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

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

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

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


VBA — Неровные массивы (массивы массивов)

Пример

Неровные массивы НЕ многомерные массивы

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

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

Создание массива с зазубринами

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

  Dim OuterArray () как вариант
Тусклые имена () как вариант
Тусклые числа () как вариант
'массивы объявлены как вариант, поэтому мы можем получить доступ к атрибутам любого типа данных для его элементов

Names = Array ("Person1", "Person2", "Person3")
Числа = Массив («001», «002», «003»)

OuterArray = массив (имена, числа)
'Непосредственное предоставление OuterArray массива, содержащего массивы имен и чисел внутри

Отлаживать.Печать OuterArray (0) (1)
Отладка. Печать OuterArray (1) (1)
'доступ к элементам внутри зазубрины, задавая координаты элемента
  

Динамическое создание и чтение массивов с зазубринами

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

  Имя - Телефон - Электронная почта - Номер клиента
Лицо1 - 153486231 - 1 @ СТЕК - 001
Person2 - 153486242 - 2 @ СТЕК - 002
Person3 - 153486253 - 3 @ СТЕК - 003
Person4 - 153486264 - 4 @ СТЕК - 004
Person5 - 153486275 - 5 @ СТЕК - 005
  

Мы динамически построим массив заголовков и массив клиентов, заголовок будет содержать заголовки столбцов, а массив клиентов будет содержать информацию о каждом клиенте / строке в виде массивов.

  Тусклые заголовки в качестве варианта
'заголовки массив с верхней частью паспорта клиента
    Для c = от 1 до 4
        Если IsEmpty (заголовки), то
            Заголовки ReDim (0)
            Заголовки (0) = Ячейки (1, c).  Значение
        Еще
            Заголовки ReDim Preserve (от 0 до UBound (заголовки) + 1)
            Заголовки (UBound (Заголовки)) = Ячейки (1, c). Значение
        Конец, если
    Следующий
    
Тусклые клиенты как вариант
'Массив клиентов будет содержать массивы значений клиентов
Dim Customer_Values ​​As Variant
'Customer_Values ​​будет массивом клиента в его элементах (Name-Phone-Email-CustNum).
    
    Для r = от 2 до 6
    'перебирать клиентов / строки
        Для c = от 1 до 4
        'перебирать значения / столбцы
            
            'построить массив, содержащий значения клиентов
            Если IsEmpty (Customer_Values), то
                ReDim Customer_Values ​​(0)
                Customer_Values ​​(0) = Ячейки (r, c).Ценить
            ElseIf Customer_Values ​​(0) = "" Тогда
                Customer_Values ​​(0) = Ячейки (r, c) .Значение
            Еще
                ReDim Preserve Customer_Values ​​(от 0 до UBound (Customer_Values) + 1)
                Customer_Values ​​(UBound (Customer_Values)) = Ячейки (r, c). Значение
            Конец, если
        Следующий
        
        'добавить массив customer_values ​​в массив Customers
        Если IsEmpty (клиенты), то
            Клиенты ReDim (0)
            Клиенты (0) = Customer_Values
        Еще
            ReDim Preserve клиентов (от 0 до UBound (клиентов) + 1)
            Клиенты (UBound (Клиенты)) = Customer_Values
        Конец, если
        
        'сбросить Custumer_Values, чтобы при необходимости перестроить новый массив
        ReDim Customer_Values ​​(0)
    Следующий

    Dim Main_Array (от 0 до 1) как вариант
    'основной массив будет содержать как заголовки, так и клиентов
    
    Main_Array (0) = Заголовки
    Main_Array (1) = Клиенты
  

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

Результатом приведенного выше фрагмента является зазубренный массив с двумя массивами, один из этих массивов с 4 элементами, 2 уровнями отступа, а другой сам является другим зазубренным массивом, содержащим 5 массивов по 4 элемента каждый и 3 уровня отступа, см. Структуру ниже :

  Main_Array (0) - Заголовки - Массив («Имя», «Телефон», «Электронная почта», «Номер клиента»)
          (1) - Клиенты (0) - Массив ("Person1", 153486231, "1 @ STACK", 001)
                Клиенты (1) - массив ("Person2", 153486242, "2 @ STACK", 002)
                ...
                Клиенты (4) - массив ("Person5", 153486275, "5 @ STACK", 005)
  

Чтобы получить доступ к информации, вы должны иметь в виду структуру созданного вами массива Jagged. В приведенном выше примере вы можете видеть, что основной массив содержит массив заголовков и массив массивов ( клиентов). ), следовательно, с разными способами доступа к элементам.

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

  Для n = 0 до UBound (Main_Array (1))
    'n для итерации от первого до последнего массива в Main_Array (1)
    
    Для j = 0 в UBound (Main_Array (1) (n))
        'j будет выполнять итерацию от первого до последнего элемента в каждом массиве Main_Array (1)
        
        Debug.Print Main_Array (0) (j) & ":" & Main_Array (1) (n) (j)
        'print Main_Array (0) (j), который является заголовком, и Main_Array (0) (n) (j), который является элементом в массиве клиентов
        'мы можем вызвать заголовок с помощью j, поскольку массив заголовков имеет ту же структуру, что и массив клиентов
    Следующий
Следующий
  

ПОМНИТЕ, чтобы отслеживать структуру вашего Jagged Array, в приведенном выше примере для доступа к имени клиента нужно обратиться к Main_Array -> Customers -> CustomerNumber -> Name , который является трехуровневым, чтобы вернуть "Person4" вам понадобится местоположение клиентов в Main_Array, затем местоположение клиента четыре в массиве Customers Jagged и, наконец, местоположение нужного вам элемента, в данном случае Main_Array (1) (3) (0) , который — это Main_Array (Customers) (CustomerNumber) (Name) .

Как мне настроить «зубчатый массив» в VBA?

Как мне настроить «зубчатый массив» в VBA? — Переполнение стека

Присоединяйтесь к Stack Overflow , чтобы учиться, делиться знаниями и строить свою карьеру.

Спросил

Просмотрено
45k раз

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

Как мне создать зубчатый массив, чтобы Kids (x) (y) … где x — количество детей в моем классе, а y — список игрушек, которые они указывают как свои любимые?

Джоэл Кохорн

3,7kk103103 золотых знака528528 серебряных знаков763763 бронзовых знака

Создан 24 фев.

фанфан

3,798211 золотых знаков5858 серебряных знаков8181 бронзовый знак

1

«Неровный массив» — это жаргонное обозначение массива массивов. Тип данных VBA Variant может содержать что угодно *, включая массив. Итак, вы создаете массив типа Variant и назначаете каждому из его элементов массив произвольной длины (т.е. не все они должны иметь одинаковую длину).

Вот пример:

  Dim nStudents As Long
Dim iStudent пока долго
Тусклые игрушки () как вариант
Dim nToys As Long
Уменьшить размер thisStudentsToys () как вариант

nStudents = 5 'или что угодно

ReDim toys (от 1 до nStudents) 'это будет ваш зазубренный массив

Для iStudent = 1 для nStudents
    'дать этому ученику случайное количество игрушек (например,грамм. до 10)
    nToys = Int ((10 * Rnd) + 1)
    ReDim thisStudentsToys (от 1 до nToys)

    'здесь идет код для заполнения thisStudentsToys ()
    'своими настоящими игрушками

    игрушки (iStudent) = thisStudentsToys
Следующий iStudent

Массив игрушек теперь зубчатый.

'Чтобы получить игрушку № 7 ученика №3:
Игрушки MsgBox (3) (7)
'выдаст ошибку, если у ученика №3 меньше 7 игрушек
  

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

Создан 24 фев.

1

Можно использовать коллекцию коллекций

  Общедоступный субтест ()

    Тусклый список как новая коллекция
    Dim i как целое число, j как целое число
    Тусклый элемент как коллекция
    Для i = от 1 до 10
        Установить элемент = Новая коллекция
        Для j = 1 К i
            предмет.Добавить "Малыш" и CStr (i) & "Игрушка" и CStr (j).
        Следующий j
        list.Add item
    Далее я

    Debug.Print «Ребенок 4, Игрушка 2 =» & list (4) (2)
Конец подписки
  

Что выводит Kid 4, Toy 2 = Kid4Toy2

Создан 24 фев.

Джон АлексиуДжон Алексиу

23.5k 66 золотых знаков6565 серебряных знаков119119 бронзовых знаков

2

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

  Подложка UntangleTheString ()

Dim sToys как строка
Dim aToys () как строка
Dim x As Long

sToys = "бейсбол | кукла | йойо"

aToys = Разделить (sToys, "|")

Для x = LBound (aToys) To UBound (aToys)
    Отлаживать.Распечатать игрушки (x)
Следующий

Конец подписки
  

Создан 26 фев.

Стив РиндсбергСтив Риндсберг

3,27011 золотой знак1111 серебряных знаков88 бронзовых знаков

Жан-Франсуа указал, что каждый элемент может быть массивом различной длины.Я бы добавил, что каждый элемент также может быть другого типа и не обязательно должен быть массивами. Например:

  Dim c как новая коллекция
Затемните a (от 1 до 5) как вариант

c. Добавить "а", "а"
c. Добавить "b", "b"
а (1) = 5
a (2) = Массив (2,3,4)
положим a (3) = c
a (4) = "abcd"
a (5) = Диапазон ("A1: A4"). Значение
  

Затем можно ссылаться на различные дочерние элементы в зависимости от неявного типа каждого из них:

а (2) (1) = 3

a (3) (1) = «a»

a (5) (2,1) = все, что находится в ячейке A2.

Создан 21 июл.

Разработчики Excel

2,67022 золотых знака1818 серебряных знаков3333 бронзовых знака

Вам не обязательно нужен массив с зазубринами для обработки вашего сценария, поскольку 2D-массив (r, c) также будет работать.По одной строке для каждого ребенка и по одному столбцу для каждого подарка. Размеры массива будут (количество детей, максимальное количество подарков), и это будет просто означать, что некоторые из слотов будут пустыми или 0 (в зависимости от вашего типа данных). Но, по крайней мере, таким образом вам не нужно будет переделывать массив каждый раз, когда вы добавляете подарок ребенку.

Создан 17 июн.

язык-vb

Stack Overflow лучше всего работает с включенным JavaScript

Ваша конфиденциальность

Нажимая «Принять все файлы cookie», вы соглашаетесь с тем, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в ​​отношении файлов cookie.

Принимать все файлы cookie

Настроить параметры

Можно ли напрямую объявлять массивы с зазубринами в Excel VBA?

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

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

Хорошо:

  • Простой синтаксис (только одна переменная)
  • Тип безопасности. Известно, что все элементы матрицы Integer должны быть Integer s.
  • Очень быстрый доступ к массиву

Плохое:

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

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

  Dim intMatrix (от 0 до 2, от 0 до 4) как целое число
  

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

  Dim intMatrix () As Integer 'Неинициализированный динамический массив
ReDim intMatrix (от 0 до 4, от 0 до 2) 'Инициализировать как матрицу
ReDim Preserve intMatrix (от 0 до 4, от 0 до 3) 'Добавить еще одну «строку» в матрицу, сохраняя существующие данные
  

Зубчатые массивы

Хорошо:

Плохо:

  • Вы теряете безопасность типов во время компиляции
  • Они немного сложны / запутаны из-за вложенной структуры
  • Изменение размера внутренних массивов неудобно и дорого

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

  Dim outer () As Variant 'Dynamic, поэтому можно добавлять новые внутренние массивы
Dim inner () As Integer 'Dynamic, чтобы можно было добавлять новые элементы

ReDim external (от 0 до 3)
ReDim внутренний (от 0 до 4)
внешний (2) = внутренний
  

Информация о типе утеряна во время компиляции

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

  Установить objWorksheet = outer (2) (3)
  

Хотя во время выполнения это вызовет ошибку, потому что внутренний массив по адресу external (2) содержит Integer , а не Worksheet объектов.

Неудобно изменить размер

Одним из преимуществ зубчатого массива является то, что внутренние массивы могут быть разного размера. Однако вы не можете напрямую изменить размер внутреннего массива. VBA просто не может справиться с синтаксисом; следующее не компилируется:

  ReDim Preserve внешний (2) (от 0 до 5)
  

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

  Dim tempInts () как целое число
tempInts = внешний (2)
ReDim Preserve tempInts (от 0 до 5)
external (2) = температура
  

Причина, по которой вам нужно переназначить tempInts обратно внешнему массиву , заключается в том, что массивы используют семантику по значению в VBA.Это означает, что когда вы назначаете массив переменной (например, tempInts = outer (2) , вы копируете весь массив. Это может быть очень дорого, если ваш массив длинный (скажем, несколько тысяч элементов), и даже дороже если ваш массив содержит строки, потому что каждая строка также должна быть скопирована.

Неровные коллекции

Хорошо:

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

Плохое:

  • Подобно зубчатым массивам, здесь нет безопасности типов

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

  Dim cAnimals в новой коллекции

'Давайте добавим статистику по Cheetah
Dim cheetah как новая коллекция

'Легко добавить внутренние коллекции к внешней коллекции. Также cCheetah ссылается на
'в тот же объект коллекции, что и cAnimals (1).
cAnimals.Add cCheetah

'Легко добавлять предметы во внутреннюю коллекцию.'Работа напрямую с коллекцией cCheetah:
Для каждого vMeasurment в GetMeasurements ("Cheetah")
    cCheetah.Add vMeasurement
Следующий

'Работа с той же коллекцией путем индексации во внешний объект
Для i = 1 To cAnimals.Count
    Для j = 1 To cAnimals (i) .Count
        cAnimals (i) (j) = cAnimals (i) (j) * dblNormalizingFactor
    Следующий
Следующий
  

Excel VBA Array — Полное руководство

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

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

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

Остальная часть сообщения представляет собой наиболее полное руководство по массиву VBA.

Ссылки по теме для массива VBA

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

Другие структуры данных в VBA:
Коллекция VBA — Хорошо, если вы хотите продолжать вставлять элементы при автоматическом изменении размера.
VBA ArrayList — у него больше функциональности, чем у Collection.
Словарь VBA — позволяет хранить пару ключ \ значение.Очень полезно во многих приложениях.

Руководство Microssoft для массивов VBA можно найти здесь.

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

Задача Статический массив Динамический массив
Объявить Dim arr (от 0 до 5) As Long Dim arr () As Long
Dim arr As Variant
Установить размер См.объявить выше ReDim arr (от 0 до 5) как вариант
Получить размер (количество элементов) См. Функцию ArraySize ниже. См. Функцию ArraySize ниже.
Увеличить размер (сохранить существующие данные) Только динамический ReDim Preserve arr (от 0 до 6)
Заданные значения arr (1) = 22 arr (1) = 22
Полученные значения total = arr (1) total = arr (1)
Первая позиция LBound (arr) LBound (arr)
Последняя позиция Убунт (обр.) Убунт (обр.)
Прочитать все элементы (1D) Для i = LBound (arr) To UBound (arr)
Next i
or
For i = LBound (arr, 1) To UBound (arr, 1)
Next i
Для i = LBound (arr) To UBound (arr)
Next i
or
For i = LBound (arr, 1) To UBound (arr, 1)
Next i
Прочитать все элементы (2D) Для i = LBound (arr, 1) To UBound (arr, 1)
Для j = LBound (arr, 2) To UBound (arr, 2)
Next j
Next i
Для i = LBound (arr, 1) To UBound (arr, 1)
Для j = LBound (arr, 2) To UBound (arr, 2)
Next j
Next i
Прочитать все элементы Уменьшить элемент как вариант
Для каждого элемента в arr
Следующий элемент
Уменьшить элемент как вариант
Для каждого элемента в arr
Следующий элемент
Передать в Sub Sub MySub (ByRef arr () As String) Sub MySub (ByRef arr () As String)
Возврат из функции Функция GetArray () As Long ()
Dim arr (от 0 до 5) As Long
GetArray = arr
End Function
Функция GetArray () As Long ()
Dim arr () As Long
GetArray = arr
Конечная функция
Получение от функции Только динамический Dim arr () As Long
Arr = GetArray ()
Стереть массив Стереть arr
* Сбрасывает все значения до значений по умолчанию
Стереть arr
* Удаляет массив
Строка в массив Только динамический Dim arr As Variant
arr = Split («Джеймс: Эрл: Джонс», «:»)
Массив в строку Dim sName As String
sName = Join (arr, «:»)
Dim sName As String
sName = Join (arr, «:»)
Заполнить значениями Только динамический Dim arr As Variant
arr = Array («John», «Hazel», «Fred»)
Диапазон до массива Только динамический Dim arr As Variant
arr = Range («A1: D2»)
Массив к диапазону То же, что и динамический Dim arr As Variant
Range («A5: D6») = arr

Загрузить исходный код и данные

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

Что такое массив VBA и зачем он вам нужен?

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

В VBA обычная переменная может хранить только одно значение за раз.

В следующем примере мы используем переменную для хранения оценок учащегося:

 'Одновременно может храниться только 1 значение
Тусклый студент1 пока
Студент1 = 55
 

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

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

Оценки учащихся

Мы собираемся прочитать эти отметки и записать их в Immediate Window.

Примечание: Функция Debug.Print записывает значения в непосредственное окно. Чтобы просмотреть это окно, выберите в меню View-> Immediate Window (сочетание клавиш Ctrl + G)

Как вы можете видеть в следующем примере, мы пишем один и тот же код пять раз — по одному для каждого студента:

 'https: // excelmacromastery.com /
Public Sub StudentMarks ()

    'Получите лист под названием «Отметки»
    Dim sh As Рабочий лист
    Установить sh = ThisWorkbook.Worksheets («Метки»)
    
    'Объявить переменную для каждого студента
    Тусклый студент1 пока
    Тусклый студент2 пока
    Тусклый студент3 пока
    Тусклый студент4 пока
    Тусклый студент5 пока

    'Прочитать оценки учеников из ячейки
    Student1 = sh.Range ("C" & 3). Значение
    Student2 = sh.Range ("C" & 4).Ценить
    Student3 = sh.Range ("C" & 5). Значение
    Student4 = sh.Range ("C" & 6). Значение
    Student5 = sh.Range ("C" & 7). Значение

    'Печать оценок учащихся
    Debug.Print "Студенческие оценки"
    Debug.Print Student1
    Debug.Print Student2
    Отладка. Распечатать Student3
    Отладка.  Распечатать Student4
    Debug.Print Student5

Конец подписки
 

Ниже приведен вывод из примера:

Выход

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

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

В следующем коде показан приведенный выше пример учащегося с использованием массива:

 'ExcelMacroMastery.com
Excel VBA Array – The Complete Guide
Автор: Пол Келли 'Описание: считывает метки в массив и записывает 'массив к непосредственному окну (Ctrl + G) 'ДЛЯ ЗАПУСКА: щелкните подменю и нажмите F5 Public Sub StudentMarksArr () 'Получите лист под названием «Отметки» Dim sh As Рабочий лист Установите sh = ThisWorkbook.Рабочие листы («Знаки») 'Объявить массив для выставления оценок для 5 студентов Уменьшить количество учащихся (от 1 до 5) до тех пор, пока 'Считать оценки учащихся из ячеек C3: C7 в массив 'Смещение подсчитывает строки из ячейки C2. например i = 1 - это C2 плюс 1 строка, которая является C3 'i = 2 - это C2 плюс 2 строки, что составляет C4 Тусклый я до тех пор, пока Для i = от 1 до 5 Студенты (i) = sh.Range ("C2"). Offset (i) .Value Далее я 'Печатать оценки учащихся из массива в окно немедленного доступа Отлаживать.Печать "Оценки учащихся" Для i = LBound (студенты) To UBound (студенты) Студенты Debug.Print (i) Далее я Конец подписки

Преимущество этого кода в том, что он будет работать для любого количества студентов. Если нам нужно изменить этот код для работы с 1000 студентами, нам нужно только изменить (1–5) на (1–1000) в объявлении. В предыдущем примере нам нужно было бы добавить примерно пять тысяч строк кода.

Давайте быстро сравним переменные и массивы. Сначала сравним декларацию:

 'переменная
        Тусклый студент, пока
        Тусклая страна как строка

        ' Множество
        Уменьшить количество учащихся (от 1 до 3), пока
        Тусклые страны (от 1 до 3) в виде строки
 

Далее мы сравниваем присвоение значения:

 'присвоить значение переменной
        Студент1 = .Cells (1, 1)

        'присвоить значение первому элементу в массиве
        Студенты (1) =.Ячейки (1, 1)
 

Наконец, мы посмотрим на запись значений:

 'Вывести значение переменной
        Debug.Print Student1

        'Вывести значение первого студента в массиве
        Студенты Debug.Print (1)
 

Как видите, использование переменных и массивов очень похоже.

Важен тот факт, что массивы используют индекс (также называемый индексом) для доступа к каждому элементу. Это означает, что мы можем легко получить доступ ко всем элементам в массиве с помощью цикла For Loop.

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

Два типа массивов VBA

Существует два типа массивов VBA:

  1. Статический — массив фиксированной длины.
  2. Dynamic (не путать с динамическим массивом Excel) — массив, длина которого задается во время выполнения.

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

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

Статический массив объявляется следующим образом:

 'https://excelmacromastery.com/
Публичная подпрограмма DecArrayStatic ()

    'Создать массив с местоположениями 0,1,2,3
    Dim arrMarks1 (от 0 до 3) до тех пор, пока

    'По умолчанию от 0 до 3, т. е. местоположения 0,1,2,3
    Dim arrMarks2 (3) На всю длину

    'Создать массив с локациями 1,2,3,4,5
    Dim arrMarks3 (от 1 до 5) по длине

    'Создать массив с местоположениями 2, 3, 4' Это редко используется
    Dim arrMarks4 (от 2 до 4) по длине

Конец подписки
 

Массив от 0 до 3

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

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

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

 'https: // excelmacromastery.com /
Публичная подпрограмма DecArrayDynamic ()

    'Объявить динамический массив
    Dim arrMarks () до тех пор, пока

    'Установите длину массива, когда будете готовы
    ReDim arrMarks (от 0 до 5)

Конец подписки
 

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

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

Присвоение значений массиву VBA

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

 'https://excelmacromastery. com/
Public Sub AssignValue ()

    'Объявить массив с местоположениями 0,1,2,3
    Dim arrMarks (от 0 до 3) до тех пор

    'Установить значение позиции 0
    arrMarks (0) = 5

    'Установите значение позиции 3
    arrMarks (3) = 46

    'Это ошибка, поскольку нет местоположения 4
    arrMarks (4) = 99

Конец подписки
 

Массив с присвоенными значениями

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

Получить длину массива VBA

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

 'https://excelmacromastery.com/
Функция ArrayLength (arr As Variant) Как долго

    При ошибке Goto eh
    
    'Цикл используется для многомерных массивов.Цикл завершится, когда
    Возникает ошибка «Индекс вне диапазона», т. Е. Больше нет измерений.
    Dim i As Long, длина As Long
    длина = 1
    
    'Цикл, пока больше не будет измерений
    Делай, пока правда
        я = я + 1
        'Если в массиве нет элементов, эта строка выдаст ошибку
        Длина = Длина * (UBound (arr, i) - LBound (arr, i) + 1)
        'Установите здесь ArrayLength, чтобы не возвращать 1 для пустого массива
        ArrayLength = Длина
    Петля

Сделанный:
    Функция выхода
а:
    Если Err.Number = 13 Then 'Ошибка несоответствия типа
        Err.Raise vbObjectError, "ArrayLength" _
            , «Аргумент, переданный функции ArrayLength, не является массивом».
    Конец, если
Конечная функция
 

Вы можете использовать это так:

 'Имя: TEST_ArrayLength
Автор: Пол Келли, ExcelMacroMastery.com
'Описание: тестирует функции ArrayLength и записывает
'результаты в Немедленное Окно (Ctrl + G)
Sub TEST_ArrayLength ()
    
    '0 товаров
    Dim arr1 () до тех пор, пока
    Отлаживать. Печать ArrayLength (arr1)
    
    '10 товаров
    Dim arr2 (от 0 до 9) до тех пор, пока
    Debug.Print ArrayLength (arr2)
    
    '18 товаров
    Dim arr3 (от 0 до 5, от 1 до 3) до тех пор, пока
    Debug.Print ArrayLength (arr3)
    
    'Вариант базы 0: 144 шт.
    Вариант базы 1:50 шт.
    Dim arr4 (1, 5, 5, 0 до 1) до тех пор, пока
    Debug.Print ArrayLength (arr4)
    
Конец подписки
 

Использование функций массива и разделения

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

 Dim arr1 как вариант
    arr1 = Массив («Апельсин», «Персик», «Груша»)

    Dim arr2 как вариант
    arr2 = массив (5, 6, 7, 8, 12)
 

Содержимое arr1 после использования функции массива

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

Функция Split используется для разделения строки на массив на основе разделителя. Разделитель — это такой символ, как запятая или пробел, разделяющий элементы.

Следующий код разделит строку на массив из трех элементов:

 Dim s As String
    s = "Красный, желтый, зеленый, синий"

    Dim arr () как строка
    arr = Разделить (s, ",")
 

Массив после использования Split

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

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

Использование цикла For Loop обеспечивает быстрый доступ ко всем элементам в массиве. Вот где становится очевидной мощь использования массивов. Мы можем читать массивы с десятью значениями или десятью тысячами значений, используя те же несколько строк кода. В VBA есть две функции: LBound и UBound. Эти функции возвращают наименьший и наибольший индекс в массиве. В массиве arrMarks (от 0 до 3) LBound вернет 0, а UBound вернет 3.

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

 'https://excelmacromastery.com/
Публичная подпрограмма ArrayLoops ()

    'Объявить массив
    Dim arrMarks (от 0 до 5) до тех пор, пока

    'Заполняем массив случайными числами
    Тусклый я до тех пор, пока
    Для i = LBound (arrMarks) To UBound (arrMarks)
        arrMarks (i) = 5 * Rnd
    Далее я

    'Распечатать значения в массиве
    Debug.Print «Местоположение», «Значение»
    Для i = LBound (arrMarks) To UBound (arrMarks)
        Отлаживать.Вывести i, arrMarks (i)
    Далее я

Конец подписки
 

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

Использование цикла For Each с массивом VBA

Вы можете использовать цикл For Each с массивами.Важно помнить, что это только для чтения. Это означает, что вы не можете изменить значение в массиве.

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

 За каждую отметку в arrMarks
        'Не изменит значение массива
        mark = 5 * Rnd
    Следующая отметка
 

Цикл For Each отлично подходит для чтения массива. Как мы увидим, лучше писать специально для двумерного массива.

 Тусклая метка как вариант
    Для каждой отметки в arrMarks
        Отладка. Печать
    Следующая отметка
 

Использование стирания с массивом VBA

Функция Erase может использоваться с массивами, но работает по-разному в зависимости от типа массива.

Для статического массива функция Erase сбрасывает все значения на значения по умолчанию. Если массив состоит из длинных целых чисел (например, типа Long), тогда все значения устанавливаются на ноль. Если массив состоит из строк, тогда для всех строк устанавливается значение «» и так далее.

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

Давайте посмотрим на пример статического массива. Этот пример аналогичен примеру ArrayLoops в последнем разделе с одним отличием — мы используем Erase после установки значений. Когда значение будет распечатано, все они будут нулевыми:

 'https://excelmacromastery.com/
Общедоступная подпрограмма EraseStatic ()

    'Объявить массив
    Dim arrMarks (от 0 до 3) до тех пор

    'Заполняем массив случайными числами
    Тусклый я до тех пор, пока
    Для i = LBound (arrMarks) To UBound (arrMarks)
        arrMarks (i) = 5 * Rnd
    Далее я

    'ВСЕ ЗНАЧЕНИЯ УСТАНОВЛЕНЫ НА НУЛЬ
    Стереть arrMarks

    'Распечатайте значения - теперь все нулевые
    Отлаживать.Вывести «Местоположение», «Значение»
    Для i = LBound (arrMarks) To UBound (arrMarks)
        Debug.Print i, arrMarks (i)
    Далее я

Конец подписки
 

Теперь мы попробуем тот же пример с динамиком. После того, как мы использовали Erase, все места в массиве были удалены. Нам нужно использовать ReDim, если мы хотим снова использовать массив.

Если мы попытаемся получить доступ к элементам этого массива, мы получим «Индекс вне диапазона» ошибка:

 'https: // excelmacromastery. com /
Общедоступная подпрограмма EraseDynamic ()

    'Объявить массив
    Dim arrMarks () до тех пор, пока
    ReDim arrMarks (от 0 до 3)

    'Заполняем массив случайными числами
    Тусклый я до тех пор, пока
    Для i = LBound (arrMarks) To UBound (arrMarks)
        arrMarks (i) = 5 * Rnd
    Далее я

    'arrMarks теперь освобожден. Нет местоположений.
    Стереть arrMarks

Конец подписки
 

Увеличение длины массива VBA

Если мы используем ReDim в существующем массиве, то массив и его содержимое будут удалены.

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

 'https://excelmacromastery.com/
Sub UsingRedim ()

    Dim arr () как строка
    
    'Установить массив в слоты от 0 до 2
    ReDim arr (от 0 до 2)
    arr (0) = "Яблоко"
    
    'Массив с яблоком теперь удален
    ReDim arr (от 0 до 3)

Конец подписки
 

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

Когда мы используем Redim Preserve , новый массив должен начинаться с того же начального измерения, например.

Мы не можем сохранить от (0 до 2) до (от 1 до 3) или до (от 2 до 10), поскольку это разные начальные размеры.

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

Затем мы используем Preserve , чтобы увеличить длину массива, чтобы не потерять исходное содержимое:

 'https: // excelmacromastery.com /
Sub UsingRedimPreserve ()

    Dim arr () как строка
    
    'Установить массив в слоты от 0 до 1
    ReDim arr (от 0 до 2)
    arr (0) = "Яблоко"
    arr (1) = "Апельсин"
    arr (2) = "Груша"
    
    'Сбросить длину и сохранить исходное содержимое
    ReDim Preserve arr (от 0 до 5)

Конец подписки
 

На скриншотах ниже видно, что исходное содержимое массива было «сохранено».

Перед ReDim Preserve

После ReDim Preserve

Предупреждение: В большинстве случаев вам не нужно изменять размер массива, как мы делали в этом разделе.Если вы изменяете размер массива несколько раз, вы можете рассмотреть возможность использования Collection.

Использование сохранения с двумерными массивами

Preserve работает только с верхней границей массива.

Например, если у вас есть двумерный массив, вы можете сохранить только второе измерение, как показано в этом примере:

 'https://excelmacromastery.com/
Sub Preserve2D ()

    Dim arr () до тех пор, пока
    
    'Установить начальную длину
    ReDim arr (от 1 до 2, от 1 до 5)
    
    'Измените длину верхнего измерения
    ReDim Preserve arr (от 1 до 2, от 1 до 10)

Конец подписки
 

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

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

.

 'https://excelmacromastery.com/
Sub Preserve2DError ()

    Dim arr () до тех пор, пока
    
    'Установить начальную длину
    ReDim arr (от 1 до 2, от 1 до 5)
    
    Ошибка "Индекс вне допустимого диапазона"
    ReDim Preserve arr (от 1 до 5, от 1 до 5)

Конец подписки
 

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

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

 'https://excelmacromastery.com/
Sub Preserve2DRange ()

    Dim arr как вариант
    
    'Присвойте диапазон массиву
    arr = Sheet1.Range ("A1: A5"). Значение
    
    'Preserve будет работать только с верхней границей
    ReDim Preserve arr (от 1 до 5, от 1 до 7)

Конец подписки
 

Сортировка массива VBA

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

Приведенную ниже функцию QuickSort можно использовать для сортировки массива.

 'https://excelmacromastery.com/
Sub QuickSort (arr As Variant, first as long, last as long)
  
  Dim vCentreVal как вариант, vTemp как вариант
  
  Dim lTempLow As Long
  Dim lTempHi As Long
  lTempLow = первый
  lTempHi = последний
  
  vCentreVal = arr ((первый + последний) \ 2)
  Делать пока lTempLow <= lTempHi
  
    Do While arr (lTempLow)  сначала
      lTempHi = lTempHi - 1
    Петля
    
    Если lTempLow <= lTempHi Тогда
    
        'Поменять местами значения
        vTemp = arr (lTempLow)

        arr (lTempLow) = arr (lTempHi)
        arr (lTempHi) = vTemp
      
        'Перейти к следующим позициям
        lTempLow = lTempLow + 1
        lTempHi = lTempHi - 1
      
    Конец, если
    
  Петля
  
  Если first 

Эту функцию можно использовать так:

 'https: // excelmacromastery.com /
Sub TestSort ()

    'Создать временный массив
    Dim arr () как вариант
    arr = Array («Банан», «Дыня», «Персик», «Слива», «Яблоко»)
  
    'Сортировать массив
    QuickSort обр., LBound (обр.), UBound (обр.)

    'Распечатать arr в немедленное окно (Ctrl + G)
    Тусклый я до тех пор, пока
    Для i = LBound (arr) To UBound (arr)
        Отладка.Печать arr (i)
    Далее я

Конец подписки
 

Передача массива VBA в Sub

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

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

Примечание: Когда вы используете массив в качестве параметра, он не может использовать ByVal, он должен использовать ByRef. Вы можете передать массив с помощью ByVal, сделав параметр вариантом.

 'https://excelmacromastery.com/
'Передает массив функции
Публичный Sub PassToProc ()
    Dim arr (от 0 до 5) как строка
    'Передаем массив в функцию
    UseArray arr
Конец подписки

Открытая функция UseArray (ByRef arr () As String)
    'Использовать массив
    Отлаживать.Распечатать UBound (обр.)
Конечная функция
 

Возврат массива VBA из функции

Важно помнить следующее. Если вы хотите изменить существующий массив в процедуре, вы должны передать его как параметр с помощью ByRef (см. Последний раздел). Вам не нужно возвращать массив из процедуры.

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

Следующие примеры показывают это

 'https://excelmacromastery.com/
Public Sub TestArray ()

    'Объявить динамический массив - не выделен
    Dim arr () как строка
    'Вернуть новый массив
    arr = GetArray

Конец подписки

Открытая функция GetArray () As String ()

    'Создать и выделить новый массив
    Dim arr (от 0 до 5) как строка
    'Возвращаемый массив
    GetArray = arr

Конечная функция
 

Использование двумерного массива VBA

Массивы, которые мы рассматривали до сих пор, были одномерными массивами.Это означает, что массивы представляют собой один список элементов.

Двумерный массив - это, по сути, список списков. Если вы думаете об одной строке электронной таблицы как об одном измерении, тогда более одного столбца будут двухмерными. Фактически электронная таблица - это эквивалент двумерного массива. Он имеет два измерения - строки и столбцы.

Следует отметить одну небольшую вещь: Excel обрабатывает одномерный массив как строку, если вы записываете его в электронную таблицу. Другими словами, массив arr (от 1 до 5) эквивалентен arr (от 1 до 1, 1 до 5) при записи значений в электронную таблицу.

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

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

Для второго набора данных (двумерного) вам нужно указать строку И столбец. Таким образом, вы можете думать об одномерном как о нескольких столбцах и одной строке, а о двумерном - как о нескольких строках и нескольких столбцах.

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

Вы объявляете двумерный массив следующим образом:

 Dim ArrayMarks (от 0 до 2,0 до 3) по всей длине
 

В следующем примере создается случайное значение для каждого элемента в массиве, и эти значения выводятся в окно Immediate Window:

 'https: // excelmacromastery.com /
Public Sub TwoDimArray ()

    'Объявить двумерный массив
    Dim arrMarks (от 0 до 3, от 0 до 2) как строка

    'Заполните массив текстом, состоящим из значений i и j
    Dim i до тех пор, j до тех пор
    Для i = LBound (arrMarks) To UBound (arrMarks)
        Для j = LBound (arrMarks, 2) To UBound (arrMarks, 2)
            arrMarks (i, j) = CStr (i) & ":" & CStr (j)
        Следующий j
    Далее я

    'Распечатать значения в массиве в Immediate Window
    Отлаживать.Выведите «i», «j», «Value»
    Для i = LBound (arrMarks) To UBound (arrMarks)
        Для j = LBound (arrMarks, 2) To UBound (arrMarks, 2)
            Отладка.  Печать i, j, arrMarks (i, j)
        Следующий j
    Далее я

Конец подписки
 

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

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

Как работает этот макрос:

  • Входит в цикл i
  • i установлен на 0
  • входит в j петлю
  • j устанавливается на 0
  • j устанавливается на 1
  • j установлено на 2
  • Выход j петля
  • i установлен на 1
  • j устанавливается на 0
  • j устанавливается на 1
  • j установлено на 2
  • И так до i = 3 и j = 2

Вы можете заметить, что LBound и UBound имеют второй аргумент со значением 2 .Это указывает, что это верхняя или нижняя граница второго измерения. Это начальное и конечное местоположение для j . Значение по умолчанию 1, поэтому нам не нужно указывать его для цикла и .

Использование цикла For Each

Использование For Each удобнее при чтении из массива.

Давайте возьмем приведенный выше код, который записывает двумерный массив

 'Для использования цикла For требуется два цикла
    Отлаживать.Выведите «i», «j», «Value»
    Для i = LBound (arrMarks) To UBound (arrMarks)
        Для j = LBound (arrMarks, 2) To UBound (arrMarks, 2)
            Отладка. Печать i, j, arrMarks (i, j)
        Следующий j
    Далее я
 

Теперь давайте перепишем его, используя цикл For each. Как видите, нам нужен только один цикл, поэтому писать намного проще:

 'Для использования For Each требуется только один цикл
    Debug. Print «Значение»
    Тусклый знак как вариант
    Для каждой отметки в arrMarks
        Отлаживать.Отметка для печати
    Следующая отметка
 

Использование цикла For Each дает нам массив только в одном порядке - от LBound до UBound. В большинстве случаев это все, что вам нужно.

Чтение из диапазона в массив VBA

Если вы читали мой предыдущий пост о ячейках и диапазонах, то вы знаете, что VBA имеет чрезвычайно эффективный способ чтения из диапазона ячеек в массив и наоборот.

 'https://excelmacromastery.com/
Общедоступная подпрограмма ReadToArray ()

    'Объявить динамический массив
    Dim StudentMarks как вариант

    'Считать значения в массив из первой строки
    StudentMarks = Range ("A1: Z1").Ценить

    'Запишите значения обратно в третью строку
    Диапазон ("A3: Z3"). Значение = StudentMarks

Конец подписки
 

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

В следующем примере будут считываться данные об учащихся ниже из C3: E6 Листа 1 и выводиться на печать в окне Immediate Window:

.

 'https://excelmacromastery.com/
Общедоступная подпрограмма ReadAndDisplay ()

    'Получить диапазон
    Dim rg As Range
    Установите rg = ThisWorkbook.Листы («Лист1»). Диапазон («C3: E6»)

    'Создать динамический массив
    Dim StudentMarks как вариант

    'Считать значения в массив из листа1
    StudentMarks = rg.Value

    'Распечатать значения массива
    Debug.Print «i», «j», «Value»
    Dim i до тех пор, j до тех пор
    Для i = LBound (StudentMarks) To UBound (StudentMarks)
        Для j = LBound (StudentMarks, 2) To UBound (StudentMarks, 2)
            Отладка: печать i, j, StudentMarks (i, j)
        Следующий j
    Далее я

Конец подписки
 

Пример данных учащихся

Вывод данных выборки

Как видите, первое измерение (доступное с помощью i ) массива - это строка, а второе - столбец. Чтобы продемонстрировать это, взгляните на значение 44 в E4 выборки данных. Это значение находится в строке 2 столбца 3 наших данных. Вы можете видеть, что 44 хранится в массиве по адресу StudentMarks (2,3) .

Подробнее об использовании массивов с диапазонами можно узнать из этого видео на YouTube.

Как заставить ваши макросы работать со сверхвысокой скоростью

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

.

Обновление значений в массивах происходит экспоненциально быстрее, чем обновление значений в ячейках.

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

1. Скопируйте данные из ячеек в массив.
2. Измените данные в массиве.
3. Скопируйте обновленные данные из массива обратно в ячейки.

Например, следующий код будет намного быстрее, чем код под ним:

 'https://excelmacromastery.com/
Общедоступная подпрограмма ReadToArray ()

    'Считать значения в массив из первой строки
    Dim StudentMarks как вариант
    StudentMarks = Range ("A1: Z20000"). Значение

    Тусклый я до тех пор, пока
    Для i = LBound (StudentMarks) To UBound (StudentMarks)
        'Обновить отметки здесь
        StudentMarks (i, 1) = StudentMarks (i, 1) * 2
        '...
    Далее я

    'Запишите новые значения обратно в рабочий лист
    Диапазон ("A1: Z20000"). Значение = StudentMarks

Конец подписки
 

 'https://excelmacromastery.com/
Sub UsingCellsToUpdate ()
    
    Dim c как вариант
    Для каждого c в диапазоне ("A1: Z20000")
        c.Value = 'Обновите значения здесь
    Следующий c
    
Конец подписки
 

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

 'Назначение - это быстрее
Диапазон ("A1: A10"). Значение = диапазон ("B1: B10"). Значение

'Копировать и вставить - это медленнее
Диапазон ("B1: B1"). Место назначения копирования: = Диапазон ("A1: A10")
 

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

«Несколько моих проектов превратились из почти невозможных и долгих в слишком простые, а время выполнения сократилось с 10: 1». - датчанин

«Один отчет, который я написал, занял почти 3 часа при прямом доступе к ячейкам - 5 минут с массивами» - Джим

Вы можете увидеть больше о скорости массивов по сравнению с другими методами в этом видео на YouTube.

Чтобы увидеть сравнение между Find, Match и Arrays, стоит прочитать этот пост Чарльза Уильямса.

Заключение

Ниже приводится краткое изложение основных моментов этого сообщения

  1. Массивы - это эффективный способ хранения списка элементов одного типа.
  2. Вы можете получить доступ к элементу массива напрямую, используя номер местоположения, который известен как индекс или индекс .
  3. Распространенная ошибка «Индекс вне диапазона » вызвана доступом к несуществующему местоположению.
  4. Существует два типа массивов: Статический и Динамический .
  5. Статический используется, когда длина массива всегда одинакова.
  6. Динамические массивы позволяют определять длину массива во время выполнения.
  7. LBound и UBound обеспечивают безопасный способ поиска наименьших и наибольших индексов массива.
  8. Базовый массив одномерный . Вы также можете иметь многомерные массивы.
  9. Вы можете передать массив только процедуре, используя ByRef . Вы делаете это так: ByRef arr () as long.
  10. Вы можете вернуть массив из функции, но массив, которому он назначен, не должен быть выделен в данный момент.
  11. Рабочий лист со своими строками и столбцами по сути представляет собой двумерный массив .
  12. Вы можете напрямую прочитать из диапазона рабочего листа в двумерный массив всего за одну строку кода.
  13. Вы также можете записать данные из двумерного массива в диапазон всего за одну строку кода.

Что дальше?

Бесплатное руководство по VBA Если вы новичок в VBA или хотите отточить свои существующие навыки VBA, почему бы не попробовать The Ultimate VBA Tutorial.

Связанное обучение: Получите полный доступ к обучающим вебинарам по Excel VBA.

( ПРИМЕЧАНИЕ: Планируете создание приложения VBA или управление им? Узнайте, как создать 10 приложений Excel VBA с нуля.)

массивов VBA - Excel вне сети

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

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

Загрузите файл примера

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

Загрузите файл: 0017 VBA Arrays.zip

Что такое массив и когда его использовать?

Массив - это список переменных одного типа. Например, список названий поставщиков может быть массивом.

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

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

 Sub ListSuppliers ()

'Создайте переменные
Тусклый поставщик1 как строка
Тусклый поставщик2 как строка
Тусклый поставщик3 как строка
Тусклый поставщик4 в виде строки
Тусклый поставщик5 как строка

'Присвойте значения поставщикам
Поставщик1 = ActiveSheet.Диапазон ("A2"). Смещение (0, 0). Значение2
Supplier2 = ActiveSheet.Range ("A2"). Offset (1, 0) .Value2
Supplier3 = ActiveSheet.Range ("A2"). Offset (2, 0) .Value2
Supplier4 = ActiveSheet.Range ("A2"). Offset (3, 0) .Value2
Supplier5 = ActiveSheet.Range ("A2"). Offset (4, 0) .Value2

Конец Sub 

Это не так уж плохо, правда? Теперь представьте, что нам нужно перечислить 1000 поставщиков или 10 000 поставщиков; это будет очень скучный день программирования. Если, конечно, мы не используем массив.

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

Посмотрите на код ниже; он создает массив для хранения 10 000 поставщиков, заполняемый из 10 000 ячеек в столбце A. На данном этапе вам не нужно понимать это; вместо этого просто впечатляйтесь тем, насколько он аккуратный и аккуратный. Трудно поверить, что массив VBA, содержащий список из 10 000 элементов, требует меньше кода, чем список из пяти переменных.

 Sub ListSuppliersArray ()

Поставщики тусклых изображений (от 1 до 10000) в виде строки
Тусклый я до тех пор, пока

Для i = LBound (Поставщики) To UBound (Поставщики)

    Поставщики (i) = ActiveSheet.Range ("A2"). Offset (i - 1, 0) .Value2

Далее я

End Sub 

При использовании VBA выше не имеет значения, есть ли 1, 20, 50, 1000 или 10 000 элементов, код будет той же длины. В этом преимущество массивов; нам не нужно писать один и тот же код снова и снова. Вместо этого мы можем написать один фрагмент кода, который добавит все элементы в массив.

Но это еще не все. Если присваиваемые значения находятся в непрерывном диапазоне, мы можем сократить код до нескольких строк. Посмотрите на макрос ниже; диапазон из 10 000 ячеек назначается типу переменной Variant, который автоматически создает массив из 10 000 элементов (цикл не требуется). Удивительные вещи, правда?

 Sub ListSuppliersArray ()

Поставщики тусклого света в качестве варианта

Поставщики = ActiveSheet.Range ("A2: A10001"). Значение2

End Sub 

Хорошо, теперь мы понимаем преимущества массивов VBA, давайте узнаем, как их использовать.

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

Массивы бывают двух видов:

  • Статический - массив с фиксированным числом элементов
  • Динамический - массив, количество элементов которого определяется при запуске макроса.

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

Объявление массива как переменной

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

Объявить одну переменную

 'Объявить строку как одну переменную
Dim myVariable As String 

Объявить переменную массива

 'Объявить строку как массив
Dim myArray (от 1 до 5) As String 

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

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

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

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

 Тусклый массив AsVariant As Variant
arrayAsVariant = Array («Alpha», «Bravo», «Charlie») 

Создать статический массив

Следующий макрос создает статический массив из 5 элементов (1, 2, 3, 4 и 5).

 Подложка CreateStaticArray ()

'Создайте статический массив из 5 элементов (1, 2, 3, 4, 5)
Dim arr (от 1 до 5) по длине

End Sub 

По умолчанию массивы имеют основание 0, что означает, что они начинают отсчет с 0, а не с 1. Следующий макрос создает статический массив из 6 элементов (0, 1, 2, 3, 4, 5). Обратите внимание, что массив создается с 5 в круглых скобках, но из-за базы 0 фактически создается 6 элементов.

 Подложка CreateStaticArrayStartingAtZero ()

'Создайте статический массив из 6 элементов (0, 1, 2, 3, 4, 5)
Dim arr (5) По длине

End Sub 

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

 Option Base 1 

Создание статического двухмерного массива

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

 Sub Create2DimensionStaticArray ()

Dim arr (от 1 до 3, от 1 до 3) как строка

arr (1, 1) = "Альфа"
arr (1, 2) = "Яблоко"
arr (1, 3) = "Муравей"
arr (2, 1) = "Браво"
arr (2, 2) = "Мяч"
arr (2, 3) = "Летучая мышь"
arr (1, 1) = "Чарли"
arr (2, 2) = "Банка"
arr (3, 3) = "Кот"

End Sub 

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

Создание динамического массива

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

ПРИМЕЧАНИЕ. Термин «динамический массив» в Excel и VBA отличается; это совершенно разные методологии.

Следующий макрос изначально создает динамический массив без размера.Затем, позже в макросе, размер массива изменяется с использованием ReDim , чтобы создать 5 элементов, начиная с 1.

 Sub CreateDynamicArray ()

'Создать массив
Dim arr () до тех пор, пока

'Измените размер массива позже в макросе
ReDim arr (от 1 до 5)

End Sub 

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

Ячейки индекса

Каждый элемент массива имеет номер индекса (т. Е. Позицию в массиве).

Индекс первого элемента

Следующий макрос отображает порядковый номер первого элемента в массиве.

 Sub GetIndexOfFirstElement ()

'Создать массив
Dim arr как вариант
arr = Array («Альфа», «Браво», «Чарли»)

'Получить порядковый номер первого элемента
MsgBox LBound (обр.)

End Sub 

LBound () - это функция, которая возвращает самый нижний элемент в массиве.

Индекс последнего элемента

Следующий макрос отображает порядковый номер последнего элемента в массиве.

 Sub GetIndexOfLastElement ()

'Создать массив
Dim arr как вариант
arr = Array («Альфа», «Браво», «Чарли»)

'Получить порядковый номер последнего элемента элемента
MsgBox UBound (обр.)

Конец подписки
 

UBound () - это функция, которая возвращает самый высокий элемент в массиве.

Присвоение значений массиву

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

Присваивать значения элементам по отдельности

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

 Sub AssignFixedValuesToArray ()

Dim arr (от 1 до 5) как строка

arr (1) = "Альфа"
arr (2) = "Браво"
arr (3) = "Чарли"
arr (4) = "Дельта"
arr (5) = "Эхо"

End Sub 

сообщает об этом adAssign значения элементам со списком массивов

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

 Sub AssignValuesFromListToArray ()

'Тип должен быть Variant, чтобы метод работал
Dim arr как вариант
arr = Array («Альфа», «Браво», «Чарли»)

End Sub 

Команда Array () - это короткий способ добавления значений в массив.

Присваивает значения элементам со строкой

Следующий макрос разбивает строку на массив.

 Подраздел SplitStringIntoArray ()

Dim arr как вариант
Dim myString As String

'Создать список с общим разделителем между каждым элементом
myString = "Альфа, Браво, Чарли, Дельта, Эхо"

'Превратить список в массив
arr = Разделить (myString, ",")

End Sub 

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

Следующий макрос создает двумерный массив непосредственно из диапазона.

 Sub ReadRangeToArray ()

Dim arr как вариант
arr = ActiveSheet.Range ("A1: C3"). Значение2

End Sub 

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

Преобразование массивов в строку и диапазоны

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

Преобразовать массив в строку

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

 Sub JoinArrayIntoString ()

Dim arr как вариант
Dim connectedString As String

'Создать массив
arr = Array («Альфа», «Браво», «Чарли»)

'Превратить массив в строку, каждый элемент отделяется запятой
connectedString = Присоединиться (arr, ",")

End Sub 

Преобразовать массив в диапазон

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

 Дополнительный WriteArrayToRange ()

Dim arr как вариант
arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

'Записать массив по столбцам
ActiveSheet.Range ("D1: h2") = arr

'Альтернатива, записать массив по строкам
'ActiveSheet.Range ("D1: D5") = Application.Transpose (arr)

End Sub 

Цикл по каждому элементу в массиве

Существует два способа циклического просмотра элементов массива:

  • Цикл For - Использование функций LBound и UBound для определения количества циклов
  • For Each цикл - Проходит через каждый элемент в массиве

ПРИМЕЧАНИЕ. - Цикл For Each может только читать элементы в массиве; его нельзя использовать для изменения значений, присвоенных элементам.

Цикл For: одномерный массив

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

 Sub ForLoopThroughArray ()

Dim arr как вариант
Тусклый я до тех пор, пока

arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

'Цикл от элементов LowerBound к UpperBound в массиве
Для i = LBound (arr) To UBound (arr)

    MsgBox arr (i)

Далее я

End Sub 

Цикл For: многомерный массив

Цикл For также можно использовать для многомерных массивов, как показано в приведенном ниже коде.

 Подложка ForLoopThrough3DimensionArray ()

Dim arr (от 1 до 3, от 1 до 3) как строка
Тусклый я до тех пор, пока
Dim j As Long

arr (1, 1) = "Альфа"
arr (1, 2) = "Яблоко"
arr (1, 3) = "Муравей"
arr (2, 1) = "Браво"
arr (2, 2) = "Мяч"
arr (2, 3) = "Летучая мышь"
arr (3, 1) = "Чарли"
arr (3, 2) = "Банка"
arr (3, 3) = "Кот"

Для i = LBound (arr) To UBound (arr)

    Для j = LBound (arr, 2) To UBound (arr, 2)

        MsgBox arr (i, j)

    Следующий j

Далее я

End Sub 

For Each цикл: одномерный массив

Цикл For Each работает с одномерным или многомерным массивом.Однако он может только читать данные из массива, он не может присваивать значения массиву.

 Sub ForEachLoopThroughArray ()

Dim arr как вариант
Dim arrElement как вариант

arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

'Перебирать массив с использованием метода For Each
Для каждого arrElement In arr

    MsgBox arrElement

Следующий arrElement

End Sub 

For Each цикл: многомерный массив

Пример ниже показывает, что цикл For Each идентичен как для одномерных, так и для многомерных массивов.

 Sub ForEachLoopThrough3DimensionArray ()

Dim arr (от 1 до 3, от 1 до 3) как строка
Dim arrElement как вариант

arr (1, 1) = "Альфа"
arr (1, 2) = "Яблоко"
arr (1, 3) = "Муравей"
arr (2, 1) = "Браво"
arr (2, 2) = "Мяч"
arr (2, 3) = "Летучая мышь"
arr (3, 1) = "Чарли"
arr (3, 2) = "Банка"
arr (3, 3) = "Кот"

'Проходить через массив
Для каждого arrElement In arr

    MsgBox arrElement

Следующий arrElement

End Sub 

Генерируйте точный код VBA за секунды с помощью AutoMacro

AutoMacro - это мощный генератор кода VBA, который поставляется с обширной библиотекой кода и множеством других инструментов и утилит для экономии времени.

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

Проверяем, есть ли значение в массиве

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

Результатом функции может быть:

  • True = искомое значение находится в массиве
  • False = искомое значение отсутствует в массиве

Функция принимает два аргумента (1) массив и (2 ) значение, которое нужно найти.

 Функция IsValueInArray (arr As Variant, find As Variant) As Boolean

Dim arrElement как вариант

'Проходить через массив
Для каждого arrElement In arr

    Если arrElement = find, то
        IsValueInArray = True
        Функция выхода
    Конец, если

Следующий arrElement

IsValueInArray = False

Завершение функции 

Ниже приведен пример того, как вызвать функцию, указанную выше; он сообщает функции, что нужно искать строку «Bravo» в массиве. Возвращаемый результат - Истина, если найден, или Ложь, если нет.

 Sub UseFunctionValueInArray ()

Dim arr как вариант
Dim arrElement как вариант

arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

MsgBox IsValueInArray (arr, «Браво»)

End Sub 

Найдите индекс элемента в массиве

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

Результатом функции может быть:

  • Возвращенное число = Позиция индекса искомого значения
  • False = искомое значение не найден

Функция принимает два аргумента: значение для поиска и массив для поиска.

 Функция PositionInArray (arr As Variant, find As Variant) As Variant

Тусклый я до тех пор, пока

Для i = LBound (arr) To UBound (arr)

    Если arr (i) = find, то

        PositionInArray = i
        Функция выхода

    Конец, если

Далее я

PositionInArray = False

Конечная функция 

Ниже показано, как использовать указанную выше функцию; если строка «Bravo» найдена в массиве, она вернет позицию индекса или False, если не найдена.

 Sub UseFunctionPositionInArray ()

Dim arr как вариант
Dim arrElement как вариант

arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

MsgBox PositionInArray (arr, "Браво")

End Sub 

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

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

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

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

Изменение размера и пустые значения

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

 Sub ResizeArraySize ()

Dim arr как вариант
Dim arrElement как вариант

arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

'Массив изменится, потеряв все предыдущие значения
ReDim arr (от 0 до 5)

'Перебирать массив с использованием метода For Each - все элементы пусты
Для каждого arrElement In arr

    MsgBox arrElement

Следующий arrElement

End Sub 

Изменить размер массива и сохранить существующие значения

Следующий макрос создает, а затем изменяет размер массива с помощью ReDim Preserve .Как показывает цикл For Each, при использовании ReDim Preserve значения сохраняются.

 Sub ResizeArraySizeKeepValues ​​()

Dim arr как вариант
Dim arrElement как вариант

arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

'Массив изменится, потеряв все предыдущие значения
ReDim Preserve arr (от 0 до 5)

'Добавить дополнительное значение в массив
arr (5) = "Фокстрот"

'Перебирать массив с использованием метода For Each - все элементы пусты
Для каждого arrElement In arr

    MsgBox arrElement

Следующий arrElement

End Sub 

Порядок сортировки массива

Следующая функция сортирует массив в алфавитном порядке.Функция принимает единственный аргумент - сортируемый массив.

 Функция SortingArrayBubbleSort (arr как вариант)

Тусклый я до тех пор, пока
Dim j As Long
Dim temp как вариант

Для i = LBound (arr) To UBound (arr) - 1

    Для j = i + 1 To UBound (обр.)

        Если arr (i)> arr (j) Тогда

            temp = arr (j)
            arr (j) = arr (i)
            arr (i) = temp

        Конец, если

    Следующий j

Далее я

SortingArrayBubbleSort = arr

Завершение функции 

Ниже приведен пример использования указанной выше функции.

 Sub CallBubbleSort ()

Dim arr как вариант
arr = Array («Чарли», «Дельта», «Браво», «Эхо», «Альфа»)

arr = SortingArrayBubbleSort (обр)

End Sub 

Обратный порядок массива

Функция ниже меняет порядок массива на обратный. Функция принимает имя массива в качестве единственного аргумента.

 Функция ReverseArray (arr как вариант)

Dim temp как вариант
Тусклый я до тех пор, пока
Dim arrSize As Long
Dim arrMid As Long

arrSize = UBound (обр)
arrMid = (UBound (arr) - LBound (arr)) \ 2 + LBound (arr)

Для i = LBound (arr) To arrMid

    temp = arr (размер arr)
    arr (размер arr) = arr (i)
    arr (i) = temp
    arrSize = arrSize - 1

Далее я

ReverseArray = arr

Завершение функции 

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

 Sub CallReverseArray ()

Dim arr как вариант
arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

обр = ReverseArray (обр)

End Sub 

Фильтрация массива

Наряду с LBound, UBound, Split и Join другой полезной встроенной функцией является Filter.

Функция Filter возвращает массив, который включает только элементы, содержащие подстроку. В приведенном ниже примере массив filterArr включает только элементы, содержащие букву «o»,

 Sub FilterArray ()

Dim arr как вариант
Dim filterArr как вариант
Dim arrElement как вариант

arr = Array («Альфа», «Браво», «Чарли», «Дельта», «Эхо»)

'Фильтр массива для любых элементов с буквой «о»
filterArr = Фильтр (обр., "о")

'Прокрутите отфильтрованный массив
Для каждого элемента arrElement в filterArr

    MsgBox arrElement

Следующий arrElement

End Sub 

Функция Filter имеет 4 аргумента:

 Filter (SourceArray, Match, [Include], [CompareType]) 
  • SourceArray - исходный массив
  • Match - подстрока для соответствия
  • Include (по умолчанию True если аргумент исключен)
    • True = включить сопоставленные элементы
    • False = исключить сопоставленные элементы
  • CompareType Include (по умолчанию 0, если аргумент исключен):
    • 0 = vbBinaryCompare - совпадение чувствительно к регистру
    • 1 = vbTextCompare - совпадение не чувствительно к регистру

Заключение

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

Не забудьте:

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

Вам нужна помощь в адаптации этого к вашим потребностям?

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

Но, если вы все еще боретесь, вам следует:

  1. Прочитать другие блоги или посмотреть видео на YouTube на ту же тему. Вы получите гораздо больше пользы, открыв свои собственные решения.
  2. Спросите «Excel Ninja» в своем офисе. Удивительно то, что знают другие люди.
  3. Задайте вопрос на форуме, например в Mr Excel, или в сообществе ответов Microsoft.Помните, что люди на этих форумах обычно проводят свое время бесплатно. Так что постарайтесь сформулировать свой вопрос, сделайте его ясным и кратким. Составьте список всего, что вы пробовали, и предоставьте снимки экрана, фрагменты кода и примеры рабочих книг.
  4. Воспользуйтесь Excel Rescue, которые являются моим партнером-консультантом. Они помогают, предлагая решения небольших проблем с Excel.

Что дальше?
Не уходите, есть еще много чего узнать об Excel Off The Grid. Ознакомьтесь с последними сообщениями:

Excel VBA Array and Array Methods with examples

В этом руководстве объясняются массивы VBA, различные типы массивов, варианты массива и методы массива с помощью примеров программирования:

Обычная переменная VBA - это заполнитель, в котором хранится значение отдельных данных.Он имеет отношение 1 к 1, то есть 1 переменная для 1 значения.

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

=> Посетите здесь, чтобы увидеть серию обучающих программ VBA для всех

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

Массив VBA

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

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

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

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

Dim arrayyname (нижняя граница To UpperBound) как DataType

Есть несколько способов объявить массив. Ниже приведены несколько примеров.

Пример:

# 1) Dim MyArrayExample (от 0 до 3) как целое число

Создает массив с ячейками 0,1,2,3, который принимает целочисленные значения.

# 2) Dim MyArray2 (3) As String

По умолчанию от 0 до 3 и создает массив с местоположением 0,1,2,3, который будет принимать значения String.

# 3) Dim MyArray2 (от 13 до 15) как двойной

Создает массив, начиная с 13, т. Е. 13, 14 и 15, и принимает значения Double. Мы указали нижнюю границу как 13, поэтому массив начнет выделять значения из ячейки 13, а не 0.

Давайте создадим простой код и разберемся со всеми тремя способами объявления массива.

Примечание: Для написания кода VB откройте Microsoft Excel (поддерживаемые версии: Excel 2007, 2010, 2013, 2016, 2019). Перейдите на вкладку разработчика -> Visual Basic (можно также использовать сочетание клавиш Alt + F11). В редакторе VB нажмите Insert -> Module и вставьте приведенный ниже код.

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

 Частный субмассивExample1 ()
Dim firstQuarter (от 0 до 2) As String ‘создает массив с индексом 0,1,2
firstQuarter (0) = "Янв"
firstQuarter (1) = "Февраль"
firstQuarter (2) = "Мар"
MsgBox "Первый квартал календаря" & "" & firstQuarter (0) & "" & firstQuarter (1) & "" & firstQuarter (2)
Конец подписки

Частный подмассивExample2 ()
Dim secondQuarter (2) As String ‘создает массив с индексом 0,1,2
secondQuarter (0) = "апрель"
secondQuarter (1) = "Май"
secondQuarter (2) = "июнь"
MsgBox "Второй квартал в календаре" & "" & secondQuarter (0) & "" & secondQuarter (1) & "" & secondQuarter (2)
Конец подписки

Частный подмассивExample3 ()
Dim thirdQuarter (от 13 до 15) As String ‘создает массив с индексом 13,14,15
thirdQuarter (13) = "июль"
thirdQuarter (14) = "Авг"
thirdQuarter (15) = "Сен"
MsgBox "Третий квартал календаря" & "" и третий квартал (13) & "" и третий квартал (14) & "" и третий квартал (15)
Концевой переводник 

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

Обычная переменная и переменная массива

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

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

 Открытая подпрограмма RegularVariable ()

Тусклый шет как рабочий лист
Установить shet = ThisWorkbook.Worksheets ("Sheet1")

'Объявить переменную для каждого студента
Dim Emp1 As String
Dim Emp2 As String
Dim Emp3 As String
Dim Emp4 As String
Dim Emp5 как строка

'Прочитать оценки учеников из ячейки
Emp1 = шет.Диапазон ("A" и 2). Значение
Emp2 = shet.Range ("A" & 3) .Value
Emp3 = shet.Range ("A" & 4) .Value
Emp4 = shet.Range ("A" & 5) .Value
Emp5 = shet.Range ("A" & 6) .Value

'Печать оценок учащихся
Debug.Print "Emp Name"
Debug.Print Emp1
Debug.Print Emp2
Отладка.Печать Emp3
Debug.Print Emp4
Debug.Print Emp5
Концевой переводник 

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

 Опция Явная

Public Sub ArrayVarible ()
Тусклый шет как рабочий лист
Установите shet = ThisWorkbook.Рабочие листы («Лист1»)

Тусклый сотрудник (от 1 до 6) в виде строки
Dim i как целое число
Для i = от 1 до 6
Сотрудник (i) = shet.Range ("A" & i) .Value
Сотрудник Debug.Print (i)
Далее я
Концевой переводник 

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

Это уменьшит количество строк в коде и тем самым сделает его легко понятным и читаемым.

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

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

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

Dim ArrayName (от FirstIndex до LastIndex, от FirstIndex до LastIndex) как DataType.

Рассмотрим пример хранения оценок 2 учеников, полученных по 3 предметам.Итак, мы создадим двумерный массив, который займет 2 строки и 3 столбца.

Мы начнем массив от строки 1 до строки 2 и столбца 1 до столбца 3.

 Sub Twodim ()
Dim totalMarks (от 1 до 2, от 1 до 3) как целое число
totalMarks (1, 1) = 23
totalMarks (2, 1) = 34
totalMarks (1, 2) = 33
totalMarks (2, 2) = 55
totalMarks (1, 3) = 45
totalMarks (2, 3) = 44
Msgbox «Всего оценок в строке 2 и столбце 2» & totalMarks (2,2)
Msgbox «Всего оценок в строке 1 и столбце 3» & totalMarks (1,3)
Концевой переводник 

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

Строка 2 и столбец 2

Ряд 1 и столбец 3

Фиксированные массивы

Фиксированные массивы

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

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

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

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

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

Тусклый сотрудник () в виде строки

РЕДИМ

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

 Субдинамический массив ()
Dim dynArray () как строка
Тусклый творог как финик
curdate = Сейчас

ReDim dynArray (2) «Redim поможет изменить размер массива во время выполнения.
dynArray (0) = "Джон"
dynArray (1) = "Том"
dynArray (2) = "Тонни"

MsgBox "Студенты, зачисленные после" & curdate & ":" & dynArray (0) & "," & dynArray (1) & "," & dynArray (2)
Концевой переводник 

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

 Sub RedimExample ()
Dim dynArray () как строка
Тусклый творог как финик
curdate = Сейчас
Размер тусклого изображения как целое число

ReDim dynArray (2)
dynArray (0) = "Джон"
dynArray (1) = "Том"
dynArray (2) = "Тонни"
MsgBox "Студенты, зачисленные до" & curdate & "are" & dynArray (0) & "," & dynArray (1)
& "," & dynArray (2)

ReDim dynArray (3) ‘Redim повторно инициализирует массив и уничтожит старые значения
dynArray (3) = "Джон"
MsgBox "Студенты, зачисленные до" & curdate & "are" & dynArray (0) & "," & dynArray (1)
 & "," & dynArray (2) & "," & dynArray (3)
Концевой переводник 

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

Заповедник ReDim

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

Давайте перепишем приведенный выше код, используя ReDim Preserve.

 Sub preserveExample ()
Dim dynArray () как строка
Тусклый творог как финик
curdate = Сейчас
Размер тусклого изображения как целое число

ReDim dynArray (2)
dynArray (0) = "Джон"
dynArray (1) = "Том"
dynArray (2) = "Тонни"
MsgBox "Студенты, зачисленные до" & curdate & "are" & dynArray (0) & "," & dynArray (1) & "," & dynArray (2)

ReDim preserve dynArray (3) ‘Сохранение Redim сохранит старые значения
dynArray (3) = "Джон"
MsgBox "Студенты, зачисленные до" & curdate & "are" & dynArray (0) & "," & dynArray (1)
& "," & dynArray (2) & "," & dynArray (3)
Концевой переводник 

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

Массив вариантов

До сих пор мы видели массив, принимающий значения одного и того же типа. Теперь давайте объявим массив как вариант и сохраним различные типы данных, такие как String, Date, Long, Integer, в одном массиве.

Пример:

 ПодмассивVariant ()
Dim arrayData (3) как вариант
arrayData (0) = "Викрам Викрант"
arrayData (1) = 411234567890 #
arrayData (2) = 38
arrayData (3) = "06-09-1972"
MsgBox "Подробная информация о человеке" & arrayData (0) & "is" & "Номер телефона" & arrayData (1) & ", Id
"& arrayData (2) &", DOB "& arrayData (3)
Концевой переводник 

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

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

Рассмотрим подробно каждый из них на примере.

# 1) Массив

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

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

 Подвариант Array ()
Dim varData как вариант
varData = Array ("Mon Bel", "+61 112334123", 567, "06-09-1972")
MsgBox "Подробная информация о человеке" & varData (0) & "is" & "Номер телефона" & varData (1) & ", Id" & varData (2) & ", DOB" & varData (3)
Концевой переводник 

Вы должны идентифицировать переменную массива с помощью индекса, поэтому в приведенном выше примере значения извлекаются как varData (0) varData (2) varData (3).

# 2) Стереть

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

Синтаксис: Стереть имя массива

Стирание имеет разное поведение для разных типов данных, как показано ниже.

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

Пример:

 Sub eraseExample ()
Dim NumArray (3) как целое число
Dim decArray (2) как двойной
Dim strArray (2) как строка

NumArray (0) = 12345
decArray (1) = 34,5
strArray (1) = "Функция стирания"

Дим DynaArray ()
ReDim DynaArray (3)

MsgBox "Значения перед стиранием" & (NumArray (0)) & "," & (decArray (1)) & "," & (strArray (1))

Стереть NumArray
Стереть decArray
Стереть strArray
Erase DynaArray 'Освободите память

'Все значения удалены.MsgBox "Значения после стирания" & NumArray (0) & "," & decArray (1) & "," & strArray (1)
Концевой переводник 

Результат до использования функции стирания

Результат после использования Стереть

# 3) IsArray

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

Синтаксис: IsArray (имя переменной)

Пример:

 Sub isArrayTest ()
Dim arr1, arr2 как вариант
arr1 = Массив («Янв», «Фев», «Мар»)
arr2 = "12345"

MsgBox ("Является ли arr1 массивом:" & IsArray (arr1))
MsgBox ("Является ли arr2 массивом:" & IsArray (arr2))
Конец 

Результат первого Msgbox

Результат второго сообщения

# 4) Lbound

Возвращает самый нижний индекс массива, указанного в качестве аргумента для функции Lbound.

Синтаксис: LBound (ArrayName, [Dimension])

ArrayName - это имя массива.

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

Пример:

 Sub lboundTest ()
Dim Result1, Result2, Result3
Dim ArrayValue (от 1 до 10, от 5 до 15, от 10 до 20) 'Объявить переменные массива.
Тусклый массив без связи (10)
Result1 = LBound (ArrayValue, 1) 'Возвращает 1.Result2 = LBound (ArrayValue, 3) 'Возвращает 10.
Result3 = LBound (Массив без привязки)
MsgBox «Самый низкий индекс в первом массиве» & Result1 & «Самый низкий индекс в 3-м массиве» & Result2 &
 «Самый низкий индекс в массиве без привязки» & Результат3
Концевой переводник 

# 5) Убунд

Возвращает верхний индекс массива, указанного в качестве аргумента в функции Ubound.

Синтаксис: UBound (ArrayName, [Dimension])

ArrayName - это имя массива.

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

Пример:

 Sub UboundTest ()
Dim Result1, Result2, Result3
Dim ArrayValue (от 1 до 10, от 5 до 15, от 10 до 20) 'Объявить переменные массива.
Тусклый массив без связи (10)
Результат1 = UBound (ArrayValue, 1)
Результат2 = UBound (ArrayValue, 3)
Result3 = UBound (ArraywithoutUbound)
MsgBox «Самый низкий индекс в первом массиве» & Result1 & «Самый низкий индекс в 3-м массиве» &
Результат2 и «Самый низкий индекс в массиве без привязки» и Результат3
Концевой переводник 

# 6) Разделить

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

Синтаксис: Разделить (выражение, [разделитель, [предел, [сравнить]]])

  • Выражение: Это вся строка, которая будет использоваться для создания подстрок.
  • Разделитель: Используя указанный разделитель, будут созданы подстроки. Если это не упомянуто, то в качестве разделителя рассматривается пробел.
  • Ограничение: Количество возвращаемых подстрок.
  • Сравнить: После создания подстроки вы можете использовать различные параметры сравнения для проверки результата.

Пример: В приведенном ниже примере мы используем разделитель как - и ограничение как 3.

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

 Sub splitExample ()
Dim MyString как строка
Тусклый результат () в виде строки
Dim DisplayText As String
MyString = "Это пример функции-VBA-Split"
Результат = Разделить (MyString, "-", 3)
MsgBox Result (0) & vbNewLine & Result (1) & vbNewLine & Result (2) & vbNewLine & Result (3)
Концевой переводник 

# 7) Присоединяйтесь к

Это как раз обратное разделению, Join создаст одну строку, объединив несколько подстрок.

Синтаксис: Join (исходный массив, [разделитель])

Sourcearray: Одномерный массив строк, которые вы хотите объединить в одну.

Разделитель: Указанный разделитель будет добавлен после каждой строки при объединении.

Пример:

 Sub joinExample ()
Тусклый результат в виде строки
Dim dirarray (от 0 до 2) как строка
dirarray (0) = "D:"
dirarray (1) = "SoftwareTestingHelp"
dirarray (2) = "Массивы"
Результат = Присоединиться (dirarray, "\")
MsgBox «Дата после присоединения» и результат
Концевой переводник 

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

# 8) Фильтр

Фильтр позволит нам искать указанное совпадение в массиве. На основе критериев фильтра будет возвращено подмножество массива строк.

Синтаксис: Фильтр (исходный массив, соответствие, [включить, [сравнить]])

Пример:

 Подфильтр Пример ()
Dim Mystring как вариант
Mystring = Array («Тестирование ПО», «Справка по тестированию», «Справка по ПО»)
filterString = Фильтр (Mystring, «помощь»)
MsgBox «Найдено» и UBound (Mystring) - LBound (Mystring) + 1 & «слова, соответствующие критериям»
Концевой переводник 

В этом примере выполняется поиск слова «help» во всей строке массива с помощью функции фильтра.

Часто задаваемые вопросы

Q # 1) Как получить длину массива в VBA?

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

Q # 2) Как объявить массив в VBA?

Ответ: Одномерный массив объявляется, как показано ниже.

Тусклое имя массива (нижняя граница - верхняя граница) как DataType

Пример: Dim Myarray (от 0 до 2) как целое число

Объявлен двумерный массив, как показано ниже.

Dim ArrayName (от FirstIndex до LastIndex, от FirstIndex до LastIndex) как DataType.

Пример: Тусклые метки (от 1 до 3, от 0 до 2) в виде целого числа

Q # 3) Как преобразовать диапазон в массив?

Ответ: Мы можем использовать функцию транспонирования для преобразования диапазона в массив. Этот код создаст Mys [10]

 Sub Пример ()
Тусклый мыс как вариант
Mys = Application.Transpose (Диапазон ("A1: A10"))
Концевой переводник 

Q # 4) Что такое вариант массива в VBA?

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

Пример:

Dim arrayData (3) As Variant
arrayData (0) = «Vikas Vipal»
arrayData (1) = 411234567890 #

Q # 5) Что такое опционная база?

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

Заключение

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

Рекомендуемое чтение = >> Функции и подпроцедуры VBA

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

=> Отметьте ВСЕ руководства по VBA здесь

Excel VBA Array: Полное руководство для начинающих

Если вы работали (или изучали) Visual Basic для приложений, вы, вероятно, знаете о важности твердых знаний по определенным темам, которые влияют на хранение данных и манипулирование ими. Я написал подробные и исчерпывающие руководства по нескольким из этих тем, включая следующие 2:

В этом руководстве по VBA я сосредоточусь на теме, которая тесно связана с вышеупомянутым:

Excel VBA-массивы .

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

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

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

Проще говоря:

Вы, , должны научиться работать с массивами Excel VBA, потому что , помимо других преимуществ (как указано в Excel 2016 VBA и макросах ), они:

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

Показатель мощности массивов VBA предоставлен автором Ричардом Мэнсфилдом. В книге « Освоение VBA для Microsoft Office 2016 » Мэнсфилд описывает массивы как «своего рода суперпеременные» или «переменные на стероидах».

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

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

Сейчас:

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

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

Согласно Центру разработчиков Microsoft, массив:

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

В программе Excel VBA Programming for Dummies гуру Excel Джон Уокенбах дает более широкое определение массива, заявляя, что:

Массив - это группа переменных, имеющих одно имя.

Эти два определения дают хорошее представление об основных характеристиках массива VBA, которые вам необходимо понять для целей этого руководства.Эти основные характеристики массива VBA:

  • Для целей Visual Basic для приложений массив - это, по сути, группа переменных .
  • Группа переменных, составляющих массив, имеет (i) с одинаковым именем и (ii) с одним и тем же типом данных.
  • Переменные, составляющие массив, последовательно проиндексированы . Следовательно, каждый элемент массива имеет уникальный идентификационный номер индекса.
  • Вы, , можете вносить изменения в конкретный элемент массива , не изменяя другие элементы.

    В то же время, как объясняется в Освоение VBA для Microsoft Office 2016 , вы можете работать с сразу со всем массивом (всеми его элементами)

Давайте перейдем к одной из наиболее важных тем этого учебного пособия:

Как объявить массив Excel VBA

Как описано в Программирование Excel VBA для чайников , вы должны всегда объявлять массив перед его использованием.

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

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

  1. Dim.
  2. Статический.
  3. Public.
  4. Частный.

Обычно можно использовать те же 4 оператора для объявления массива . Следовательно, если вы понимаете, как объявлять переменные в VBA, у вас уже есть базовые знания, необходимые для объявления массивов.

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

На самом базовом уровне есть одно основное различие между объявлением обычной (скалярной) переменной и массива:

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

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

  • Элемент № 1: Ключевое слово, которое вы используете для объявления массива.

    Как я упоминал выше, для этих целей можно использовать 4 разных ключевых слова: (i) Dim, (ii) Static, (iii) Public и (iv) Private.

  • Элемент 2: Имя массива.
  • Элемент № 3: Размер массива.

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

  • Элемент № 4: Тип данных для массива.

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

Declaring_Keyword Array_Name ([Array_Size]) [As Data_Type]

Items в квадратных скобках ([]) являются необязательными. В этом заявлении:

Пункты № 1 (Declaring_Keyword), № 2 (Array_Name) и № 4 (Data_Type) практически такие же, как те, которые вы используете при объявлении переменных в VBA.

Элемент № 3 (размер_массива), как и ожидалось выше, является основным различием между объявлением скалярной переменной и массива.В результате этой корневой разницы между объявлением переменной и массива есть 4 дополнительных вопроса, которые вы должны учитывать при объявлении массива (по сравнению с объявлением скалярной переменной):

  • Тема № 1: Размер массива и требования к памяти.
  • Тема № 2: Одномерные и многомерные массивы.
  • Тема № 3: Фиксированные и динамические массивы.
  • Тема № 4: Нижние границы массива.

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

Размер массива, типы данных и требования к памяти

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

Как следствие этого, всякий раз, когда вы не объявляете тип данных для массива, Visual Basic для приложений использует тип данных по умолчанию. Этот тип данных по умолчанию - вариант .Однако вы можете объявлять массивы с использованием другого типа данных (кроме Variant).

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

Исключением из этого правила является , если вы хотите, чтобы массив содержал разные типы данных. В таком случае тип данных массива должен быть Variant . Это связано с тем, что, как объяснил Ричард Мэнсфилд в статье Освоение VBA для Microsoft Office 2016 :

Массив с типом данных Variant может хранить несколько подтипов данных.

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

68 9036 9036 Двойной
Тип данных элемента Байт
Вариант (числовой) 16
Вариант (строка) 22 + требование строки
Байт 1
Логическое значение 2
Валюта Дата3 8

8
Целое число 2
Длинный 4
Объект 4
Одиночный 4 переменная длина 103567

Требование к строке

Строка (фиксированной длины) Требование к строке

900 06 Однако приведенные выше значения не предоставляют всей информации, необходимой для понимания того, сколько памяти требуется конкретному массиву.Точнее:

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

  • Фактор № 1: Тип данных массива.
  • Фактор № 2: Количество элементов в массиве.

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

байтов, используемых массивом = (количество элементов в массиве) x (байты, необходимые для каждого элемента типа данных массива)

Согласно Центру разработки Microsoft (на веб-странице я ссылаюсь на выше), Максимальный размер массива VBA зависит от двух основных факторов: :

  • Ваша операционная система.
  • Доступная память.

Как правило, выполнение выполняется медленнее, если вы используете массив, размер которого превышает объем оперативной памяти, доступной в системе, с которой вы работаете. Это связано с тем, что, как поясняет Microsoft, «данные должны быть прочитаны и записаны на диск».

Теперь, когда у вас есть базовое понимание взаимосвязи между размером массива, типами данных и требованиями к памяти, давайте перейдем к теме…

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

Ключевое слово Dim - это сокращение от «Dimension» .Как я цитирую в сообщении об объявлении переменных VBA, единственное использование Dim в более старых версиях BASIC заключалось в объявлении размеров массива.

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

Чтобы понять, что такое измерение, давайте рассмотрим простейший случай: - одномерный массив . Одномерные массивы можно визуализировать как одну строку элементов.На следующем изображении показан одномерный массив из 8 элементов.

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

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

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

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

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

Фиксированные и динамические массивы VBA

Как я упоминал выше, основное различие, о котором вы должны знать при объявлении массива (по сравнению со скалярной переменной), заключается в том, что вы обычно указываете размер массива.

Однако есть 2 способа определения размера массива :

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

Использование динамических массивов практически такое же, как и у фиксированных массивов.Основное различие между ними заключается в том, что фиксированные массивы «не изменяют размер».

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

Declaring_Keyword Array_Name ([Array_Size]) As [Data_Type]

Я объясняю элементы № 1 (Declaring_Keyword), # 2 (Array_Name) и # 4 (Data_Type) выше.

Я рассмотрю пункт 3 (размер_массива) в следующих разделах. Давайте начнем с рассмотрения…

Как объявить фиксированный одномерный массив Excel VBA

Как правило, вы, , устанавливаете размер измерения массива (Array_Size в заявлении объявления массива выше) с помощью следующего 3 шт .:

  • № 1: Первый порядковый номер.
  • Элемент № 2: Ключевое слово «Кому».
  • Позиция № 3: Последний порядковый номер.

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

Declaring_Keyword Array_Name (First_Index_ # To Last_Index_ #) [As Data_Type]

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

Все операторы объявления массива, которые я включаю в качестве примеров в это руководство по VBA, используют оператор Dim.Помните, что, как я объяснял выше, вы можете (теоретически) также использовать Private, Public или Static. Комментарии, которые я делаю в этом сообщении в блоге, обычно относятся и к случаям, когда вы работаете с другими утверждениями.

Давайте посмотрим на 2 примера :

  • Пример # 1: Следующий оператор объявляет массив из 10 целых чисел (элементы от 0 до 9):

    Dim myArray (от 0 до 9) как целое число

  • Пример № 2: Этот оператор объявляет массив из 20 строк (элементы от 0 до 19):

    Dim myArray (от 0 до 19) As String

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

  • Item # 1: Первый номер индекса.
  • Элемент № 2: Ключевое слово «Кому».

Давайте посмотрим, как выглядят 2 примера операторов выше, если я объявлю их без нижнего индекса:

  • Пример № 1: 10-целочисленный массив.

    Dim myArray (9) As Integer

  • Пример № 2: Массив, состоящий из 20 строк.

    Dim myArray (19) As String

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

  • # 1: Массивы, объявленные в приведенных выше примерах операторов, имеют нижний индекс 0.
  • # 2: Этот способ объявления массива не указывает количество элементов массива.Он скорее указывает верхнюю границу массива.

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

Среди прочего, по этим причинам я лично предпочитаю указывать как верхнюю, так и нижнюю границу массива , а не позволять оператору Option Base определять нижнюю границу массива.Эксперты VBA, такие как Чип Пирсон (которого я цитирую выше), вероятно, согласны с этим мнением. Мнение Чипа, которое вы можете найти, перейдя по ссылке выше, заключается в том, что это…

Очень плохая практика программирования - опускать нижнюю границу и объявлять только верхнюю границу.

Как объявить фиксированный многомерный массив Excel VBA

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

На практике основное различие между объявлением одномерного и многомерного массива состоит в том, что при объявлении многомерного массива вы разделяете размер измерений запятыми (,) .

Следовательно, структура оператора , используемого для объявления массива с ## измерениями , может быть переписана как:

Declaring_Keyword Array_Name (Dimension1_First_Index_ # To Dimension1_Last_Index_ #, First Dimension2_First_Index_ # To Dimension_First_Index_ # To Dimension_Index_# # To Dimension ## _ Last_Index_ #) [As Data_Type]

Давайте взглянем на несколько примеров объявлений фиксированных многомерных массивов:

  • Example # 1: Следующий оператор объявляет двумерный массив с 25 целые числа.Как я объяснял выше, вы можете думать об этом массиве как о сетке 5 x 5.

    Dim myArray (от 1 до 5, от 1 до 5) как целое число

  • Пример № 2: Этот оператор объявляет трехмерный массив с 1000 целыми числами. Следуя логике иллюстраций выше, вы можете изобразить это как куб 10 x 10 x 10.

    Dim myArray (от 1 до 10, от 1 до 10, от 1 до 10) как целое число

  • Пример № 3: Следующий оператор объявляет четырехмерный массив с 10000 целыми числами:

    Dim myArray (От 1 до 10, от 1 до 10, от 1 до 10, от 1 до 10) Как целое число

Как объявить и изменить размер динамического массива Excel VBA

Как я объяснил выше, размер динамических массивов изменяется по мере изменения соответствующее приложение работает .Другими словами (как описано в Excel VBA Programming for Dummies ):

Динамический массив не имеет заранее установленного количества элементов.

Ниже приведены 2 из основных причин использования динамических массивов :

  • Причина № 1: Вы не знаете, какой размер массива требуется до выполнения.
  • Причина № 2: Вы хотите оптимизировать использование памяти, например, выделяя очень большие массивы только на короткие периоды времени.

При объявлении динамического массива вы не включаете некоторое количество элементов (Array_Size в базовом синтаксисе выше) в оператор объявления. Это означает, что вы оставите соответствующий набор круглых скобок пустым .

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

Declaring_Keyword Array_Name () [As Data_Type]

Следующие примеры операторов объявляют динамические массивы:

Dim myAr () As Integer

Dim myArray () As String

Однако вы, , не можете использовать динамический массив, пока не укажете, сколько элементов в динамическом массиве .Для этого вы, , используете оператор ReDim .

Давайте подробнее рассмотрим эту тему:

ReDim Dynamic Array

Основная цель оператора ReDim - позволить вам «перераспределить пространство хранения» для динамических массивов. Как я упоминал выше, вы, , используете оператор ReDim, чтобы указать количество элементов в динамическом массиве.

Вы, , не можете использовать оператор ReDim для изменения размера фиксированного массива . Как объясняется в Центре разработки Microsoft, всякий раз, когда…

Вы пытаетесь повторно объявить измерение для переменной массива, размер которой был явно указан в операторах Private, Public или Dim, возникает ошибка.

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

ReDim [Сохранить] Имя_массива (Размер_массива) [Как Тип_Данных]

Элементы в квадратных скобках ([]) являются необязательными.

Этот оператор содержит следующие 5 элементов :

  • Элемент № 1: Ключевое слово ReDim.

    Я объясняю назначение этого ключевого слова в текущем разделе.

  • Номер позиции 2: Сохранить ключевое слово.

    Этот элемент не является обязательным. Я объясню его назначение и характеристики ниже.

  • Элемент № 3: Имя_массива.

    Это имя массива, с которым вы работаете. Я объясню этот элемент в разделе выше, посвященном объявлению массивов VBA.

  • Элемент № 4: Размер_массива.

    Это размер массива. Именно этот элемент вы обычно указываете при работе с оператором ReDim.

    Я объясняю, как вы справляетесь с этим вопросом, начиная с этого раздела.

  • Элемент № 5: Как Data_Type.

    Я представил этот конкретный элемент, объясняя, как объявить массив в предыдущем разделе. Комментарии, которые я там даю, обычно относятся к случаям, когда вы используете ReDim Statement.

    Несмотря на вышесказанное, есть несколько особых правил, которые применяются при работе с оператором ReDim. Я объясню это ниже.

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

Несмотря на вышесказанное, не всегда может изменить размер массива . Точнее, всякий раз, когда вы передаете массив VBA в процедуру по ссылке, вы не можете изменить размер этого массива внутри этой процедуры.

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

Оператор ReDim и типы данных

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

Основным исключением из этого правила являются случаи, когда массив содержится в переменной Variant . В таких случаях для изменения типа данных обычно можно использовать элемент № 5 (As Data_Type).

Даже в тех случаях, когда массив содержится в переменной Variant, вы не сможете изменить тип данных массива, если в вашем операторе ReDim используется ключевое слово Preserve. Это связано с тем, что при использовании параметра «Preserve» изменение типа данных не допускается.

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

Теперь вернемся к…

Ключевое слово Preserve

Как объясняется в Excel 2016 VBA и Macros , оператор ReDim «повторно инициализирует» массив, с которым вы работаете. Следовательно, , как правило, ReDim стирает все ранее сохраненные данные в элементах массива. Другими словами, эти старые данные уничтожаются.

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

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

  • Условие № 1: Как объяснялось в предыдущем разделе, изменение типов данных обычно не допускается.
  • Условие № 2: Вы не можете изменить количество измерений массива.
  • Условие № 3: Вы можете изменить размер только последнего измерения массива.
  • Условие № 4: Вы можете изменить только верхнюю границу массива.

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

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

Ниже я привожу несколько примеров операторов ReDim, в которых используется ключевое слово Preserve.

Уменьшение размера динамического массива

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

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

Оператор ReDim для объявления переменных

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

В дополнение к вышесказанному, как объяснено Microsoft:

Если другая переменная с тем же именем будет создана позже, даже в более широкой области, ReDim будет ссылаться на более позднюю переменную и не обязательно вызовет ошибку компиляции, даже если действует Option Explicit.

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

Пример кода оператора ReDim

Как объяснил специалист по Excel Джон Уокенбах в книге Excel VBA Programming for Dummies , всякий раз, когда вы работаете с динамическим массивом, обычно…

Количество элементов в массиве определяется пока ваш код работает.

Следовательно, для целей приведенного ниже примера, давайте предположим следующие 2 вещи:

  • Предположение № 1: Вы работаете в конкретной процедуре, которая включает переменную с именем «DimensionSize».
  • Допущение № 2: Переменная sizeSize содержит определенное значение.

В этом случае следующий пример оператора использует оператор ReDim для изменения размера массива:

ReDim myArray (от 1 до DimensionSize)

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

Следующие 3 оператора являются примерами использования оператора ReDim при работе с многомерными массивами:

  • Пример # 1: Если у вас есть 2 переменные, содержащие значения (DimensionSize1 и DimensizeSize 2):

    ReDim myArray (от 1 до DimensionSize1, от 1 до DimensionSize2)

  • Пример № 2: Если у вас есть 3 переменных с именами от «DimensionSize1» до «DimensizeSize3»:

    ReDim myArray (1 для DimensionSize1, 1 для DimensionSize2, 1 для DimensionSize3)

  • Пример # 3: Если у вас есть 4 переменные (DimensizeSize1 - DimensizeSize4):

    ReDim myArray (1 в DimensionSize1, 1 в DimensionSize2, 1 в DimensionSize3, 1 - в DimensionSize4)

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

    • Пример №1: В этом примере предполагается, что (i) массив (myArray) имеет 5 элементов, а (ii) переменная DimensizeSize имеет значение 12. Если это так, следующий оператор сохраняет данные, хранящиеся в первых 5 элементах, и добавляет 7 новых элементов в массив (от 6 до 12):

      ReDim Preserve myArray (1 to DimensizeSize)

    • Пример № 2: В этом примере предполагается, что (i) myArray имеет 2 измерения и 9 элементов (3 x 3), а (ii) переменная DimensizeSize имеет значение 5.В этом случае следующий оператор сохраняет данные, хранящиеся в массиве, и добавляет 6 новых элементов. Размер массива после этого оператора составляет 3 x 5.

      ReDim Preserve myArray (от 1 до 3, от 1 до DimensionSize)

    • Пример № 3: В этом примере предполагается, что (i) myArray имеет 3 измерения и 8 элементов (2 x 2 x 2) и (ii) значение DimensionSize равно 5. В таком случае следующие операторы сохраняют данные, хранящиеся в myArray, и добавляют 12 элементов.Результирующий размер массива составляет 2 x 2 x 5.

      ReDim Preserve myArray (от 1 до 2, от 1 до 2, от 1 до Dimensize)

    При просмотре последних трех примеров помните, что ) вы, , можете изменить размер только последнего измерения массива при использовании ключевого слова Preserve .

    В примере № 1 у вас есть только 1 измерение. Это измерение также является последним измерением. В примерах №2 и №3 у вас более одного измерения. Поэтому в этих двух случаях я изменяю только размер последнего измерения.

    Нижние границы массива и заявление Option Base

    Как я объяснил выше, не обязательно указывать нижнюю границу массива.

    Это не означает, что нет нижней границы. Как объяснили представители Excel Билл Джелен (г-н Excel) и Трейси Сирстад в Excel 2016 VBA и Macros , когда вы делаете это, вы фактически «разрешаете» оператору Option Base определять нижнюю границу .

    При этом есть 2 варианта индексации массива :

    • Вариант № 1: Массив индексируется с 0.
    • Вариант № 2: Массив индексируется с 1.

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

    Опция индексации по умолчанию - Option Base 0 . Поэтому, если вы не указываете базу при объявлении массива, она начинается с 0. Это наиболее распространенный стандарт в программировании.

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

    Option Base 1

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

    Оператор Option Base:

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

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

    Давайте вернемся к примерам операторов объявления массивов, которые я привел в предыдущих разделах о фиксированных одномерных и фиксированных многомерных массивах.В следующих примерах предполагается, что соответствующий оператор находится в модуле, который содержит оператор «Option Base 1», как я объяснил выше.

    • Пример № 1: Оба следующих оператора объявляют массив из 10 целых чисел (элементы от 1 до 10):

      Dim myArray (от 1 до 10) как целое число

      Dim myArray (10) как целое число

    • Пример № 2: Эти операторы объявляют массив из 20 строк (элементы от 1 до 20):

      Dim myArray (от 1 до 20) As String

      Dim myArray (20) As String

    • Пример № 3: Следующие операторы изменяют размер массива с количеством элементов, равным значению, содержащемуся в переменной DimensizeSize (от элементов 1 до DimensizeSize):

      ReDim myArray (от 1 до DimensionSize)

      ReDim myArray (DimensizeSize )

    Как сослаться на элемент массива

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

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

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

    Как сослаться на элемент в одномерном массиве

    Как объяснено в Excel 2016 Power Programming с VBA , вы обычно ссылаетесь на элемент массива, используя 2 элемента :

    • Item # 1: Имя массива.
    • Item # 2: Конкретный индекс или индексный номер.

    Базовая структура оператора , которую вы можете использовать для ссылки на элемент в одномерном массиве, выглядит следующим образом:

    Array_Name (Element_Index_Number)

    Давайте рассмотрим несколько примеров:

    The Пример макроса , показанный на следующем изображении (One_Dimensional_Array_Declaration_1), выполняет следующие 3 действия:

    1. Объявляет массив из 10 целых чисел (от 1 до 10).

      Этот оператор следует правилам объявления массива VBA, которые я объяснил выше.

    2. Инициализирует каждый элемент массива и присваивает значения от 1 до 10 каждому из этих элементов.

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

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

    3. Использует функцию MsgBox VBA для отображения диалогового окна со значением первый элемент массива (myArray (1)).

    Обратите внимание, как все ссылки на элементы в элементах №2 и №3 используют базовую структуру операторов, которую я представил выше:

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

    В следующем разделе мы сделаем шаг дальше и покажем вам…

    Как ссылаться на элемент в многомерном массиве

    Логика ссылки на элемент в многомерном массиве аналогична. Основные правила для ссылки на такой элемент следующие:

    • Правило № 1: Включите соответствующий номер индекса для каждого измерения массива.
    • Правило № 2: Разделите разные порядковые номера запятыми (,).

    Как следствие этих правил, базовая структура ссылки на элемент в массиве с ## измерениями выглядит следующим образом:

    Имя_массива (Dimension1_Element_Index_Number, Dimension2_Element_Index_Number,…, Dimension ## _ Element_Index_Number)

    Следующий пример макроса (Two_Dimensional_Array_Declaration) выполняет те же 3 действия, что и пример процедуры Sub в предыдущем разделе.Точнее, это:

    1. Объявляет массив из 9 целых чисел (3 x 3).

      Я объяснил синтаксис этого оператора в предыдущем разделе этого руководства.

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

    На следующем изображении показано диалоговое окно, которое Excel отображает, когда я выполняю этот макрос:

    Обратите внимание, как, как и ожидалось, отображаемое значение совпадает со значением, присвоенным первому элементу массива в коде VBA:

    Давайте посмотрим на последний пример макроса (Three_Dimensional_Array_Declaration), где макрос работает с трехмерным массивом.Этот пример макроса выполняет следующие функции:

    1. Объявляет массив из 8 целых чисел (2 x 2 x 2).
    2. Инициализирует каждый элемент массива и присваивает каждому элементу значения от 1 до 8.
    3. Отображает окно сообщения со значением, присвоенным первому элементу массива (1, 1, 1).

    Диалоговое окно, которое Excel отображает, когда я выполняю макрос, (как и ожидалось) практически такое же, как и в предыдущих примерах:

    Обратите внимание, как, еще раз, значение, отображаемое Excel, совпадает с назначенным для первый элемент массива по коду VBA:

    Как стереть данные в массиве (или самом массиве)

    Как я объяснял выше, оператор ReDim обычно стирает данные в массиве, с которым вы работаете.

    Однако вы можете стереть данные, хранящиеся в массиве, с помощью другого оператора: Erase.

    Основная цель инструкции Erase :

    • Повторная инициализация элементов фиксированного массива.

      Оператор Erase не восстанавливает память при работе с фиксированным массивом. Обычно он устанавливает для элементов массива значения по умолчанию для соответствующего типа данных.

    • Освободить «пространство для хранения динамического массива».

      Таким образом, в случае динамических массивов оператор Erase освобождает память, которую использовал массив.Это, по сути, полностью стирает динамический массив. Поэтому, прежде чем вы сможете использовать массив в будущем, вы должны указать, сколько в нем элементов, с помощью оператора ReDim. Как это сделать, я объяснил выше.

    Базовый синтаксис оператора Erase довольно прост:

    Удалить arrayylist

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

    В следующих примерах операторов показано, как можно использовать оператор Erase:

    • Пример № 1: Этот оператор стирает данные, хранящиеся в myArray (если он исправлен) или в самом myArray (если он динамический):

      Erase myArray

    • Пример 2: Следующий оператор стирает данные, хранящиеся как в myArray1, так и в myArray2 (если они исправлены), или в самих массивах (если они динамические):

      Erase myArray1, myArray2

    Заключение

    После прочтения этого руководства по VBA, , у вас, вероятно, есть очень твердое понимание темы массивов Excel VBA .Среди прочего, вы знаете :

    • Что такое массивы VBA и почему они полезны.

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

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