Посібник та приклади модуля класу VBA

Цей підручник навчить вас модульним класам у VBA. Ви дізнаєтесь, що це таке і як ними користуватися.

Модулі класу VBA - Вступ

Коли ви вставляєте модулі у редактор Visual Basic (VBE) для введення коду, ви могли помітити, що ви також можете вставити те, що називається «модулем класу».

Модулі класу проти модулів

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

По суті, ви створюєте об'єкт, який працює так само, як і вбудований об'єкт Excel, наприклад "Робочі аркуші". В Об'єкті робочих листів у вас є ряд властивостей і методів, які дозволяють отримати кількість робочих аркушів у робочій книзі або кожне окреме ім'я аркуша або численні інші відомості

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

Окрім посилання на ваш новий об’єкт зі стандартного модуля VBA, ви також можете використовувати його у коді за UserForm, що є частиною вашої користувацької програми

Ви також можете використовувати його там, де ви розмістили елементи керування Active X на робочому аркуші, наприклад, кнопку команди або спадне меню. Усі ці елементи керування використовують VBA, і ваш новий об’єкт можна легко включити до коду події для цих елементів керування.

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

Excel-це багаторівнева програма. Існує рівень обслуговування клієнтів, який керує фактичним вікном робочого аркуша, з яким знайомий користувач. Об’єктна модель Excel - це наступний шар нижче. Натисніть F2 у модулі VBA, і ви зможете побачити величезну кількість об’єктів та членів тих об’єктів, які є двигуном Excel. Зауважте, що ваш новий об’єкт також відображатиметься тут.

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

Створення модуля класу дозволяє розширити об’єктний модуль Excel власними користувацькими об’єктами та членами

Ця стаття пояснює вам, як створити просту ієрархію об’єктів за допомогою модулів класу.

Переваги використання класових модулів

  1. Ви можете розробити надійний будівельний блок, який можна використовувати в будь -якій кількості різних програм Excel
  2. Після його ретельного тестування можна покластися на те, що він завжди дасть правильні результати так само, як і вбудовані об’єкти Excel
  3. Якщо внести оновлення для кодування в іншому місці програми, новий об’єкт продовжуватиме працювати так само
  4. Ви можете використовувати свій новий об’єкт в інших програмах Excel як надбудову
  5. Об’єкти можуть бути повторно використані в інших програмах і допомагають у налагодженні

Недоліки використання модульних класів

  1. Їх важко створити та зрозуміти.
  2. Умови найменування дуже важливі, оскільки це те, що ви побачите, коли використовуєте свій об’єкт у звичайному модулі.
  3. Якщо ви раніше не створювали модуль класу, їх важко зрозуміти, і існує крута крива навчання
  4. Неможливо внести зміни під час виконання-вам потрібно заново налаштувати проект.
  5. Якщо властивості та приватні змінні мають однакову назву, то можуть виникнути нескінченні цикли, що призведе до помилок

Вставка модуля класу

Виберіть Вставити | Модуль класу з меню VBE (редактор Visual Basic). Новий модуль класу автоматично називатиметься «Клас 1», але його потрібно негайно змінити на ім’я, яке ви збираєтесь використовувати для свого об’єкта

Ви змінюєте назву у вікні Властивості, куди вказує стрілка. Ви просто вводите своє нове ім’я, і це зміниться у колекції модулів класу

Якщо вікно Властивості не відображається, виберіть Переглянути | Властивості в меню VBE або натисніть F4

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

Створення об'єктного елемента

У цьому прикладі буде створено об’єкт верхнього рівня під назвою “Мої елементи” з об’єктом-членом під ним під назвою “Мій елемент”, який буде містити окремі дані для кожного елемента. Після створення він працюватиме так само, як і вбудований об’єкт Excel. Наприклад, існує об’єкт під назвою «Робочі листи», який є сукупністю кожного аркуша у вашій книзі. Існує також об’єкт під назвою «Аркуш», який представляє кожен окремий аркуш у вашій книзі та містить усі властивості та методи для кожного аркуша. Цей об’єкт відноситься до об’єкта колекції «Робочі листи».

Ви можете перебирати колекції "Робочі листи", переглядаючи по черзі кожен "Аркуш". Точно так само ви зможете перебирати колекцію "MyItems", переглядаючи властивості, створені вами у члені "Myitem".

