VBA Excel
242 subscribers
88 photos
23 links
VBA Excel для начинающих. Справка по VBA Excel. Visual Basic for Applications. Справочник. Самоучитель.
Download Telegram
🔥 Массивы в VBA Excel

Массивы в 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:
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️⃣ Переопределение массивов с указанием размеров числами
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 #Массив #Размерность