Динамические массивы - это мощный инструмент в языке программирования VBA, который позволяет создавать и управлять массивами переменной длины. В этой статье мы рассмотрим, что такое динамические массивы, как их использовать и какие преимущества они предоставляют.
Что такое динамические массивы?
Массивы в VBA - это коллекции элементов одного типа данных, объединенных под одним именем. Обычно массивы имеют фиксированную длину, которая определяется заранее. Динамические массивы, напротив, позволяют менять свою длину в процессе выполнения программы.
Почему использовать динамические массивы?
Динамические массивы предоставляют несколько преимуществ:
1. Гибкость: Вы можете добавлять и удалять элементы в массиве по мере необходимости, без заранее заданной фиксированной длины.
2. Экономия памяти: Массивы занимают память только на фактические элементы, что позволяет оптимизировать использование ресурсов.
3. Удобство: Динамические массивы упрощают обработку больших объемов данных, так как не требуют заранее известного размера.
Как создать динамический массив?
Для создания динамического массива в VBA используется функция ReDim, которая позволяет изменять размер массива. Рассмотрим пример создания динамического массива чисел:
Sub CreateDynamicArray()
Dim DynamicArray() As Integer
Dim i As Integer
ReDim DynamicArray(0 To 4) ' Начальное задание размера
'индекс массива начинается с 0
For i = 0 To 4
DynamicArray(i) = i * 2
Next i
' Вначале i равно 0*2, далее 1*2 и...
' Теперь массив содержит: 0, 2, 4, 6, 8
End Sub
📌 Скачать файл пример, можно в конце статьи.
В данном примере мы сначала создаем массив DynamicArray с начальным размером 5 элементов. Затем мы заполняем его элементами, умножая индекс на 2. Содержание массива видно в окне отладки “Locals” (как работать с окнами отладки будет рассмотрено в статье № 49).
Добавление элементов в динамический массив
Чтобы добавить новый элемент в динамический массив, мы снова используем ReDim, но с указанием нового размера массива:
Sub AddElementToDynamicArray()
Dim DynamicArray() As Integer
Dim i As Integer
ReDim DynamicArray(0 To 2) ' Начальное задание размера
For i = 0 To 2
DynamicArray(i) = i * 3
Next i
' Теперь массив содержит: 0, 3, 6
ReDim Preserve DynamicArray(0 To 3) ' Изменение размера с сохранением данных
DynamicArray(3) = 48
' Теперь массив содержит: 0, 3, 6, 48
End Sub
Давайте разберем этот код по шагам:
1. Dim DynamicArray() As Integer: В этой строке мы объявляем переменную DynamicArray как динамический массив целых чисел.
2. ReDim DynamicArray(0 To 2): Здесь мы задаем начальный размер массива. Массив будет иметь три элемента, индексы от 0 до 2.
3. For i = 0 To 2: Этот цикл For проходит через индексы от 0 до 2.
4. DynamicArray(i) = i * 3: В этой строке мы присваиваем элементам массива значения, умножая индекс на 3. Таким образом, первый элемент будет 0, второй - 3, третий - 6.
5. ReDim Preserve DynamicArray(0 To 3): Это особенность динамических массивов. Мы используем ReDim Preserve, чтобы изменить размер массива, но при этом сохранить уже существующие значения. Теперь массив будет иметь размер 4 элемента.
6. DynamicArray(3) = 48: Мы присваиваем четвертому элементу массива значение 48.
7. Закомментированная строка "Теперь массив содержит: 0, 3, 6, 48": Это объяснение текущего содержания массива.
Таким образом, после выполнения этого макроса, массив будет содержать числа 0, 3, 6 и 48.
Коротко: в этом примере мы сначала создаем массив с тремя элементами, а затем с помощью ReDim Preserve расширяем его до четырех элементов и добавляем новый элемент. Содержание массива видно в окне отладки “Locals”.
Удаление элементов из динамического массива
Чтобы удалить элемент из динамического массива, нам придется пересоздать массив без нужного элемента. Вот пример:
Sub RemoveElementFromDynamicArray()
Dim DynamicArray() As Integer
Dim i As Integer
Dim indexToRemove As Integer
ReDim DynamicArray(0 To 3)' Начальное задание размера
For i = 0 To 3
DynamicArray(i) = i * 4
Next i
indexToRemove = 1
For i = indexToRemove To UBound(DynamicArray) - 1
DynamicArray(i) = DynamicArray(i + 1)
Next i
ReDim Preserve DynamicArray(0 To UBound(DynamicArray) - 1)
' Уменьшение размера массива
' Теперь массив содержит: 0, 8, 12
End Sub
Разберем пошагово код макроса RemoveElementFromDynamicArray, чтобы понять, что он делает:
1. ReDim DynamicArray(0 To 3): Создает массив DynamicArray с начальным размером 4 элемента (индексы 0, 1, 2, 3).
2. For i = 0 To 3: Цикл заполняет массив числами, умноженными на 4. После этого массив будет содержать: 0, 4, 8, 12.
3. indexToRemove = 1: Указывает индекс элемента, который нужно удалить (в данном случае, это элемент с индексом 1).
4. For i = indexToRemove To UBound(DynamicArray) - 1: Цикл перемещает элементы массива влево, начиная с индекса indexToRemove, для "удаления" элемента. В данном случае, элемент с индексом 1 (значение 4) будет перезаписан значением элемента с индексом 2 (значение 8), и элемент с индексом 2 будет перезаписан значением элемента с индексом 3 (значение 12).
5. ReDim Preserve DynamicArray(0 To UBound(DynamicArray) - 1): Уменьшает размер массива на один элемент, фактически удаляя последний элемент.
В результате, после выполнения этого кода массив будет содержать: 0, 8, 12. Элемент с индексом 1 (значение 4) был удален.
Динамические массивы предоставляют гибкость и удобство при работе с переменными объемами данных в VBA. Используя функцию ReDim, вы можете создавать, добавлять и удалять элементы в массиве по мере необходимости. Это поможет вам более эффективно управлять данными и создавать более гибкие программы.
В следующей статье рассмотрим окно отладки процедуры "Immediate" Window в VBA.