Перше, що потрібно зробити, це створити під об’єкт для рівня учасника, який буде містити фактичні елементи в колекції об’єкта верхнього рівня. Це еквівалент членів (наприклад, ім'я, видимий, кількість) у об'єкті "Аркуш" у Excel. Цей код вводиться в модуль класу під назвою "MyItem"

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

У підоб'єкті ми збираємось створити дві властивості для об'єкта - Item і Detail

Спочатку дві рядкові змінні повинні бути оголошені для утримання значень властивостей:

12 Приватний елемент як рядокПриватний mDetail як рядок

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

Їм потрібно надати унікальні імена, щоб вони відрізнялися від властивостей, які ми збираємось створити, тому перед кожним іменем ставиться «m» (для члена).

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

Наступним кроком є ​​налаштування коду для надання доступу до двох властивостей. Ви робите це за допомогою інструкції Property Let та Property Get для кожної властивості. Вони повинні бути відкритими, інакше об’єкт верхнього рівня не матиме видимих ​​властивостей

123456789101112131415 Загальнодоступна власність елемента (vdata як рядок)mItem = vdataКінцева власністьГромадська власність Отримати Item () як рядокПункт = mItemКінцева власністьПублічна власність Деталізувати (vdata As String)mDetail = vdataКінцева власністьГромадська власність Отримати Detail () як рядокДеталь = мДеталіКінцева власність

Цей код створює засоби для зчитування та запису значень для двох властивостей (Item та Detail), використовуючи дві приватні змінні, які були визначені в розділі оголошень модуля.

Параметр "vdata" використовується для передачі даних до відповідної властивості.

Важливо, щоб кожна властивість мала оператори "Let" та "Get", а ім'я властивості в кожному випадку було однаковим. Якщо ви написали помилку, ви могли б мати дві різні властивості - одну, з якої ви можете читати, та іншу, у яку можна писати!

Щоб допомогти у створенні цього коду, ви можете скористатися командою Вставити | Процедура в меню VBE для створення скелета коду, який створить початковий код для властивостей "Get" та "Let" для даної назви властивості

Це відкриє спливаюче вікно, у якому ви вводите назву власності та вибираєте "Властивість" на перемикачах:

Натисніть "OK", і код скелета буде додано до модуля класу:

1234567 Громадська власність Отримати MyProperty () як варіантКінцева власністьПублічна власність Нехай MyProperty (ByVal vNewValue як варіант)Кінцева власність

Це запобігає будь -яким помилкам щодо назв властивостей. Ви просто додаєте свій код між заявами «Громадська власність» та «Кінцева власність».

Тепер у вас є об’єкт під назвою “MyItem”, який міститиме всі дані для цієї вправи.

Втомилися від пошуку прикладів коду VBA? Спробуйте AutoMacro!

Створення колекції

Наступним етапом є створення об’єкта верхнього рівня як об’єкта Collection, щоб надати доступ до властивостей, які ви встановили в об’єкті “MyItem”

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

1 Приватні предмети як колекція

Знову ж таки, це має мати унікальне ім'я, тому перед ім'ям є "m" (об'єкт -член), а також він оголошений як "приватний", щоб він не з'являвся під час створення нового об'єкта використовується

Далі вам потрібно заповнити код Class_Initialize. Це виконується, коли ви вперше використовуєте об’єкт у своєму коді, і він визначає, які значення будуть завантажені в об’єкт

Ви можете отримати доступ до цієї підпрограми, вибравши «Клас» у першому спадному меню та «Ініціалізувати» у другому спадному вікні вікна модуля

12345678910 Приватний підклас_Initialize ()Затемнити об’єкт як мій елементВстановити mItems = Нова колекціяДля n = 1 до 3Встановити objItem = Новий MyItemobjItem.Item = Робочі аркуші ("Аркуш1"). Діапазон ("а" & n). ЗначенняobjItem.Detail = Робочі аркуші ("Sheet1"). Діапазон ("b" & n). ЗначенняmItems.Add objItemДалі пEnd Sub

Код налаштовує об'єкт під назвою "objItem", використовуючи визначення "MyItem", яке ми побудували раніше як модуль класу.

Потім він створює нову колекцію на основі об’єкта «mItems», визначеного раніше

Він перебирає значення, що містяться на аркуші 1 книги, і поміщає їх у властивості, які ми створили для об’єкта «MyItem». Зауважте, що коли ви використовуєте "objitem", з'являється спадне меню з двома властивостями, так само, як якщо б ви використовували вбудований об'єкт Excel.

Потім об’єкт item додається до об’єкта колекції, який тепер містить усі дані у значеннях властивостей.

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

Потім вам потрібно додати загальнодоступну функцію під назвою "Item"

123 Загальнодоступна функція (індекс як ціле число) як MyItemВстановити елемент = mItems.Item (індекс)Функція завершення

Це дозволяє посилатися на окремі об’єкти в об’єкті колекції за їхнім індексним номером. Ця функція забезпечує «дзеркало» того, що відбувається у колекції «mMyItems» у фоновому режимі.

Вам також потрібно буде додати властивість під назвою "Count", щоб ваш код міг встановити, скільки об'єктів "MyItem" є у колекції "MyItems", якщо ви захочете повторити її.

123 Громадська власність Get Count () As LongCount = mItems.CountКінцева власність

У цьому випадку вам потрібна лише властивість "Отримати", оскільки вона доступна лише для читання. Він використовує колекцію mItems, оскільки це вже має властивість count.

Тепер у вас є об'єкт (MyItems) з повною ієрархією, визначеною об'єктом "MyItem"

Щоб все запрацювало, тепер вам потрібно заповнити аркуш (Sheet1) даними, щоб процедура ініціалізації класу могла зібрати це в об’єкт

Ваша електронна таблиця має виглядати так:

Використання нового об’єкта

Тепер ви можете використовувати об’єкт колекції (MyItems) у стандартному модулі Excel VBA. Введіть наступний код:

12345678 Sub test_object ()Затемнити MyClass як нові елементи, n як ціле числоMsgBox MyClass.CountДля n = 1 до MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailДалі пEnd Sub

Цей код створює об’єкт під назвою “MyClass” на основі створеного вами об’єкта колекції “MyItems”. Це вимикає процедуру "Ініціалізувати", яка витягує всі дані з аркуша в об'єкт.

Він відображає кількість елементів у колекції, а потім перебирає колекцію, показуючи текст "Елемент" та "Деталь". Ви помітите, що коли ви посилаєтесь на об’єкт «MyClass» у своєму коді, ви побачите список двох властивостей -членів, які допомагають додати правильну властивість.

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

Якщо ви використовуєте слово "Static" замість "Dim", процедура ініціалізації не запускається, а старі значення зберігаються, доки код працює постійно. Якщо дані електронної таблиці зміняться, це не відобразиться в об’єкті

1234567 Sub Test_Static ()Статичний Myclass як нові MyItems, n як ціле числоДля n = 1 до Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailДалі пEnd Sub

Короткий зміст створення об’єкта за допомогою модуля класу

Як ви бачили, створення ієрархії модулів класів для використання як об’єкта є досить складною справою, навіть для такої простої структури, як наведений тут приклад. Можливості помилок величезні!

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

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

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

Крім того, якщо дані змінюються в електронній таблиці (або у зв'язаній базі даних, якщо ви використовували це як джерело даних у своєму модулі класу), щоразу, коли ви використовуєте оператор "Dim", буде викликатися процедура ініціалізації, і дані будуть миттєво оновлені . Не потрібно писати код для повторного заповнення масиву.

Використання модуля класу для створення сховища змінних

Коли ви пишете код VBA, ви всюди використовуєте змінні, всі з різними областями застосування. Деякі можуть бути визначені лише для певної процедури, деякі для певного модуля, а деякі можуть бути глобальними змінами, які можна використовувати у всьому додатку

Ви можете створити модуль класу, який міститиме велику кількість змінних, а оскільки це об’єкт, його можна використовувати будь -де у вашому коді, навіть у формі користувача або в елементі керування Active X, який ви розмістили на робочому аркуші.

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

Щоб створити сховище, потрібно вставити новий модуль класу. Ви робите це за допомогою Insert | Модуль класу з меню VB Editor

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

Введіть наступний код:

12345678910111213141516 Приватний мВ як варіантГромадська власність Отримати змінну1 () як варіантЗмінна1 = мВКінцева власністьПублічна властивість Let Variable1 (ByVal vNewValue як варіант)mV = vНове значенняКінцева власністьГромадська власність Отримати змінну2 () як варіантЗмінна1 = мВКінцева власністьПублічна властивість Let Variable2 (ByVal vNewValue як варіант)mV = vНове значенняКінцева власність

Цей код встановлює властивості "Let" та "Get" для двох змінних ("Variable1" та "Variable2"). Властивості Let and Get необхідні для кожної з ваших змінних, щоб вони могли читати / записувати

Ви можете використовувати власні імена для змінних замість зразків у цьому коді, а також можете додавати інші змінні, переконавшись, що кожна нова змінна має оператори "Let" та "Get".

Приватне оголошення змінної "mV" полягає у створенні робочої змінної, яка використовується лише в модулі класу для передачі значень.

Щоб використовувати сховище змінних, введіть такий код у стандартний модуль:

123456 Глобальний VarRepo як нові MyVariablesSub TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1End Sub

Цей код створює глобальний екземпляр створеного вами об’єкта «MyVariables». Цю декларацію потрібно зробити лише один раз з будь -якого місця вашого коду.

Код спочатку відображає значення "Змінна1", щоб показати, що воно порожнє.

“Змінній1” присвоюється значення 10, а потім відображається нове значення в об’єкті, щоб показати, що ця властивість тепер містить це значення.

Оскільки екземпляр об’єкта “MyVariables” визначено глобально, ви можете звертатися до будь -якої із визначених змінних у об’єкті з будь -якої точки коду.

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

Перетворення вашого об’єкта в надбудову

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

Для цього потрібно лише зберегти файл як надбудову. Виберіть Файл | Зберегти як і з’явиться вікно браузера

Виберіть тип файлу як надбудову (.xlam) у спадному меню типу файлу та натисніть OK. За замовчуванням файл буде збережено у папці надбудови, але ви можете змінити розташування.

Потім ви можете включити файл надбудови у свої програми Excel, що дає вам можливість використовувати ваш новий об’єкт

Щоб включити свою нову надбудову до Excel, натисніть Файл на стрічці Excel, а потім натисніть Опції внизу лівої панелі

Натисніть «Надбудови» на лівій панелі у спливаючому вікні, що з’явиться. У нижній частині вікна є кнопка з написом "Перейти"

Натисніть на це, і з’явиться спливаюче вікно «Надбудова». Натисніть «Огляд», а потім знайдіть файл надбудови. Після цього ви зможете посилатися на свій об’єкт у своєму коді.

Ви допоможете розвитку сайту, поділившись сторінкою з друзями

wave wave wave wave wave