AaVBA - Няма BB

Този урок ще ви научи за класовите модули във 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“ и щракнете двукратно върху името в дървовидния изглед в Project Explorer, за да се покаже прозорецът с код за него.

Създаване на обект

Този пример ще създаде обект от първо ниво, наречен „MyItems“ с обект член под него, наречен „MyItem“, който ще съдържа отделните данни за всеки елемент. След като бъде създаден, той ще работи по същия начин като вградения в Excel обект. Например, има обект, наречен „Работни листове“, който е колекция от всеки работен лист във вашата работна книга. Има и обект, наречен „Лист“, който представлява всеки отделен работен лист във вашата работна книга и съдържа всички свойства и методи за всеки работен лист. Този обект е свързан с обекта на колекция „Работни листове“.

Можете да преглеждате колекцията „Работни листове“, като разглеждате всеки „Лист“ на свой ред. По същия начин ще можете да преглеждате колекцията „MyItems“, преглеждайки свойствата, които сте създали в члена „Myitem“.

Първото нещо, което трябва да направите, е да създадете под-обект за ниво член, който да съдържа действителните елементи в колекцията на обекта от най-високо ниво. Това е еквивалентът на членовете (например име, видими, брой) в обекта „Лист“ в Excel. Този код се въвежда в модула на класа, наречен „MyItem“

Модулите на класа имат свойства и методи. Свойствата са ефективно като променливи, тъй като съдържат стойности на данни като променливи, а методите са като подпрограми или функции.

В под -обекта ще създадем две свойства за обекта - Item и Detail

Първоначално две низови променливи трябва да бъдат декларирани, за да държат стойностите за свойствата:

12 Частен елемент като низЧастен mDetail As String

Те трябва да бъдат декларирани в раздела Декларации в горната част на кода за модула на класа, така че да могат да се използват във всички подпрограми в целия модул

Трябва да им се дадат уникални имена, за да се различават от свойствата, които ще създадем, така че „m“ (за член) е поставено пред всяко име.

Променливите са декларирани като частни, така че не могат да бъдат видени от никой, който използва обекта. Те са работни променливи за използване в обектния код и не са там като част от крайния обект.

Следващата стъпка е да настроите код, който да даде достъп до двете свойства. Можете да направите това с помощта на свойство Let и свойство Get за всеки имот. Те трябва да са публични, в противен случай обектът от най-високо ниво няма да има никакви видими свойства

123456789101112131415 Публична собственост Нека елемент (vdata като низ)mItem = vdataКрайна собственостПублична собственост Вземете Item () като низItem = mItemКрайна собственостПублична собственост Let Detail (vdata As String)mDetail = vdataКрайна собственостПублична собственост Вземете подробности () като низДетайл = mДетайлКрайна собственост

Този код създава средства за четене и запис на стойности към двете свойства (Item и Detail), използвайки двете частни променливи, които са дефинирани в раздела за декларации на модула.

Параметърът „vdata“ се използва за предаване на данни към съответното свойство.

Важно е всяко свойство да има изявления „Let“ и „Get“ и името на свойството да е едно и също във всеки случай. Можете да получите две различни свойства, ако сте написали грешно - една, от която можете да четете, и друга, в която можете да пишете!

За да помогнете при създаването на този код, можете да използвате Insert | Процедура в менюто VBE за създаване на скелет на код, който ще създаде първоначалния код за свойствата „Get“ и „Let“ за дадено име на свойство

Това ще покаже изскачащ прозорец, в който въвеждате името на имота и избирате „Свойство“ на бутоните за избор:

Кликнете върху „OK“ и скелетният код ще бъде добавен в модула на класа:

1234567 Публична собственост Вземете MyProperty () като вариантКрайна собственостПублична собственост Нека MyProperty (ByVal vNewValue като вариант)Крайна собственост

Това предотвратява всякакви грешки в имената на имоти. Просто добавяте кода си между изявленията „Публична собственост“ и „Крайна собственост“.

Вече имате обект, наречен „MyItem“, който ще съхранява всички данни за това упражнение.

Уморени ли сте от търсене на примери за VBA код? Опитайте AutoMacro!

Създаване на колекция

Следващият етап е да създадете обект от най-високо ниво като обект на колекция, за да дадете достъп до свойствата, които сте задали в обекта „MyItem“

Отново трябва да дефинирате работен обект, който да действа като обект на събиране по същия начин, по който сте дефинирали двете низови променливи в обекта „MyItem“.

1 Частни артикули като колекция

Отново, това трябва да има уникално име, поради което има 'm' (обект -член) пред името, а също така е деклариран като 'Частен', така че да не се появява, когато новият обект е използвани

