Найти в Дзене
VBA Excel с нуля

VBA Excel № 45. Многомерные массивы в VBA.

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

Объявление многомерных массивов в VBA:

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

Пример объявления двумерного массива для хранения оценок учеников:

Dim оценки(1 To 5, 1 To 3) As Integer

В этом примере оценки - это имя массива, (1 To 5, 1 To 3) указывает, что у нас два измерения: первое измерение идет от 1 до 5 (пять учеников), а второе измерение идет от 1 до 3 (три предмета).

Пример с многомерным массивом (в данном случае это двухмерный массив) оценок:

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

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Наполнить массив можно следующим кодом:

Sub test()

Dim оценки(1 To 5, 1 To 3) As Integer

' Заполняем массив оценок

оценки(1, 1) = 4

оценки(1, 2) = 3

оценки(1, 3) = 5

оценки(2, 1) = 3

оценки(2, 2) = 4

оценки(2, 3) = 3

оценки(3, 1) = 5

оценки(3, 2) = 2

оценки(3, 3) = 4

оценки(4, 1) = 2

оценки(4, 2) = 3

оценки(4, 3) = 4

оценки(5, 1) = 4

оценки(5, 2) = 3

оценки(5, 3) = 5

Dim оценка As Integer

оценка = оценки(3, 2)

MsgBox оценка

End Sub

Скриншот с моего ноутбука
Скриншот с моего ноутбука

В этом примере значение оценки(3, 2) будет представлять оценку третьего ученика по второму предмету (а это Виктория и у неё по физике двойка).

Но давайте представим, что учеников 30, а предметов 10, никаких сил не хватит таким образом загонять в массив оценки учеников. Как быть?

Тогда можно воспользоваться циклом For Each (прохождение по всем ячейкам указанного диапазона). Вот пример кода:

Sub test1()

Dim оценки(1 To 5, 1 To 3) As Integer

Dim ячейкаОценка As Range

For Each ячейкаОценка In ThisWorkbook.Worksheets("Лист1").Range("B2:D6")

оценки(ячейкаОценка.Row - 1, ячейкаОценка.Column - 1) = ячейкаОценка.Value

Next ячейкаОценка

Dim оценка As Integer

оценка = оценки(3, 2)

MsgBox оценка

End Sub

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Процедура стала намного меньше. Заметили?

Давайте разберем этот код по шагам:

1. 'Dim оценки(1 To 5, 1 To 3) As Integer': Здесь объявляется двумерный массив с именем 'оценки', который будет содержать оценки учеников. Этот массив имеет 5 строк (учеников) и 3 столбца (предмета).

2. 'Dim ячейкаОценка As Range': Объявляется переменная 'ячейкаОценка' типа 'Range', которая будет использоваться для перебора ячеек в диапазоне.

3. 'For Each ячейкаОценка In ThisWorkbook.Worksheets("Лист1"). Range("B2:D6")': Здесь начинается цикл, который перебирает каждую ячейку в диапазоне "B2:D6" на листе "Лист1" в текущей книге. Для каждой ячейки в этом диапазоне выполняется следующее действие.

4. 'оценки(ячейкаОценка. Строка - 1, ячейкаОценка. Столбец - 1) = ячейкаОценка. Value': Эта строка присваивает значение текущей ячейки переменной 'ячейкаОценка' элементу массива 'оценки' с помощью индексов, вычисленных из номера строки и столбца ячейки. Так как массивы в VBA индексируются с 1, мы вычитаем 1 из номера строки и столбца, чтобы получить правильные индексы массива.

5. 'Next ячейкаОценка' закрываем цикл

6. 'Dim оценка As Integer': Объявляется переменная 'оценка', которая будет использоваться для хранения значения оценки ученика.

7. 'оценка = оценки(3, 2)': Значение оценки ученика 3 по предмету 2 извлекается из массива 'оценки' и присваивается переменной 'оценка'.

8. 'MsgBox оценка': Открывается диалоговое окно с помощью функции 'MsgBox', которое показывает значение переменной 'оценка' (а это Виктория и у неё по физике двойка).

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

В следующей статье рассмотрим динамические массивы в VBA.