Створення об'єктів collection
Ця книга допоможе освоїти інтегроване середовище розробки VBA і навчитися програмувати в VBA з використання об'єктів, їх властивостей, методів і подій. Обговорювані прийоми програмування ілюструються прикладами, які можна відразу ж випробувати на практиці. Отримані знання ви зможете застосувати як для настроювання й удосконалення популярний офісних додатків, включаючи додатки Office XP, так і для створення власних додатків.
Книга розрахована на тих, хто збирається швидко і без зайвих зусиль навчитися програмувати для Windows, використовуючи VBA.
Книга: VBA для чайників
Створення об'єктів Collection
Створення об'єктів Collection
Об'єкти Соlection створюються в програмі точно так же, як і будь-які інші об'єкти, з використанням ключового слова As для визначення типу. Як і з іншими об'єктами, вас є на вибір два варіанти.
* Можна оголосити ім'я змінної для об'єкта і потім використовувати оператор Set, щоб створити її. При цьому в операторі Set потрібно використовувати ключове слово New, щоб створити нову колекцію. наприклад:
Dim colMixedBag As Collection
Set colMixedBag = New Collection
colMixedBag.Add "Howard, Ethel"
Dim colSetOfStuff As New Collection
'Наступний оператор створює колекцію
'При додаванні в неї цілого значення
Для заповнення створеної колекції даними використовуйте метод Add (Додати) точно так же, як при додаванні об'єктів у вбудовані колекції VBA-додатки (див, розділ 12). Приклади використання методу Add ви знайдете і в попередньому розділі.
Синтаксис методу Add виглядає так:
Add (елемент [, ім'я] [, before індекс] [, after індекс])
При цьому вираз елемент обов'язкове, воно може бути буквальним значенням, змінної, посиланням на об'єкт або більш складним виразом, складеним з цих компонентів, - загалом, всім, що повертає значення, распознаваемое VBA. Інші аргументи методу Add необов'язкові, вони обговорюються в наступних розділах.
В общем-то, завжди можна звернутися до елементу колекції по його індексу в цій колекції, ло часто зручніше призначити елементу інформативне ім'я. Для цього потрібно при добаюекіі елемента R колекцію вказати його ім'я у вигляді рядка:
У цьому операторі в колекції colFinancials додається значення 14323 .44. Одночасно для цього елемента створюється ім'я. Цілком допустимо при завданні імені використовувати змінну типу String.
Ім'я не тільки легше запам'ятати, ніж індекс, воно, до того ж, забезпечує єдиний надійний спосіб доступу до конкретного елементу колекції. При використанні методів Add і Remove позиції елементів даних в колекції можуть змінюватися. Навіть якщо елемент з №69 стане 29-м, ви все одно зможете скористатися значенням цього елемента, якщо знаєте його ім'я.
Ім'я елементу можна привласнити тільки за допомогою методу Add. Щоб привласнити ім'я елементу, вже існуючому без імені, доведеться видалити наявну копію за допомогою Remove і використовувати Add для додавання елемента знову.
Іноді зручно розмістити елементи колекції в певному порядку. І навіть якщо при цьому не можна додавати елементи в потрібному порядку послідовно, то все одно немає проблем - метод Add дозволяє вставляти елементи туди, куди потрібно, просто доя цього потрібно використовувати аргументи before (.Перед) і after (після).
Припустимо, що вам потрібно вставити новий елемент перед 35-м елементом в колекції.
Ви можете використовувати для цього оператор такого вигляду:
colAnimals. Add strSpecies, before 35
Доданий елемент стане 35-м елементом колекції, посунувши всі наступні (На відміну від-масивів, елементи колекцій нумеруються з 1.) Щоб повідомити VBA, де вставити новий елемент, можна використовувати і ім'я існуючого елемента, наприклад:
colОвощі. Add = stiCopt, after "Помідор"
В даному випадку VBA знайде в колекції існуючий елемент з ім'ям Помідор і відразу після нього вставить новий.
Ясно, що в оператор, який використовує метод Add, можна включити або before, або after, але ніяк не обидва цих аргументу.
Щоб додати до колекцію безлічі елементів можна використовувати цикл For. Next, подібно до того, як це робилося з масивами. наприклад:
Dim X As Integer, Y As Integer
colHouseOfValues.Add Y * X
Говорячи очевидне, повідомляю вам, що метод Remove видаляє елемент з колекції. Об'єкт для видалення можна задати або за допомогою індексу, або за допомогою імені, наприклад:
Не забувайте, що при видаленні елемента, VBA, так би мовити, "заповнює дірки" - номери всіх елементів, наступних за віддаленим, зменшаться на 1.
Заплутатися в розмірах колекції нескладно, особливо після багаторазового використання Add і Remove. Родовий об'єкт Collection має тільки одну властивість - Count (підрахунок), - але, з огляду на вищесказане, це властивість виявляється життєво важливим. Значення цієї властивості можна привласнити змінної, наприклад, так:
Його можна також використовувати в умовному вираженні, як тут:
If colPrices.Count> 1000
MsgBox "Занадто багато позицій!"
Крім того, значення властивості Count можна використовувати в циклі For. Next, щоб виконати деякі дії по відношенню до всіх елементів колекції, наприклад:
Dim Z As Integer
For Z = 1 To col Prices.Count
MsgBox "Ціна" col Prices (Z)
Але краще для цього використовувати цикл For Each. Next (див. Розділ 8).
Щоб ідентифікувати конкретний елемент в колекції, використовується індекс елемента або його ім'я (якщо воно визначено). Наприклад, значення елемента колекції можна привласнити змінної:
datДеньРожденія = colДніРожденія ( "Василь Алі-Бабаевіч")
На жаль, вам доведеться відстежувати імена самим - VBA не пропонує можливості прочитати імена елементів колекції. Крім того, не можна змінити ім'я елемента інакше, як видаливши цей елемент з колекції і потім додавши його знову.
Точно так же не можна в існуючий елемент колекції ввести нове значення. Наступний оператор присвоювання працювати не буде: colInventory (1465) = 119
Знову ж, єдиний спосіб зміни значення в колекції - видалення відповідного елемента і додавання нового з новим значенням. Подібних обмежень немає для об'єктів Dictionary (словник), які обговорюються в главі 14.
Як вже було сказано, застосування класу Collection VBA обмежується тим, що в ньому не можна зберігати дані користувача типів. З цим обмеженням можна змиритися, якщо вибрати відповідну систему створення імен елементів. У наступному прикладі при кожному проході циклу For. Next в колекції створюється запис бази даних. Ця запис складається з трьох полів, кожне з яких ідентифікується ім'ям, складеним з простого описового ознаки і номери записи. Ось відповідний програмний код:
Dim I As Integer, strName As String
Dim strPhone As String, strAddress As String
For I = 1 To Total 'I ідентифікує номер запису
'Отримання даних для цього запису
strName = InputBox ( "Введіть ім'я для цього запису")
'Додавання "полів" для цього запису в коллекційе
colDatabase.Add strName, "Ім'я" I
Згодом можна витягти інформацію, збережену в окремому записі по описовому ознакою і номеру, як в наступному операторі:
Якщо ви збираєтеся створювати реальні програми для управління інформацією в базах даних, не використовуйте для цього колекції об'єктів - вони мають занадто багато обмежень. Замість цього використовуйте підключаються компоненти доступу до баз даних (відповідні приклади ви знайдете в розділі 14). Якщо ж ви хочете виконати всю роботу самостійно, створіть свої власні класи для об'єктів, що дозволяють працювати з одними типами даних. Ваші об'єкти повинні дозволяти зберігати в них будь-які комбінації даних, які могли б вилучатись як властивості. Крім того, непогано було б додати програмний код для перевірки правильності зберігається в окремих елементах інформації. (Модулі класів розглядаються, хоча і не дуже докладно, в розділі 14.)