След това трябва да попълните кода Class_Initialize. Това се изпълнява, когато за първи път използвате обекта в кода си, и определя какви стойности ще бъдат заредени в обекта

Можете да получите достъп до тази подпрограма, като изберете „Клас“ в първото падащо меню и „Инициализиране“ във второто падащо меню на прозореца на модула

12345678910 Частен подклас_Initialize ()Затъмнете objItem като MyItemЗадайте mItems = Нова колекцияЗа n = 1 до 3Задайте objItem = Нов MyItemobjItem.Item = Работни листове ("Sheet1"). Диапазон ("a" & n).objItem.Detail = Работни листове ("Sheet1"). Диапазон ("b" & n).mItems.Add objItemСледващ nEnd Sub

Кодът създава обект, наречен „objItem“, използвайки дефиницията на „MyItem“, която изградихме като модул за клас по -рано.

След това създава нова колекция въз основа на обекта „mItems“, дефиниран по -рано

Той итератира чрез стойности, държани на Sheet1 на работната книга, и ги поставя в свойствата, които създадохме за обекта „MyItem“. Обърнете внимание, че когато използвате „objitem“, се появява падащо меню, показващо двете свойства, точно както ако използвате вграден обект на Excel.

След това обектът елемент се добавя към обекта за събиране, който сега съдържа всички данни в стойностите на свойството.

Входните данни не трябва да се вземат от работен лист. Това може да са статични стойности или може да дойде от връзка към база данни като Microsoft Access или SQL Server, или може да дойде от друг работен лист.

След това трябва да добавите обществена функция, наречена „Item“

123 Публична функция елемент (индекс като цяло число) като MyItemSet Item = mItems.Item (индекс)Крайна функция

Това ви позволява да се позовавате на отделни обекти в обекта на колекцията по техния индексен номер. Тази функция осигурява „огледало“ на случващото се в колекцията „mMyItems“ във фонов режим.

Също така ще трябва да добавите свойство, наречено „Count“, за да може вашият код да установи колко обекта „MyItem“ са в колекцията „MyItems“, ако искате да го повторите.

123 Публична собственост Get Count () As LongCount = mItems.CountКрайна собственост

В този случай имате нужда само от свойство „Вземи“, защото е само за четене. Той използва колекцията mItems, защото в нея вече е вградено свойство count.

Вече имате обект (MyItems) с пълна йерархия, дефинирана от обекта „MyItem“

За да работи всичко, сега трябва да попълните работен лист (Sheet1) с данни, така че рутината за Initialize Class да може да събере това в обекта

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

Използване на вашия нов обект

Вече можете да използвате вашия обект Collection (MyItems) в стандартен Excel VBA модул. Въведете следния код:

12345678 Sub test_object ()Затъмнете MyClass като нови мои елементи, n като цяло числоMsgBox MyClass.CountЗа n = 1 Към MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailСледващ nEnd Sub

Този код създава обект, наречен „MyClass“ въз основа на създадения от вас обект на колекция, наречен „MyItems“. Това задействане на рутината „Инициализиране“, която извлича всички данни от работния лист в обекта.

Той показва броя на елементите в колекцията и след това прелиства през колекцията, показвайки текста „Item“ и „Detail“. Ще забележите, че когато се обърнете към обекта „MyClass“ във вашия код, ще видите списък с двете свойства на членове, които помагат при добавянето на правилното свойство.

Ако промените стойността на клетка във входните данни в електронната таблица, тя автоматично ще се актуализира в колекцията, когато стартирате горния код отново, тъй като когато измерите обекта, рутината за инициализация се изпълнява и взема всички нови данни

Ако използвате думата „Static“ вместо „Dim“, инициализационната програма не се изпълнява и старите стойности се запазват, стига кодът да работи непрекъснато. Ако данните в електронната таблица се променят, това няма да бъде отразено в обекта

1234567 Sub Test_Static ()Статичен Myclass като нови мои елементи, n като цяло числоЗа n = 1 Към Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailСледващ nEnd Sub

Обобщение на създаването на обект с помощта на модул клас

Както видяхте, създаването на йерархия от модули на класове, които да се използват като обект, е доста сложен бизнес, дори и за толкова проста структура като примера, даден тук. Възможностите за допускане на грешки са огромни!

Той обаче има огромни предимства, като прави кода ви по -елегантен и по -лесен за четене. Също така е по-лесно да споделяте с други приложения и разработчици на Excel, като го превърнете в добавка.

В този пример за това как да създадете обект, който да съхранява данни, би било нормален подход да създадете многоизмерен масив, който да съхранява данните от електронни таблици с много колони и бихте написали ред код за актуализиране или четене на всеки елемент в масива. Това вероятно щеше да се окаже доста объркано и лесно може да се допуснат грешки при справянето с различните елементи.

