Цей підручник демонструє, як оголошувати (Dim), створювати та ініціалізувати змінні масиву у VBA
Що таке змінна масиву VBA?
Змінна масиву VBA можна розглядати як групу змінних, що зберігаються під тим самим іменем і мають один і той же тип даних. Масив може зберігати текст, цифри або об’єкти.
Ви посилаєтесь на елемент у масиві, використовуючи його номер індексу.
Ви можете оголосити змінну масиву так само, як і будь -яку іншу змінну, використовуючи ключове слово Dim, Static, Public або Private.
Статичні масиви
Існує 2 типи масивів - статичний і динамічний. Статичний масив оголошується із зазначенням розміру, коли ви спочатку оголошуєте масив. Його також називають фіксованим масивом.
1 | Затемнити intA (4) як ціле число |
Наведений вище масив оголошується за допомогою оператора Dim на рівні процедури або модуля, а розмір масиву - 5, оскільки ми не оголосили значення LBound масиву.
Ні, це не помилка! Розмір масиву - 5, незважаючи на введення 4 у масив. Це пояснюється тим, що індекси масивів автоматично починаються з нуля.
Індекси масивів
Індекси масивів автоматично починаються з нуля, якщо тільки База варіантів 1 оголошено у верхній частині модуля коду.
Якщо База варіантів 1 оголошується, тоді масиви автоматично почнуть з 1.
Однак я вважаю, що оголошення таких змінних таким чином проблематичним. Рецензенти коду можуть не знати про те, що масиви починаються з нуля або з декларації Option Base 1
Натомість я вважаю за краще чітко оголошувати початкове та кінцеве положення масивів:
1 | Затемнити intA (від 2 до 5) як ціле число |
Зверніть увагу, що коли ви це зробите, ви можете запустити масив з будь -якого числа (не лише з 1 чи 0).
Динамічні масиви
Змінна Dynamic Array - це масив, розмір якого можна змінювати під час виконання. Ви оголошуєте динамічні змінні без розміру.
1 | Затемнити intA () як ціле число |
Ви можете використовувати оператор ReDim, щоб вказати розмір масиву після створення масиву.
1 | ReDim intA (2) |
Ви можете будь -коли змінити розмір динамічного масиву. Однак при використанні оператора ReDim усі наявні значення стираються. Щоб зберегти існуючі значення масиву, використовуйте Заповідник ReDim замість цього.
1 | Захист ReDim intA (2) |
Ви можете оголосити динамічний масив на рівні процедури, модуля або глобального рівня, але ви можете використовувати лише оператор ReDim у межах процедури.
Варіантні масиви
Варіантні масиви - це динамічні масиви, з якими легше працювати.
1 | Dim varNames () |
Зверніть увагу, що вам не потрібно вказувати тип даних (передбачається, що це варіант) або розмір масиву.
Як ми побачимо нижче, ви можете ініціалізувати варіанти масивів за допомогою функції Array (не потрібно спочатку змінювати розміри масивів)!
Заявити модуль та загальнодоступні масиви
Як показано вище, масиви можуть бути оголошені в рамках процедур для використання в рамках цієї процедури:
1234 | Sub StaticArray ()'оголошуємо масив зі значенням LBound 1 і UBound 4Dim IntA (1 до 4) як ціле числоEnd Sub |
Але вони також можуть бути оголошені на модульному або глобальному рівні.
1234567 | Опція явна'оголошуємо масив зі значенням LBound 1 і UBound 4Dim IntA (1 до 4) як ціле числоSub StaticArray ()End Sub |
У цьому прикладі змінну масиву можна викликати будь -де в цьому модулі коду. Замість цього ви можете оголосити загальнодоступний масив, який можна використовувати у вашому проекті VBA (див. Наступний розділ).
Оголошення публічного масиву
Ви оголошуєте публічний статичний масив так само, як і загальнодоступну змінну.
1 | Загальнодоступні strNames (3) як String |
Ця декларація повинна знаходитись у верхній частині вашого модуля, нижче Option Explicit. Потім його можна використовувати у вашому проекті VBA у будь -якому модулі чи процедурі.
Якщо ви оголошуєте масив у верхній частині модуля, але з ключовим словом Dim, то використання цього масиву обмежується цим окремим модулем. Спроба використовувати масив в окремому модулі призведе до помилки.
Ініціалізувати масиви
Ви можете призначити значення статичному масиву таким чином.
1234567891011 | Sub StaticArray ()'оголошуємо масив зі значенням LBound 1 і UBound 4Dim IntA (1 до 4) як ціле число'ініціалізувати масивIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'показати результат положення 2 масиву у безпосередньому вікніНалагодження друку IntA (2)End Sub |
Якщо ви виконаєте описану вище процедуру, значення 20 відобразиться у вікні безпосередньо.
Ви також можете присвоїти значення динамічному масиву таким же чином
12345678910111213 | Піддинамічний масив ()'оголошують динамічний масив, опускаючи зв'язані значенняDim IntA () як Integer'ініціалізувати масивReDim IntA (від 1 до 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'показати результат положення 2 масиву у безпосередньому вікніНалагодження. ДрукIntA (2)End Sub |
Функція масиву
Однак, лише з варіантом масиву, ви можете використовувати функцію масиву, що може бути простіше, ніж використання стандартного методу.
12 | 'заповнити масивintA () = Масив (10, 20, 30, 40) |
Заповнити масив за допомогою циклу
Ви також можете заповнювати масиви, прокручуючи діапазон клітинок у Excel
1234567891011121314151617 | ПідтестDynamicArrayFromExcel ()'оголосити масивDim strNames () Як рядок'оголосити ціле число для підрахунку рядків у діапазоніDim n як ціле число'оголосити ціле число для циклуDim i як ціле число'підрахувати рядки в діапазоніn = Діапазон ("A1", Діапазон ("A1"). Кінець (xlDown)). Rows.Count'зменшити масив до кількості рядків у діапазоні.ReDim strNames (n)Для i = 0 до nstrNames (i) = Діапазон ("A1"). Зсув (i + 1, 0)Далі i'показати значення в масивіMsgBox Join (strNames ())End Sub |
Повторно ініціалізувати масиви
Ви можете повторно ініціалізувати свій масив на будь-якому етапі коду, але тоді ви втратите початкове значення, що міститься в цій позиції вашого масиву.
1234567891011121314 | Sub StaticArray ()'оголошуємо масив зі значенням LBound 1 і UBound 4Dim IntA (1 до 4) як ціле число'ініціалізувати масивIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'показати результат положення 2 масиву у безпосередньому вікніНалагодження друку IntA (2)'знову ініціалізувати масивintA (2) = 200Налагодження друку IntA (2)End Sub |
У наведеному вище прикладі масив Static зберігатиме всі значення, крім значення у позиції 2 - це значення зміниться на 200.
Використання ReDim
Якщо ви використовуєте динамічний масив, оператор ReDim використовується для встановлення розміру вашого масиву. Ви можете використовувати оператор ReDim згодом у своєму коді, щоб змінити розмір масиву стільки разів, скільки потрібно. Рядок коду нижче повторно ініціалізує масив intA до розміру 2 (Пам’ятайте - індекс масиву починається з 0!)
1 | ReDim intA (1) як ціле число |
Отже, код, включаючи оператор ReDim, виглядатиме так, як показано нижче.
1234567891011121314151617 | Sub TestDynamicArray ()'оголосити масивDim intA () як ціле числоReDim intA (2)'заповніть масив числамиintA (0) = 2intA (1) = 5intA (2) = 9'показати номер у позиції 1Налаштування друку intA (1)'зменшіть масив, щоб змінити розмірReDim intA (3)intA (0) = 6intA (1) = 8'цього разу покажи номер у позиції 1Налаштування друку intA (1)End Sub |
Якщо ви запустите описану вище процедуру, значення 5 відображатиметься у безпосередньому вікні, а потім буде показано значення 8, як тільки ми змінимо розмір масиву за допомогою ReDim і заповнимо його знову. Однак, оскільки ми не заповнили IntA (2), і ми не використовували Re-Dim Preserve, значення в цій позиції в масиві буде видалено, і обидві позиції 3 і 4 в масиві будуть нульовими.
Використання ReDim Preserve
Якщо ми використовуємо ReDim Preserve, він зберігатиме вихідні значення, що містяться в масиві.
1234567891011121314151617 | Sub TestDynamicArray ()'оголосити масивDim intA () як ціле числоReDim intA (2)'заповніть масив числамиintA (0) = 2intA (1) = 5intA (2) = 9'Покажіть номер у позиції 2Налаштування друку intA (2)'зменшити масивReDim intA (3)intA (0) = 6intA (1) = 8'знову покажіть номер у позиції 2Налаштування друку intA (2)End Sub |
В обох вікнах повідомлень, відображених вище, число 9 відображатиметься, оскільки оператор ReDim Preserve зберігає це значення в цьому положенні.