🔥 Массивы в VBA Excel
Массивы в VBA — это структуры данных, которые позволяют хранить несколько значений под одним именем. Они удобны для работы с большими объемами данных, поскольку позволяют быстро обрабатывать их в циклах.
📌 Объявление массивов
1️⃣ Одномерный (фиксированный) массив с фиксированным числом элементов
🔹 В этом массиве 5 элементов, доступных по индексам 1–5.
2️⃣ Динамический массив (размер можно менять в процессе работы)
🔹 Используем ReDim, чтобы задать размер массива во время выполнения кода.
3️⃣ Многомерный массив
🔹 Это массив 3×3, где обозначение каждого элемента соответствует формуле - matrix(строка, столбец).
#VBA #ExcelVBA #Array #Массив #Массивы
Массивы в VBA — это структуры данных, которые позволяют хранить несколько значений под одним именем. Они удобны для работы с большими объемами данных, поскольку позволяют быстро обрабатывать их в циклах.
📌 Объявление массивов
1️⃣ Одномерный (фиксированный) массив с фиксированным числом элементов
Dim arr(1 To 5) As Integer
arr(1) = 10
arr(2) = 20
MsgBox arr(1) ' Выведет 10
🔹 В этом массиве 5 элементов, доступных по индексам 1–5.
2️⃣ Динамический массив (размер можно менять в процессе работы)
Dim arr() As Integer
ReDim arr(1 To 10)
arr(1) = 100
🔹 Используем ReDim, чтобы задать размер массива во время выполнения кода.
3️⃣ Многомерный массив
Dim matrix(1 To 3, 1 To 3) As Integer
matrix(1, 1) = 5
matrix(2, 3) = 10
MsgBox matrix(2, 3) ' Выведет 10
🔹 Это массив 3×3, где обозначение каждого элемента соответствует формуле - matrix(строка, столбец).
#VBA #ExcelVBA #Array #Массив #Массивы
Заполнение массивов
🔄 Циклы и массивы
Массивы удобно заполнять и читать с помощью цикла For:
🏎 Быстрое заполнение массивов через Array
🔹 Array() создает массив сразу со значениями, но его индексация начинается с 0!
📥 Заполнение массива из диапазона
В VBA можно легко загрузить данные из диапазона Excel в массив, обработать их и затем записать обратно в другой диапазон.
1️⃣ Заполнить массив из диапазона:
🔹 Данные из диапазона A1:A5 загружаются в массив arr.
🔹 Индексация массива начинается с 1, а не с 0.
🔹 Массив получается двумерным, даже если диапазон одномерный - arr(строка, столбец).
2️⃣ Передача массива обратно в диапазон:
🔹 Используем Transpose(), чтобы записать одномерный массив в вертикальный диапазон.
3️⃣ Копирование данных из одного диапазона в другой через массив:
🔹 Копируем значения из A1:C5 в E1:G5, используя массив.
🔹 Такой способ быстрее, чем копирование ячеек по одной.
#Range #Array #ЗаполнениеМассива #ЗаполнениеМассивов
🔄 Циклы и массивы
Массивы удобно заполнять и читать с помощью цикла For:
Dim i As Integer, arr(1 To 5) As Integer
For i = 1 To 5
arr(i) = i * 10
Next i
MsgBox arr(3) ' Выведет 30
🏎 Быстрое заполнение массивов через Array
Dim arr As Variant
arr = Array(10, 20, 30, 40)
MsgBox arr(2) ' Выведет 30 (нумерация начинается с 0!)
🔹 Array() создает массив сразу со значениями, но его индексация начинается с 0!
📥 Заполнение массива из диапазона
В VBA можно легко загрузить данные из диапазона Excel в массив, обработать их и затем записать обратно в другой диапазон.
1️⃣ Заполнить массив из диапазона:
Dim arr As Variant
arr = Range("A1:A5").Value
MsgBox arr(3, 1) ' Выведет значение из A3
🔹 Данные из диапазона A1:A5 загружаются в массив arr.
🔹 Индексация массива начинается с 1, а не с 0.
🔹 Массив получается двумерным, даже если диапазон одномерный - arr(строка, столбец).
2️⃣ Передача массива обратно в диапазон:
Dim arr As Variant
arr = Array(10, 20, 30, 40, 50)
Range("B1:B5").Value = Application.Transpose(arr)
🔹 Используем Transpose(), чтобы записать одномерный массив в вертикальный диапазон.
3️⃣ Копирование данных из одного диапазона в другой через массив:
Dim dataArr As Variant
dataArr = Range("A1:C5").Value ' Читаем данные из диапазона A1:C5
Range("E1:G5").Value = dataArr ' Записываем их в E1:G5
🔹 Копируем значения из A1:C5 в E1:G5, используя массив.
🔹 Такой способ быстрее, чем копирование ячеек по одной.
#Range #Array #ЗаполнениеМассива #ЗаполнениеМассивов
🔄 Переопределение размерности массивов
Переопределять размерность динамических массивов в одной процедуре можно неоднократно, как по количеству измерений, так и по количеству элементов в измерении. Для переопределения размерности используется оператор ReDim.
📌 Примеры
1️⃣ Переопределение массивов с указанием размеров числами
2️⃣ Переопределение массива с помощью переменной
При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения используется оператор Preserve.
3️⃣ Переопределение массива с сохранением значений
⚠️ Важно
🔹 Переопределяемый массив должен быть динамическим. При попытке переопределить массив, объявленный с указанием размерности (Dim Massiv(1 To 9) As String), произойдет ошибка компиляции с сообщением: Array already dimensioned (Массив уже имеет размерность).
🔹 Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.
4️⃣ Еще один пример с ReDim Preserve
Так все работает, но при попытке переопределения размерности: ReDim Preserve x(3, 2, 3) или даже ReDim Preserve x(2, 3, 2), происходит ошибка "Run-time error '9': Subscript out of range" (Ошибка времени выполнения '9': Индекс вне диапазона).
#VBA #ReDim #Preserve #Array #Массив #Размерность
Переопределять размерность динамических массивов в одной процедуре можно неоднократно, как по количеству измерений, так и по количеству элементов в измерении. Для переопределения размерности используется оператор ReDim.
📌 Примеры
1️⃣ Переопределение массивов с указанием размеров числами
Dim Massiv1() As Integer, Massiv2() As String
ReDim Massiv1(1 To 20)
ReDim Massiv2(3, 5, 4)
2️⃣ Переопределение массива с помощью переменной
Dim Massiv1() as Variant, x As Integer
x = 20
ReDim Massiv1(1 To x)
При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения используется оператор Preserve.
3️⃣ Переопределение массива с сохранением значений
Dim Massiv1() As String
----- операторы -----
ReDim Massiv1(5, 2, 3)
----- операторы -----
ReDim Preserve Massiv1(5, 2, 7)
⚠️ Важно
🔹 Переопределяемый массив должен быть динамическим. При попытке переопределить массив, объявленный с указанием размерности (Dim Massiv(1 To 9) As String), произойдет ошибка компиляции с сообщением: Array already dimensioned (Массив уже имеет размерность).
🔹 Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.
4️⃣ Еще один пример с ReDim Preserve
Sub Primer()
Dim x() As Byte, i1 As Byte, i2 As Byte, i3 As Byte
ReDim x(2, 2, 2)
For i1 = 0 To 2
For i2 = 0 To 2
For i3 = 0 To 2
x(i1, i2, i3) = i1 + i2 + i3
Next
Next
Next
ReDim Preserve x(2, 2, 3)
End Sub
Так все работает, но при попытке переопределения размерности: ReDim Preserve x(3, 2, 3) или даже ReDim Preserve x(2, 3, 2), происходит ошибка "Run-time error '9': Subscript out of range" (Ошибка времени выполнения '9': Индекс вне диапазона).
#VBA #ReDim #Preserve #Array #Массив #Размерность