Список масивів VBA

Зміст

Об'єкт ArrayList схожий на об'єкт Collection, але він має набагато більше методів і властивостей, а отже, набагато більшу гнучкість з точки зору програмування.

Об’єкт Collection має лише два методи (Add, Remove) та дві властивості (Count, Item), тоді як List Array List має набагато більше. Крім того, об'єкт Collection тільки для читання. Після додавання значень індексоване значення не можна змінити, тоді як у списку масивів можна редагувати.

Багато методів списку масивів використовують параметри. На відміну від багатьох стандартних методів VBA, жоден із цих параметрів не є необов’язковим. Крім того, деякі методи та властивості не завжди вводяться з великої літери при введенні так само, як у Excel VBA. Однак вони все ще працюють.

Об'єкт ArrayList розширюється і скорочується за розміром відповідно до того, скільки елементів він містить. Перед використанням його не потрібно розмірювати, як масив.

Список масивів є одновимірним (таким же, як і об'єкт Collection), а типом даних за замовчуванням є Variant, що означає, що він прийматиме будь -які типи даних, будь то числові, текстові або дати.

Багато в чому Список масивів усуває ряд недоліків об'єкта Collection. Безумовно, він набагато гнучкіший у своїх можливостях.

Об'єкт Список масивів не є частиною стандартної бібліотеки VBA. Ви можете використовувати його у своєму коді Excel VBA, використовуючи пізнє або раннє прив’язування

1234 Sub LateBindingExample ()Затемнити MyList як об'єктВстановити MyList = CreateObject ("System.Collections.ArrayList")End Sub
123 Sub EarlyBindingExample ()Dim MyList As New ArrayListEnd Sub

Для того, щоб скористатися раннім прикладом прив’язки, потрібно спочатку ввести посилання у VBA на файл ‘mscorlib.tlb’

Для цього виберіть «Інструменти | Посилання ‘з вікна редактора Visual Basic (VBE). З'явиться спливаюче вікно з усіма доступними посиланнями. Прокрутіть униз до "mscorlib.dll" і поставте прапорець біля нього. Натисніть OK, і ця бібліотека тепер є частиною вашого проекту:

Одним з великих недоліків об’єкта списку масивів є те, що він не має „Intellisense”. Зазвичай, коли ви використовуєте об’єкт у VBA, такий як діапазон, ви побачите спливаючий список усіх доступних властивостей та методів. Ви не отримуєте це за допомогою об'єкта Array List, і іноді це потребує ретельної перевірки, щоб переконатися, що ви правильно написали метод або властивість.

Крім того, якщо натиснути клавішу F2 у вікні VBE і виконати пошук за записом "arraylist", нічого не відображатиметься, що не дуже корисно для розробника.

Ваш код буде працювати набагато швидше з ранньою прив'язкою, тому що весь він скомпільований заздалегідь. З пізнім прив'язкою об'єкт потрібно компілювати під час виконання коду

Розповсюдження програми Excel, що містить список масивів

Як уже зазначалося, об’єкт ArrayList не є частиною Excel VBA. Це означає, що будь -який з ваших колег, яким ви розповсюджуєте додаток, повинен мати доступ до файлу "mscorlib.tlb"

Зазвичай цей файл знаходиться у:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

Можливо, варто написати деякий код (за допомогою методу Dir), щоб перевірити, чи існує цей файл, коли користувач завантажує програму, щоб вони відчули "м'яку посадку", якщо її не знайшли. Якщо його немає, а код працює, то виникатимуть помилки.

Крім того, у користувача повинна бути встановлена ​​правильна версія .Net Framework. Навіть якщо у користувача є більш нова версія, V3.5 повинен бути встановлений, інакше ваша програма не працюватиме

Область застосування об’єкта списку масивів

З точки зору обсягу, об’єкт Список масивів доступний лише тоді, коли книга відкрита. Він не зберігається, коли зберігається книга. Якщо книга знову відкривається, то об’єкт Список масивів потрібно створити за допомогою коду VBA.

Якщо ви хочете, щоб ваш список масивів був доступний для всього коду у вашому модулі коду, вам потрібно оголосити об’єкт списку масивів у розділі «Оголошення» у верхній частині вікна модуля.

Це гарантує, що весь ваш код у цьому модулі зможе отримати доступ до списку масивів. Якщо ви хочете, щоб будь -який модуль у вашій книзі мав доступ до об’єкта Список масивів, то визначте його як глобальний об’єкт

1 Глобальна колекція MyCollection як новий список масивів

Заповнення та читання з вашого списку масивів

Найпростіша дія, яку ви хочете виконати, - це створити список масивів, внести в нього деякі дані, а потім довести, що дані можна прочитати. Усі приклади коду в цій статті передбачають, що ви використовуєте раннє прив’язування, і додали "mscorlib.tlb" до посилань VBA, як описано вище

123456789101112 Sub ArrayListExample ()"Створити новий об'єкт списку масивівDim MyList As New ArrayList"Додати елементи до спискуMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"«Повторюйте список масивів, щоб довести значенняДля N = 0 до MyList.Count - 1Мій список MsgBox (N)Далі NEnd Sub

У цьому прикладі створюється новий об’єкт ArrayList, заповнюється його 3 елементами та відбувається ітерація у списку, що відображає кожен елемент.

Зверніть увагу, що індекс ArrayList починається з 0, а не з 1, тому вам потрібно відняти 1 від значення Count

Ви також можете використовувати цикл "Для … Кожного", щоб прочитати значення:

123456789101112 Sub ArrayListExample ()"Створити новий об'єкт списку масивівDim MyList As New ArrayList"Додати елементи до спискуMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"«Повторюйте список масивів, щоб довести значенняДля кожного я в MyListMsgBox IДалі яEnd Sub

Редагування та зміна елементів у списку масивів

Основною перевагою списку масивів перед колекцією є те, що елементи у списку можна редагувати та змінювати у вашому коді. Об'єкт Collection тільки для читання, тоді як об'єкт Array List - для читання / запису

123456789101112131415 Sub ArrayListExample ()"Створити новий об'єкт списку масивівDim MyList As New ArrayList"Додати елементи до спискуMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Змінити пункт 1 з" Елемент2 "на" Змінено "MyList (1) = "Змінено"«Повторіть список масивів, щоб довести, що зміни спрацювалиДля кожного я в MyList"Відобразити назву елементаMsgBox IДалі яEnd Sub

У цьому прикладі другий елемент, "Item2", змінюється на значення "Changed" (пам'ятайте, що індекс починається з 0). Коли ітерація виконується в кінці коду, відображатиметься нове значення

Додавання масиву значень до списку масивів

Ви можете вводити значення до свого списку масивів за допомогою масиву, що містить список цих значень або посилання на значення клітинок на аркуші

123456789101112131415161718 Sub AddArrayExample ()‘Створити об’єкт списку масивівDim MyList As New ArrayList"Перебирати значення масиву, додаючи їх до списку масивівДля кожного v масиву ("A1", "A2", "A3")"Додайте значення кожного масиву до спискуMyList.Add vДалі"Перебирати значення масиву з посиланнями на аркуші, додаючи їх до списку масивівДля кожного v в масиві (діапазон ("A5"). Значення, діапазон ("A6"). Значення)MyList.Add vДалі«Повторюйте список масивів, щоб довести значенняДля N = 0 до MyList.Count - 1"Відобразити елемент спискуMsgBox MyList.Item (N)Далі NEnd Sub

Читання / отримання діапазону елементів зі списку масивів

Використовуючи метод GetRange у списку масивів, ви можете вказати низку послідовних елементів, які потрібно отримати. Необхідними двома параметрами є вихідна позиція індексу та кількість елементів, які потрібно отримати. Код заповнює другий об'єкт списку масивів підмножиною елементів, які потім можна прочитати окремо.

123456789101112131415161718 Sub ReadRangeExample ()«Визначте об’єктиЗатемнити MyList як новий ArrayList, MyList1 як об'єкт"Додати елементи до об'єкта" MyList "MyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item6"MyList.Add "Item4"MyList.Add "Item7""Захоплення 4 елементів у" MyList ", починаючи з позиції індексу 2Встановити MyList1 = MyList.GetRange (2, 4)"Ітерація через об'єкт" MyList1 "для відображення підмножини елементівДля кожного я в MyList1"Відобразити назву елементаMsgBox IДалі яEnd Sub

Пошук елементів у списку масивів

Ви можете перевірити, чи є названий елемент у вашому списку, за допомогою методу "Містить". Це поверне True або False

1 MsgBox MyList.Contains ("Item2")

Ви також можете знайти фактичну позицію індексу за допомогою методу "IndexOf". Вам потрібно вказати початковий індекс для пошуку (зазвичай 0). Повернене значення - це індекс першого екземпляра знайденого елемента. Потім можна використовувати цикл, щоб змінити початкову точку на наступне значення індексу, щоб знайти подальші екземпляри, якщо є кілька повторюваних значень.

Якщо значення не знайдено, повертається значення -1

У цьому прикладі демонструється використання "Містить", елемент не знайдено, а також перегляд списку масивів для визначення позиції всіх повторюваних елементів:

1234567891011121314151617181920212223242526 Sub SearchListExample ()"Визначте список масивів та змінніDim MyList As New ArrayList, Sp As Integer, Pos As Integer"Додайте нові елементи, включаючи дублікатMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1""Тест на наявність" Item2 "у списку - повертає TrueMsgBox MyList.Contains ("Item2")"Отримати індекс неіснуючого значення -повертає -1MsgBox MyList.IndexOf ("Елемент", 0)"Встановіть початкову позицію пошуку на нульSp = 0"Повторюйте список, щоб отримати всі позиції" Item1 "Зробити"Отримайте позицію індексу наступного" Елементу1 "на основі позиції у змінній" Sp "Pos = MyList.IndexOf ("Item1", Sp)"Якщо не знайдено жодних інших екземплярів" Item1 ", вийдіть із циклуЯкщо Pos = -1, то вийдіть з Do"Відображення наступного знайденого екземпляра та позиції індексуMsgBox MyList (Pos) & "за індексом" & Pos"Додайте 1 до останнього знайденого значення індексу - це тепер стає новою початковою позицією для наступного пошукуSp = Pos + 1ПетляEnd Sub

Зауважте, що використаний текст пошуку чутливий до регістру, і символи підстановки не приймаються.

Вставлення та вилучення елементів

Якщо ви не хочете додавати свої елементи в кінець списку, ви можете вставити їх у певну позицію індексу, щоб новий елемент знаходився посередині списку. Номери індексу будуть автоматично коригуватися для наступних пунктів.

123456789101112131415 Sub InsertExample ()‘Визначте об’єкт списку масивівDim MyList As New ArrayList"Додати елементи до списку масивівMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1""Вставте" елемент 6 "у позицію індексу 2MyList.Insert 2, "Item6""Повторюйте елементи списку масивів, щоб показати новий порядок та позицію індексуДля N = 0 до MyList.Count - 1MsgBox MyList (N) & "Index" & NДалі NEnd Sub

У цьому прикладі "Item6" додається до списку у позиції індексу 2, тому "item3", який був у позиції індексу 2, тепер переміщується до позиції індексу 3

Окремий елемент можна видалити за допомогою методу «Видалити».

1 MyList.Remove "Item"

Зверніть увагу, що помилки не виникає, якщо назва товару не знайдена. Усі наступні номери індексів будуть змінені відповідно до видалення.

Якщо ви знаєте позицію індексу елемента, ви можете скористатися методом "RemoveAt", наприклад

1 MyList.RemoveAt 2

Зауважте, що якщо позиція індексу більша за кількість елементів у списку масивів, то буде повернуто помилку.

Ви можете видалити діапазон значень зі списку за допомогою методу "RemoveRange". Параметри - це початковий індекс, а потім кількість елементів для видалення, наприклад.

1 MyList.RemoveRange 3, 2

Зверніть увагу, що у вашому коді ви отримаєте помилку, якщо кількість елементів, зміщених від початкового значення, більша за кількість елементів у списку масивів.

І в методах "RemoveAt" і "RemoveRange" доцільно використати деякий код, щоб перевірити, чи вказані номери індексів перевищують загальну кількість елементів у списку масивів, щоб уловлювати можливі помилки. Властивість ‘Count’ дасть загальну кількість елементів у списку масивів.

12345678910111213141516171819202122232425 Sub RemoveExample ()‘Визначте об’єкт списку масивівDim MyList As New ArrayList"Додати елементи до списку масивівMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"MyList.Add "Item4"MyList.Add "Item5""Вставте" елемент 6 "у позицію індексу 2MyList.Insert 2, "Item6""Видалити" Item2 "MyList.Remove "Item2""Видалити" елемент " - цього немає у списку масивів, але не виникає помилкаMyList.Remove "Item""Видаліть елемент у позиції індексу 2MyList.RemoveAt 2"Видаліть 2 послідовні елементи, починаючи з позиції індексу 2MyList.RemoveRange 3, 2«Повторіть список масив, щоб показати, що залишилося і в якому місці індексу він зараз знаходитьсяДля N = 0 до MyList.Count - 1MsgBox MyList (N) & "Index" & NДалі NEnd Sub

Зауважте, що якщо ви використовуєте "RemoveAt", щоб видалити елемент у певній позиції, як тільки цей елемент буде видалено, усі наступні позиції індексу будуть змінені. Якщо у вас є декілька видалень за допомогою позиції індексу, тоді гарна ідея - почати з найбільшого номера індексу і зробити крок назад до позиції нуль, щоб ви завжди видаляли правильний елемент. Таким чином у вас не виникне проблеми

Сортування списку масивів

Ще одна велика перевага перед колекцією полягає в тому, що ви можете сортувати елементи за зростанням або спаданням.

Об’єкт «Список масивів» - єдиний об’єкт у Excel VBA з методом сортування. Метод сортування дуже швидкий, і це може бути важливою умовою для використання списку масивів.

В об’єкті колекції для сортування всіх елементів потрібне деяке “нестандартне” мислення, але зі списком масивів це дуже просто.

Метод "Сортувати" сортується за зростанням, а метод "Зворотний" - за спаданням.

12345678910111213141516171819202122 Sub ArrayListExample ()"Створити об'єкт" Список масивів "Dim MyList As New ArrayList"Додайте елементи в несортуваному порядкуMyList.Add "Item1"MyList.Add "Item3"MyList.Add "Item2""Сортувати предмети за зростаннямMyList.Sort«Повторюйте елементи, щоб показати їх зростанняДля кожного я в MyList"Відобразити назву елементаMsgBox IДалі я"Сортувати предмети за спаданнямMyList.Reverse«Повторюйте елементи, щоб показати їх спаданняДля кожного я в MyList"Відобразити назву елементаMsgBox IДалі яEnd Sub

Клонування списку масивів

Список масивів має можливість створити клон або його копію. Це корисно, якщо користувач вносить зміни до елементів за допомогою інтерфейсу та вашого коду VBA, але вам потрібно зберегти копію елементів у вихідному стані як резервну копію.

Це може надати користувачеві функцію "Скасувати". Можливо, вони внесли зміни та бажають повернутися до початкового списку.

123456789101112131415 Sub CloneExample ()«Визначте два об’єкти - список масивів та об’єктЗатемнити MyList як новий ArrayList, MyList1 як об'єкт"Заповніть перший об'єкт елементамиMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Скопіювати мій список у MyList1Встановити MyList1 = MyList.Clone"Повторіть через MyList1, щоб довести клонуванняДля кожного я в MyList1"Відобразити назву елементаMsgBox IДалі яEnd Sub

"MyList1" тепер містить усі елементи з "MyList" у тому ж порядку

Копіювання масиву списку в звичайний об’єкт масиву VBA

Ви можете скористатися простим методом, щоб скопіювати список масивів у звичайний масив VBA:

123456789101112131415 Sub ArrayExample ()«Створіть об’єкт списку масивів та стандартний об’єкт масивуDim MyList As New ArrayList, NewArray As Variant"Заповнити список масивів елементамиMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Скопіюйте список масивів до нового масивуNewArray = MyList.ToArray«Ітерація по новому масиву - зверніть увагу, що кількість списків масивів забезпечує максимальний індексДля N = 0 до MyList.Count - 1"Відобразити назву елементаMsgBox NewArray (N)Далі NEnd Sub

Копіювання масиву списку в діапазон аркушів

Ви можете скопіювати свій список масивів на певний аркуш та посилання на клітинку без необхідності повторювати список масив. Потрібно вказати лише перше посилання на клітинку

123456789101112131415 Піддіапазон Приклад ()"Створити новий об'єкт списку масивівDim MyList As New ArrayList"Додати елементи до спискуMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Очистіть аркуш ціліАркуші ("Лист1"). UsedRange.Clear"Копіювати елементи через рядокАркуші ("Sheet1"). Діапазон ("A1"). Змінити розмір (1, MyList.Count) .Value = MyList.toArray"Скопіювати елементи вниз у стовпецьАркуші ("Sheet1"). Діапазон ("A5"). Змінити розмір (MyList.Count, 1) .Value = _WorksheetFunction.Transpose (MyList.toArray)End Sub

Очистити всі елементи зі списку масивів

Існує проста функція (Очистити) для повного очищення списку масивів

1234567891011121314 Sub ClearListExample ()‘Створити об’єкт списку масивівDim MyList As New ArrayList"Додайте нові елементиMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Показати кількість предметівMsgBox MyList.Count"Очистити всі елементиMyList.Clear"Покажіть кількість предметів, щоб довести, що очищення спрацювалоMsgBox MyList.CountEnd Sub

У цьому прикладі створюються елементи у списку масивів, а потім очищається список масивів. Поля повідомлень доводять до і після кількості елементів у списку масивів.

Зведення методів списку масивів для Excel VBA

Завдання Параметри Приклади
Додати / змінити елемент Цінність MyList.Add “Item1”
MyList (4) = “Елемент2”
Клонування списку масивів Жодного Затемнити MyList як об'єкт
Встановіть MyList2 = MyList.Clone
Копіювати в масив Жодного Dim MyArray як варіант
MyArray = MyList.ToArray
Копіювати в діапазон аркуша (рядок) Жодного Аркуші ("Аркуш1"). Діапазон ("A1"). Змінити розмір (1, MyList.Count) .Value = MyList.ToArray
Копіювати в діапазон робочого аркуша (стовпець) Жодного Аркуші ("Sheet1"). Діапазон ("A3"). Змінити розмір (MyList.Count, 1) .Value = WorksheetFunction.Transpose (MyList.ToArray)
Створити "System.Collections.ArrayList" Затемнити MyList як об'єкт
Встановити MyList = CreateObject (“System.Collections.ArrayList”)
Заявити Н/Д Затемнити MyList як об'єкт
Знайдіть / перевірте, чи існує елемент Предмет для пошуку MyList.Contains ("Item2")
Знайдіть позицію елемента в ArrayList 1. Предмет для пошуку. Індекс затемнення: не так довго
2. Позиція, з якої можна почати пошук. IndexNo = MyList.IndexOf (“Item3”, 0)
IndexNo = MyList.IndexOf (“Item5”, 3)
Отримайте кількість предметів Жодного MsgBox MyList.Count
Вставити елемент 1. Покажчик - позиція для вставки. MyList.Insert 0, “Item5”
2 Значення - об'єкт або значення для вставлення. MyList.Insert 4, “Item7”
Прочитайте пункт Індекс - довге ціле число MsgBox MyList.Item (0)
MsgBox MyList.Item (4)
Прочитайте останній доданий елемент Індекс - довге ціле число MsgBox MyList.Item (list.Count - 1)
Спочатку прочитайте доданий елемент Індекс - довге ціле число MsgBox MyList.Item (0)
Прочитайте всі пункти (для кожного) Н/Д Затемнений елемент як варіант
Для кожного елемента в MyList
Елемент MsgBox
Наступний елемент
Прочитати всі предмети (Для) Індекс - довге ціле число Dim i As Long
Для i = 0 до MyList.Count - 1
MsgBox i
Далі i
Видалити всі елементи Жодного MyList.Clear
Видаліть елемент на місці Позиція індексу, де знаходиться елемент MyList.RemoveAt 5
Видалити елемент за назвою Елемент для видалення зі списку масив MyList.Remove “Item3”
Видаліть ряд елементів 1. Покажчик - вихідна позиція. MyList.RemoveRange 4,3
2. Count - кількість елементів, які потрібно видалити.
Сортувати за спаданням Жодного MyList.Reverse
Сортувати в порядку зростання Не MyList.Sort
wave wave wave wave wave