С новия си обект можете просто да се обърнете към него и членовете, които сте създали под него, за да съхранявате данните.

Също така, ако данните се променят в електронната таблица (или в свързана база данни, ако сте използвали това като източник на данни в рамките на вашия клас модул), когато използвате израза „Dim“, ще се извика рутината за инициализация и данните ще се актуализират незабавно . Няма нужда да пишете код, за да попълвате отново вашия масив.

Използване на модул на клас за създаване на променливо хранилище

Когато пишете VBA код, използвате променливи навсякъде, всички с различни обхвати. Някои могат да бъдат дефинирани само за определена процедура, други за конкретен модул, а други могат да бъдат глобални променливи, които могат да се използват в цялото приложение

Можете да създадете модул за клас, който да съдържа голям брой променливи и тъй като е обект, той може да се използва навсякъде в кода ви, дори на потребителска форма или в контрола Active X, която сте поставили на работен лист.

Допълнителното предимство е, че когато се позовавате на вашия променлив обект, ще видите списък с всички имена на променливите, държани в обекта, сортирани във възходящ ред.

За да създадете хранилище, трябва да вмъкнете нов модул за клас. Можете да направите това с помощта на Insert | Класов модул от менюто VB Editor

Променете името на „MyVariables“, като използвате същата методология, както беше обсъдено по -рано в тази статия.

Въведете следния код:

12345678910111213141516 Частен mV като вариантПублична собственост Вземете променлива1 () като вариантПроменлива1 = mVКрайна собственостПублична собственост Let Variable1 (ByVal vNewValue като вариант)mV = vNewValueКрайна собственостПублична собственост Вземете променлива2 () като вариантПроменлива1 = mVКрайна собственостПублична собственост Let Variable2 (ByVal vNewValue като вариант)mV = vNewValueКрайна собственост

Този код задава свойствата „Let“ и „Get“ за две променливи („Variable1“ и „Variable2“). Свойствата Let and Get са необходими за всяка от вашите променливи, така че да могат да се четат / записват

Можете да използвате свои собствени имена за променливите вместо примерните в този код и можете да добавите допълнителни променливи, като се уверите, че всяка нова променлива има изрази „Let“ и „Get“.

Частната декларация на променливата „mV“ е за създаване на работеща променлива, която се използва само в модула на класа за прехвърляне на стойности.

За да използвате хранилището на променливите, въведете следния код в стандартен модул:

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

Този код създава глобален екземпляр на вашия обект „MyVariables“, който сте създали. Трябва само да направите тази декларация веднъж отвсякъде във вашия код.

Кодът първо показва стойността на „Variable1“, за да покаже, че е празна.

На „Variable1“ се присвоява стойност 10 и тогава се показва новата стойност в обекта, за да покаже, че това свойство сега държи тази стойност.

Тъй като екземплярът на обекта „MyVariables“ е дефиниран глобално, можете да се обърнете към всяка от дефинираните променливи в обекта отвсякъде в кода си.

Това има огромно предимство в това, че ако искате да използвате вашите променливи навсякъде във вашия код, трябва само да дефинирате една глобална променлива и от този случай всички променливи могат да бъдат свободно достъпни и променени в целия ви код.

Страхотен продукт. AutoMacro не просто пише вашия код, той учи, докато вървите! " - Тони, Великобритания

Научете повече

Прочетете нашите 900+ рецензии

Превръщане на вашия обект в добавка

Досега кодът за създаване на обект е в приложението на вашата работна книга. Ако обаче искате да можете да споделяте обекта си с други разработчици или в други свои собствени приложения на Excel, можете да го превърнете в добавка

За да направите това, всичко, което трябва да се случи, е да запишете файла като добавка. Изберете Файл | Запиши като и ще се появи прозорец на браузъра

Изберете типа на файла като добавка (.xlam) от падащия тип на файла и щракнете върху OK. Файлът по подразбиране ще бъде запазен в папката с добавки, но можете да промените местоположението.

След това можете да включите добавения файл във вашите приложения на Excel, което ви дава гъвкавост да използвате новия си обект

За да включите новата си добавка в Excel, щракнете върху Файл на лентата на Excel и след това върху Опции в долната част на левия прозорец

Кликнете върху „Добавки“ в левия прозорец в изскачащия прозорец, който се показва. В долната част на прозореца има бутон с надпис „Go“

Кликнете върху това и ще се появи изскачащ прозорец „Добавка“. Кликнете върху „Преглед“ и след това намерете своя файл с добавка. След това ще можете да се позовавате на вашия обект във вашия код.

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave