Ovaj vodič će vas naučiti o modulima razreda u VBA -i. Naučit ćete što su oni i kako ih koristiti.
Moduli VBA klase - Uvod
Kada umetnete module u Visual Basic Editor (VBE) kako biste unijeli svoj kôd, možda ste primijetili da možete umetnuti i ono što se naziva 'Modul klase'.
Moduli klase vs moduli
Moduli klase rade na vrlo različit način od običnih modula jer olakšavaju stvaranje Component Object Model (COM) koji se tada može koristiti unutar vašeg uobičajenog VBA koda
Ustvari, stvarate objekt koji radi na isti način kao i ugrađeni Excel objekt, poput "Radnih listova". U objektu Radni listovi imate niz svojstava i metoda koji vam omogućuju da unesete broj radnih listova u radnu knjigu ili svaki pojedinačni naziv radnog lista ili brojne druge informacije
Kada na ovaj način kreirate novi Objekt, stvarate građevinski blok koji se može koristiti bilo gdje unutar VBA. Objekt ima niz svojstava i metoda kojima se može pristupiti pomoću VBA koda s bilo kojeg mjesta u radnoj knjizi, bez potrebe za ponovnim pisanjem koda.
Osim upućivanja na vaš novi objekt iz standardnog VBA modula, možete ga koristiti i u kodu iza UserForma koji je dio vaše prilagođene aplikacije
Možete ga koristiti i tamo gdje ste Active X kontrole postavili na radni list, poput naredbenog gumba ili padajućeg izbornika. Sve ove kontrole koriste VBA, a vaš novi objekt lako se može ugraditi u kôd događaja za te kontrole.
Također možete pretvoriti svoj objekt u dodatak za Excel. Vaš će objekt automatski biti dostupan drugim korisnicima koji imaju učitan taj dodatak. Ovo dodaje vlastitu višeslojnu arhitekturu u vašu Excel aplikaciju
Excel je višeslojna aplikacija. Postoji sloj usluga klijenta koji pokreće stvarni prozor radnog lista s kojim je korisnik upoznat. Excel objektni model sljedeći je sloj ispod. Pritisnite F2 u VBA modulu i moći ćete vidjeti ogroman broj objekata i članova tih objekata koji su motor Excela. Imajte na umu da će se vaš novi objekt također prikazati ovdje.
Konačno, ispod svega ovoga imate sloj podatkovnih usluga koji sadrži sve podatke koje ste unijeli u radne listove i ćelije. Excel tome pristupa pomoću Excelovog modela objekta.
Stvaranje modula klase omogućuje vam proširenje modula Excel objekta vlastitim prilagođenim objektima i članovima
Ovaj vam članak objašnjava kako stvoriti jednostavnu hijerarhiju objekata pomoću modula klase.
Prednosti korištenja modula klase
- Možete razviti robustan građevni blok koji se može koristiti u bilo kojem broju različitih Excel programa
- Nakon što je temeljito testiran, možete se osloniti na to da će uvijek dati točne rezultate na isti način kao i ugrađeni Excel objekti
- Ako se ažuriraju kodovi na drugom mjestu u aplikaciji, novi objekt će i dalje raditi na isti način
- Svoj novi objekt možete koristiti u drugim Excel programima kao dodatak
- Objekti se mogu ponovno koristiti u drugim aplikacijama i pomažu u ispravljanju pogrešaka
Nedostaci korištenja modula klase
- Može ih biti teško stvoriti i razumjeti.
- Konvencije imenovanja vrlo su važne jer ćete to vidjeti kada koristite svoj objekt u normalnom modulu.
- Ako prije niste stvorili modul razreda, može ih biti teško razumjeti i postoji strma krivulja učenja
- Nemoguće je promijeniti tijekom izvođenja-morate ponovno postaviti projekt.
- Ako svojstva i privatne varijable imaju isti naziv, tada se mogu pojaviti beskonačne petlje koje rezultiraju pogreškama
Umetanje modula klase
Odaberite Umetni | Modul razreda iz izbornika VBE (Visual Basic Editor). Novi modul klase automatski će se zvati "Klasa 1", no to je potrebno odmah promijeniti u naziv koji ćete koristiti za svoj objekt
Mijenjate naziv u prozoru Svojstva gdje je strelica usmjerena. Jednostavno upišete svoje novo ime, a to će se promijeniti u zbirci Moduli razreda
Ako prozor Svojstva nije vidljiv, odaberite Pogled | Svojstva na VBE izborniku ili pritisnite F4
Pozovite svoj novi modul klase 'MyItem' i dvaput kliknite naziv u prikazu stabla u Project Exploreru da biste prikazali prozor koda za njega.
Stvaranje objektne stavke
Ovaj primjer će stvoriti objekt najviše razine pod nazivom „Moje stavke“ s članskim objektom ispod njega pod nazivom „Moja stavka“ koji će sadržavati pojedinačne podatke za svaku stavku. Nakon stvaranja radit će na isti način kao i ugrađeni Excel objekt. Na primjer, postoji objekt pod nazivom "Radni listovi" koji je zbirka svakog radnog lista u vašoj radnoj knjizi. Postoji i objekt zvan "List" koji predstavlja svaki pojedinačni radni list u vašoj radnoj knjizi i sadrži sva svojstva i metode za svaki radni list. Ovaj objekt se odnosi na objekt prikupljanja "Radni listovi".
Možete ponavljati zbirku "Radni listovi", pregledavajući svaki "List" redom. Na isti ćete način moći ponoviti zbirku ‘MyItems’ pregledavajući svojstva koja ste stvorili u članu ‘Myitem’.
Prvo što trebate učiniti je stvoriti pod objekt za razinu člana koji će sadržavati stvarne stavke unutar zbirke objekta najviše razine. Ovo je ekvivalent članova (npr. Imena, vidljivih, broja) unutar objekta "List" u Excelu. Ovaj kôd se unosi u modul klase pod nazivom "MyItem"
Moduli razreda imaju svojstva i metode. Svojstva su zapravo poput varijabli, jer sadrže vrijednosti podataka poput varijabli, a metode su poput potprograma ili funkcija.
U podobjektu ćemo stvoriti dva svojstva za objekt - Item i Detail
U početku je potrebno deklarirati dvije varijable niza koje drže vrijednosti svojstava:
12 | Privatni predmet kao nizPrivatni mDetail As String |
Oni moraju biti deklarirani u odjeljku Deklaracije pri vrhu koda za modul klase, tako da se mogu koristiti u svim potprogramima u cijelom modulu
Moraju im dati jedinstvena imena kako bi se razlikovali od svojstava koja ćemo stvoriti, pa je ispred svakog imena stavljen znak 'm' (za člana).
Varijable su deklarirane kao privatne pa ih nitko ne može vidjeti pomoću objekta. Oni su radne varijable za upotrebu u objektnom kodu i ne postoje kao dio konačnog objekta.
Sljedeći korak je postavljanje koda za pristup dvama svojstvima. To činite pomoću izraza Property Let i Property Get za svako svojstvo. Oni moraju biti javni jer inače objekt najviše razine neće imati vidljiva svojstva
123456789101112131415 | Stavka javne imovine u vlasništvu (vdata kao niz)mItem = vdataKraj imovineJavna svojina Nabavite stavku () kao nizStavka = mItemKraj imovineJavno vlasništvo neka se iscrta (vdata kao niz)mDetail = vdataKraj imovineJavno vlasništvo Get Detail () As StringDetalj = mDetailKraj imovine |
Ovaj kôd stvara sredstva za čitanje i pisanje vrijednosti u dva svojstva (Item i Detail) koristeći dvije privatne varijable koje su definirane u odjeljku deklaracija modula.
Parametar "vdata" koristi se za prosljeđivanje podataka dotičnoj nekretnini.
Važno je da svako svojstvo ima naredbe "Dopusti" i "Dohvati" te da je naziv svojstva u svakom slučaju isti. Ako ste pogrešno napisali, mogli biste imati dva različita svojstva - jedno iz kojeg možete čitati i jedno u koje možete pisati!
Za pomoć pri stvaranju ovog koda možete koristiti Insert | Postupak na VBE izborniku za stvaranje kostura koda koji će stvoriti početni kod za svojstva "Get" i "Let" za dati naziv svojstva
Ovo će prikazati skočni prozor u koji upisujete naziv nekretnine i na izbornim gumbima odaberite "Svojstvo":
Kliknite "U redu" i kostur koda bit će dodan u modul klase:
1234567 | Javno vlasništvo Nabavite MyProperty () kao varijantuKraj imovineJavno svojstvo Neka MyProperty (ByVal vNewValue kao varijanta)Kraj imovine |
Time se sprječavaju greške u nazivima nekretnina. Jednostavno dodajte svoj kod između izjava "Javno vlasništvo" i "Kraj vlasništva".
Sada imate objekt pod nazivom 'MyItem' koji će sadržavati sve podatke za ovu vježbu.
Umorni ste od traženja primjera VBA koda? Isprobajte AutoMacro!
Stvaranje zbirke
Sljedeća je faza stvaranje objekta najviše razine kao objekta zbirke za pristup svojstvima koja ste postavili u objektu ‘MyItem’
Opet morate definirati radni objekt koji će djelovati kao objekt prikupljanja na isti način na koji ste definirali dvije varijable niza u objektu 'MyItem'.
1 | Privatne stavke kao zbirka |
Opet, ovo mora imati jedinstveni naziv, zbog čega se ispred imena nalazi 'm' (objekt član), a također je deklarirano i kao 'Privatno', tako da se ne pojavljuje prilikom postavljanja novog objekta rabljeno
Zatim morate popuniti kôd Class_Initialize. To se izvodi kada prvi put koristite objekt unutar koda i određuje koje će se vrijednosti učitati u objekt
Ovoj podrutini možete pristupiti odabirom ‘Class’ u prvom padajućem izborniku i ‘Initialize’ u drugom padajućem izborniku prozora modula
12345678910 | Privatna podrazreda_Initialize ()Priguši objItem kao MyItemPostavite stavke = Nova zbirkaZa n = 1 do 3Postavi objItem = Nova MyItemobjItem.Item = Radni listovi ("List1"). Raspon ("a" & n). VrijednostobjItem.Detail = Radni listovi ("List1"). Raspon ("b" & n). VrijednostmItems.Add objItemDalje nKraj podm |
Kôd postavlja objekt nazvan 'objItem' koristeći definiciju 'MyItem' koju smo ranije izgradili kao modul klase.
Zatim stvara novu zbirku na temelju ranije definiranog objekta 'mItems'
Ponavlja vrijednosti koje se nalaze na Sheet1 radne knjige i stavlja ih u svojstva koja smo stvorili za objekt 'MyItem'. Imajte na umu da kada koristite "objitem", pojavit će se padajući izbornik koji prikazuje dva svojstva, točno kao da koristite ugrađeni Excel objekt.
Objekt stavke tada se dodaje u objekt zbirke koji sada sadrži sve podatke u vrijednostima svojstva.
Ulazni podaci ne moraju se uzimati s radnog lista. To mogu biti statičke vrijednosti, ili mogu doći iz veze s bazom podataka kao što je Microsoft Access ili SQL Server, ili mogu doći s drugog radnog lista.
Zatim morate dodati javnu funkciju pod nazivom "Stavka"
123 | Stavka javne funkcije (indeks kao cijeli broj) Kao MyItemPostavite stavku = mItems.Item (indeks)Završna funkcija |
To vam omogućuje da se pozivate na pojedinačne objekte unutar objekta zbirke prema njihovom indeksnom broju. Ova funkcija pruža "zrcalo" onoga što se događa u zbirci "mMyItems" u pozadini.
Također ćete morati dodati svojstvo pod nazivom 'Count' kako bi vaš kôd mogao utvrditi koliko objekata 'MyItem' ima u zbirci 'MyItems', ako želite to ponoviti.
123 | Javna svojina Get Count () As LongCount = mItems.CountKraj imovine |
U ovom slučaju trebate samo svojstvo "Get" jer je samo za čitanje. Koristi zbirku mItems jer to već ima svojstvo count ugrađeno u nju.
Sada imate objekt (MyItems) s potpunom hijerarhijom definiranom objektom 'MyItem'
Da bi cijela stvar funkcionirala, sada morate popuniti radni list (Sheet1) podacima tako da rutina Initialize Class može to prikupiti u objekt
Vaša proračunska tablica trebala bi izgledati ovako:
Korištenje vašeg novog objekta
Sada možete koristiti objekt Zbirka (Moje stavke) unutar standardnog Excel VBA modula. Unesite sljedeći kôd:
12345678 | Sub test_object ()Zatamni MyClass kao nove stavke, n kao cijeli brojMsgBox MyClass.CountZa n = 1 Za MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetaljDalje nKraj podm |
Ovaj kôd stvara objekt pod nazivom "MyClass" na temelju objekta zbirke koji ste stvorili pod nazivom "MyItems". Ovo aktiviranje rutine 'Initialize' koja ekstrahira sve podatke s radnog lista u objekt.
Prikazuje broj stavki u zbirci, a zatim se ponavlja kroz zbirku prikazujući tekst "Stavka" i "Pojedinosti". Primijetit ćete da ćete, kada u svom kodu upućujete na objekt ‘MyClass’, vidjeti popis dva svojstva člana koji pomažu u dodavanju ispravnog svojstva.
Ako promijenite vrijednost ćelije u ulaznim podacima u proračunskoj tablici, ona će se automatski ažurirati u zbirci kada ponovno pokrenete gornji kôd, jer kada dimenzionirate objekt, rutina inicijalizacije pokreće se i preuzima sve nove podatke
Ako umjesto riječi "Dim" koristite riječ "Static", inicijalizacija se ne pokreće i stare se vrijednosti čuvaju, sve dok se kôd neprestano izvodi. Ako se podaci u proračunskoj tablici promijene, to se neće odraziti u objektu
1234567 | Pod Test_Static ()Statička miklasa kao nove stavke, n kao cijeli brojZa n = 1 Za Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetaljDalje nKraj podm |
Sažetak stvaranja objekta pomoću modula klase
Kao što ste vidjeli, stvaranje hijerarhije modula klase za korištenje kao objekt prilično je kompliciran posao, čak i za strukturu tako jednostavnu kao što je ovdje navedeni primjer. Opseg griješenja je ogroman!
Međutim, ima velike prednosti što vaš kod čini elegantnijim i lakšim za čitanje. Također je lakše dijeliti s drugim Excel programima i razvojnim programerima pretvarajući ga u dodatak.
U ovom primjeru kako stvoriti objekt za čuvanje podataka, bio bi normalan pristup stvaranju višedimenzionalnog niza za pohranu podataka proračunske tablice s više stupaca, a vi biste napisali redak koda za ažuriranje ili čitanje svakog elementa u nizu. To bi vjerojatno završilo prilično neuredno i lako bi se mogle napraviti pogreške u adresiranju različitih elemenata.
S novim objektom jednostavno se možete pozvati na njega i članove koje ste stvorili ispod njega kako biste držali podatke.
Također, ako se podaci promijene u proračunskoj tablici (ili u povezanoj bazi podataka ako ste to koristili kao izvor podataka u svom modulu klase) kad god koristite izraz 'Dim', pozvat će se rutina inicijalizacije i podaci će se odmah ažurirati . Nema potrebe za pisanjem koda za ponovno popunjavanje vašeg niza.
Korištenje modula razreda za stvaranje promjenjivog spremišta
Kad pišete VBA kôd, koristite varijable posvuda, sve s različitim opsezima. Neke se mogu definirati samo za određeni postupak, neke za određeni modul, a neke mogu biti globalne varijable koje se mogu koristiti u cijeloj aplikaciji
Možete stvoriti modul klase koji će sadržavati veliki broj varijabli, a budući da je objekt, može se koristiti bilo gdje u vašem kodu, čak i na korisničkom obrascu ili u kontroli Active X koju ste postavili na radni list.
Dodatna prednost je što ćete, kada se obratite svom varijabilnom objektu, vidjeti popis svih imena varijabli koje se drže u objektu razvrstane prema rastućem redoslijedu.
Da biste stvorili spremište, morate umetnuti novi modul klase. To možete učiniti pomoću Insert | Modul razreda iz izbornika VB Editor
Promijenite naziv u "MyVariables" koristeći istu metodologiju kao što je prethodno objašnjeno u ovom članku.
Unesite sljedeći kôd:
12345678910111213141516 | Privatno mV kao varijantaJavno svojstvo Dobijte varijablu1 () kao varijantuVarijabla1 = mVKraj imovineJavno svojstvo Neka varijabla1 (ByVal vNewValue kao varijanta)mV = vNova vrijednostKraj imovineJavno svojstvo Dobijte varijablu2 () kao varijantuVarijabla1 = mVKraj imovineJavno svojstvo Neka varijabla2 (ByVal vNewValue kao varijanta)mV = vNova vrijednostKraj imovine |
Ovaj kôd postavlja svojstva "Let" i "Get" za dvije varijable ("Variable1" i "Variable2"). Svojstva Dopusti i Dohvati potrebna su za svaku vašu varijablu tako da se mogu čitati / pisati
Za varijable možete koristiti vlastite nazive umjesto uzoraka u ovom kodu, a možete dodati i druge varijable, pazeći da svaka nova varijabla ima naredbe 'Let' i 'Get'.
Privatna deklaracija varijable 'mV' je stvaranje radne varijable koja se koristi samo unutar modula klase za prijenos vrijednosti.
Da biste koristili spremište varijabli, unesite sljedeći kôd u standardni modul:
123456 | Global VarRepo kao nove MyVariablesPod TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1Kraj podm |
Ovaj kôd stvara globalnu instancu vašeg objekta "MyVariables" koji ste stvorili. Ovu deklaraciju trebate učiniti samo jednom s bilo kojeg mjesta u vašem kodu.
Kôd prvo prikazuje vrijednost "Varijable1" kako bi pokazao da je prazna.
Vrijednosti 10 dodjeljuje se "Variable1", a zatim se prikazuje nova vrijednost unutar objekta koja pokazuje da ovo svojstvo sada drži tu vrijednost.
Budući da je instanca objekta 'MyVariables' definirana globalno, možete se pozvati na bilo koju od definiranih varijabli unutar objekta s bilo kojeg mjesta u vašem kodu.
Ovo ima veliku prednost u tome što, ako želite koristiti svoje varijable bilo gdje u svom kodu, trebate definirati samo jednu globalnu varijablu, a od tog trenutka svim se varijablama može slobodno pristupiti i mijenjati ih u cijelom kodu.
Izvrstan proizvod. AutoMacro ne samo da piše vaš kôd, već uči i dok idete! " - Tony, UK
Saznajte višePročitajte naše 900+ recenzija
Pretvaranje vašeg objekta u dodatak
Do sada je kôd za stvaranje objekta unutar vaše aplikacije radne knjige. Međutim, ako želite dijeliti svoj objekt s drugim programerima ili u drugim vlastitim Excel aplikacijama, možete ga pretvoriti u dodatak
Da biste to učinili, sve što se treba dogoditi je da datoteku spremite kao dodatak. Odaberite Datoteka | Spremi kao i pojavit će se prozor preglednika
Odaberite vrstu datoteke kao Dodatak (.xlam) s padajuće vrste datoteke i kliknite U redu. Datoteka će prema zadanim postavkama biti spremljena u mapu Add-In, ali možete promijeniti lokaciju.
Zatim možete dodati datoteku programskog dodatka u svoje Excel aplikacije, što vam daje fleksibilnost u korištenju vašeg novog objekta
Da biste svoj novi dodatak uključili u Excel, kliknite Datoteka na Excelovoj vrpci, a zatim kliknite Opcije pri dnu lijevog okna
Kliknite na "Dodaci" u lijevom oknu u skočnom prozoru koji se pojavi. Pri dnu prozora nalazi se gumb s oznakom "Idi"
Kliknite na ovo i pojavit će se skočni prozor 'Add-In'. Kliknite "Pregledaj", a zatim pronađite datoteku dodatka. Tada ćete se moći pozivati na svoj objekt u svom kodu.