VBA osztálymodul bemutatója és példái

Ez az oktatóanyag megtanítja Önt az osztálymodulokról a VBA -ban. Megtanulja, hogy mik ezek és hogyan kell használni őket.

VBA osztálymodulok - Bevezetés

Amikor modulokat helyez be a Visual Basic Editorba (VBE) a kód beírása érdekében, akkor észrevehette, hogy az úgynevezett „osztálymodult” is beillesztheti.

Osztály modulok vs modulok

Az osztálymodulok a szokásos moduloktól nagyon eltérő módon működnek, mivel megkönnyítik a Component Object Model (COM) létrehozását, amelyet aztán a normál VBA -kódon belül lehet használni

Valójában létrehoz egy olyan objektumot, amely ugyanúgy működik, mint egy beépített Excel objektum, például a „Munkalapok”. A Munkalapok objektumban számos olyan tulajdonsággal és módszerrel rendelkezik, amelyek lehetővé teszik a munkafüzetben található munkalapok számának vagy a munkalap egyes neveinek, vagy számos egyéb információ lekérését

Amikor új objektumot hoz létre ilyen módon, létrehoz egy építőelemet, amely bárhol használható a VBA -n belül. Az objektum számos olyan tulajdonsággal és módszerrel rendelkezik, amelyekhez a VBA-kód bárhonnan elérhető a munkafüzetben anélkül, hogy újra kellene írnia a kódot.

Amellett, hogy hivatkozik az új objektumra egy szabványos VBA modulból, használhatja azt a UserForm mögötti kódban is, amely az egyéni alkalmazás része

Akkor is használhatja, ha az Active X vezérlőket egy munkalapra helyezte, például egy parancsgombot vagy egy legördülő menüt. Ezek a vezérlők mind VBA -t használnak, és az új objektum könnyen beépíthető a vezérlők eseménykódjába.

Az objektumot Excel-bővítményké is alakíthatja. Az objektum automatikusan elérhető lesz azon felhasználók számára, akik betöltötték ezt a bővítményt. Ez hozzáadja saját többszintű architektúráját az Excel alkalmazáshoz

Az Excel többszintű alkalmazás. Létezik az ügyfélszolgálati réteg, amely a tényleges munkalap ablakot hajtja végre, amelyet a felhasználó ismer. Az Excel objektummodell a következő réteg alatta. Nyomja meg az F2 billentyűt egy VBA modulban, és látni fogja a hatalmas számú objektumot és azok tagjait, amelyek az Excel motorja. Vegye figyelembe, hogy az új objektum is megjelenik itt.

Végül mindezek alatt az adatszolgáltatási réteg található, amely tartalmazza a munkalapokba és cellákba beírt összes adatot. Az Excel ehhez az Excel objektummodell segítségével fér hozzá.

Osztálymodul létrehozása lehetővé teszi az Excel objektummodul kiterjesztését saját egyéni objektumokra és tagokra

Ez a cikk elmagyarázza, hogyan hozhat létre egyszerű objektumhierarchiát az Osztálymodulok használatával.

Az osztálymodulok használatának előnyei

  1. Kialakíthat egy robusztus építőelemet, amely tetszőleges számú Excel alkalmazásban használható
  2. Miután alaposan tesztelték, bízhat benne, hogy mindig a helyes eredményeket hozza, ugyanúgy, mint a beépített Excel objektumok
  3. Ha az alkalmazás más részein frissítik a kódot, az új objektum továbbra is ugyanúgy működik
  4. Az új objektumot más Excel-alkalmazásokban is használhatja bővítményként
  5. Az objektumok újra felhasználhatók más alkalmazásokban, és segítenek a hibakeresésben

Az osztálymodulok használatának hátrányai

  1. Nehéz lehet őket létrehozni és megérteni.
  2. Az elnevezési szabályok nagyon fontosak, mert ezt láthatja, amikor az objektumot normál modulon belül használja.
  3. Ha még nem hozott létre osztálymodult, akkor ezek nehezen érthetők, és meredek tanulási görbe van
  4. Lehetetlen változtatni futás közben-újra kell állítani a projektet.
  5. Ha a Tulajdonságok és a Privát változók azonos nevűek, akkor végtelen ciklusok fordulhatnak elő, amelyek hibákat eredményezhetnek

Osztálymodul beillesztése

Válassza a Beszúrás | Osztálymodul a VBE (Visual Basic Editor) menüből. Az új osztálymodult automatikusan „1. osztálynak” fogják hívni, de ezt azonnal meg kell változtatni arra a névre, amelyet az objektumhoz fog használni

A nevet megváltoztathatja a Tulajdonságok ablakban, ahol a nyíl mutat. Egyszerűen írja be új nevét, és ez megváltozik az Osztálymodulok gyűjteményben

Ha a Tulajdonságok ablak nem látható, válassza a Nézet | lehetőséget Tulajdonságok a VBE menüben, vagy nyomja meg az F4 billentyűt

Hívja új osztálymodulját a „MyItem” elemre, és kattintson duplán a nevére a Project Explorer fa nézetében a kódablak megjelenítéséhez.

Objektum elem létrehozása

Ez a példa létrehoz egy „MyItems” nevű felső szintű objektumot, alatta egy „MyItem” nevű tagobjektummal, amely az egyes elemek egyedi adatait fogja tárolni. Létrehozása után ugyanúgy fog működni, mint egy beépített Excel objektum. Például létezik egy „Munkalapok” nevű objektum, amely a munkafüzet minden munkalapjának gyűjteménye. Van egy „Lap” nevű objektum is, amely a munkafüzet minden egyes munkalapját képviseli, és tartalmazza az egyes munkalapok összes tulajdonságát és módszerét. Ez az objektum a „Munkalapok” gyűjtőobjektumhoz kapcsolódik.

Ismétlődhet a „Munkalapok” gyűjteményben, és megtekintheti az egyes „Lapokat”. Ugyanígy megismételheti a „MyItems” gyűjteményt, és megtekintheti a „Myitem” tagban létrehozott tulajdonságokat.

Az első dolog az, hogy létre kell hozni a tagszintű alobjektumot, amely a legfelső szintű objektum gyűjteményében lévő tényleges elemeket fogja tárolni. Ez az Excelben a „Sheet” objektum tagjainak (pl. Név, látható, szám) megfelelője. Ezt a kódot be kell írni a „MyItem” nevű osztálymodulba

Az osztálymodulok tulajdonságokkal és módszerekkel rendelkeznek. A tulajdonságok gyakorlatilag olyanok, mint a változók, annyiban, hogy olyan értékeket tartalmaznak, mint a változók, és a Metódusok olyanok, mint az alrutinok vagy függvények.

Az alobjektumban két tulajdonságot hozunk létre az objektumhoz - Elemet és Részletet

Kezdetben két karakterlánc -változót kell deklarálni, hogy megtartsák a tulajdonságok értékeit:

12 Privát mItem karakterlánckéntPrivát mDetail karakterláncként

Ezeket az osztálymodul kódjának tetején található Nyilatkozatok részben kell megadni, hogy a modul minden alrutinjában használhatók legyenek

Egyedi neveket kell adni nekik, hogy különbözjenek azoktól a tulajdonságoktól, amelyeket létre fogunk hozni, ezért minden név elé egy „m” betűt kell írni.

A változókat privátnak nyilvánítják, így senki sem láthatja őket az objektum használatával. Ezek az objektumkódon belül használható változók, és nincsenek ott a végső objektum részeként.

A következő lépés a két tulajdonsághoz való hozzáférést biztosító kód beállítása. Ezt egy ingatlan -engedély és egy ingatlan -kimutatás segítségével teheti meg minden ingatlan esetében. Ezeknek nyilvánosnak kell lenniük, különben a legfelső szintű objektumnak nem lesz látható tulajdonsága

123456789101112131415 Public Property Let Item (vdata karakterláncként)mItem = vdataTulajdon végeKöztulajdon Tétel () lekérése karakterlánckéntElem = mItemTulajdon végeKöztulajdon engedély részletei (vdata karakterláncként)mDetail = vdataTulajdon végePublic Property Get Detail () karakterlánckéntRészletek = mDetailTulajdon vége

Ez a kód lehetővé teszi az értékek olvasását és írását a két tulajdonsághoz (Item és Detail) a modul két deklarációjában meghatározott két privát változó használatával.

A „vdata” paraméter az adatok átadására szolgál az érintett ingatlanhoz.

Fontos, hogy minden tulajdonsághoz legyen „Let” és „Get” utasítás, és hogy a tulajdonság neve minden esetben ugyanaz legyen. Két különböző tulajdonsággal rendelkezhet, ha helytelenül írja be - az egyik, amelyből kiolvasható, és a másik, amelybe írhat!

A kód létrehozásában a Beszúrás | Eljárás a VBE menüben egy kódváz létrehozásához, amely létrehozza a kezdeti kódot a „Get” és a „Let” tulajdonságokhoz egy adott tulajdonságnévhez

Ez egy felugró ablakot jelenít meg, ahol be kell írnia a tulajdonság nevét, és a választógombokon válassza a "Tulajdonság" lehetőséget:

Kattintson az „OK” gombra, és a csontváz kódja bekerül az osztálymodulba:

1234567 Public Property Get MyProperty () as VariantTulajdon végePublic Property Let MyProperty (ByVal vNewValue as Variant)Tulajdon vége

Ez megakadályozza a hibákat a tulajdonságok nevében. Egyszerűen adja hozzá kódját a „Köztulajdon” és a „Végtulajdon” nyilatkozatok közé.

Most van egy „MyItem” nevű objektum, amely az összes adatot tartalmazza ehhez a gyakorlathoz.

Unod már a VBA kódpéldák keresését? Próbálja ki az AutoMacro -t!

Gyűjtemény létrehozása

A következő lépés egy felső szintű objektum létrehozása gyűjteményobjektumként, amely hozzáférést biztosít a „MyItem” objektumban beállított tulajdonságokhoz

Ismét meg kell határoznia egy működő objektumot, amely gyűjteményobjektumként fog működni, ugyanúgy, ahogy a két karakterlánc -változót a „MyItem” objektumban határozta meg.

1 Privát mItems gyűjteményként

Ennek ismét egyedi névvel kell rendelkeznie, ezért van egy „m” (tagobjektum) a név előtt, és azt is „privátnak” nyilvánítják, hogy ne jelenjen meg az új objektum létrehozásakor használt

Ezután ki kell töltenie a Class_Initialize kódot. Ez akkor fut, amikor először használja az objektumot a kódjában, és meghatározza, hogy milyen értékek kerülnek betöltésre az objektumba

Ezt az alrutinot úgy érheti el, hogy a modul ablakának első legördülő menüjében az „Osztály”, a második ablakban pedig az „Inicializálás” lehetőséget választja.

12345678910 Privát alosztály_kezdeményezése ()Dim objItem As MyItemSet mItems = New CollectionN = 1 -től 3 -igÁllítsa be az objItem = New MyItem elemetobjItem.Item = Munkalapok ("Sheet1"). Tartomány ("a" & n). ÉrtékobjItem.Detail = Munkalapok ("Sheet1"). Tartomány ("b" & n). ÉrtékmItems.Adj objItemKövetkező nEnd Sub

A kód létrehoz egy „objItem” nevű objektumot a „MyItem” definíció segítségével, amelyet korábban osztálymodulként építettünk.

Ezután új gyűjteményt hoz létre a korábban meghatározott „mItems” objektum alapján

Megismétli a munkafüzet 1. lapján található értékeket, és beilleszti azokat a tulajdonságokba, amelyeket a „MyItem” objektumhoz készítettünk. Ne feledje, hogy az „objitem” használatakor megjelenik egy legördülő menü, amely a két tulajdonságot mutatja, pontosan úgy, mintha egy beépített Excel objektumot használna.

Az elemobjektumot ezután hozzáadja a gyűjteményobjektumhoz, amely mostantól a tulajdonságértékekben tárolja az összes adatot.

A bemeneti adatokat nem kell egy munkalapról levenni. Ez lehet statikus érték, vagy származhat egy adatbázishoz, például a Microsoft Accesshez vagy az SQL Serverhez való kapcsolódásból, vagy egy másik munkalapról.

Ezután hozzá kell adnia egy „Tétel” nevű nyilvános függvényt

123 Nyilvános függvénytétel (index mint egész) Mint MyItemElem beállítása = mItems.Item (index)Vége funkció

Ez lehetővé teszi, hogy a gyűjteményobjektumon belüli egyes objektumokra hivatkozzon az indexszámuk alapján. Ez a funkció „tükrözi” a háttérben az „mMyItems” gyűjteményben zajló eseményeket.

Hozzá kell adnia egy „Count” nevű tulajdonságot is, hogy a kódja megállapíthassa, hány „MyItem” objektum található a „MyItems” gyűjteményben, ha meg szeretné ismételni.

123 A köztulajdon számítása () hosszú ideigCount = mItems.CountTulajdon vége

Ebben az esetben csak a „Get” tulajdonságra van szüksége, mert csak olvasható. Az mItems gyűjteményt használja, mert ez már tartalmaz egy count tulajdonságot.

Most van egy objektuma (MyItems), teljes hierarchiával, amelyet a „MyItem” objektum határoz meg

Ahhoz, hogy az egész működjön, most be kell töltenie egy munkalapot (Sheet1) adatokkal, hogy az osztály inicializálása rutin összegyűjtse ezt az objektumba

A táblázatnak így kell kinéznie:

Az új objektum használata

Mostantól használhatja a gyűjteményobjektumát (MyItems) egy szabványos Excel VBA modulon belül. Írja be a következő kódot:

12345678 Rész teszt_objektum ()Saját osztály besötétítése új saját elemekként, n egész számkéntMsgBox MyClass.CountN = 1 esetén MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n). RészletekKövetkező nEnd Sub

Ez a kód létrehoz egy „MyClass” nevű objektumot az Ön által létrehozott „MyItems” nevű gyűjteményobjektum alapján. Ez kikapcsolja az „Inicializálás” rutinot, amely minden adatot kibont a munkalapból az objektumba.

Megjeleníti a gyűjteményben lévő tételek számát, majd ismétlődik a gyűjteményben, megjelenítve a „Tétel” és a „Részletes” szöveget. Észre fogja venni, hogy amikor a kódjában a „MyClass” objektumra hivatkozik, megjelenik a két tag tulajdonságainak listája, amely segít a helyes tulajdonság hozzáadásában.

Ha megváltoztatja a cella értékét a táblázat bemeneti adataiban, akkor ez automatikusan frissül a gyűjteményben, amikor a fenti kódot újra futtatja, mivel az objektum méretezése során az inicializáló rutin fut és felveszi az összes új adatot

Ha a „Static” szót használja a „Dim” helyett, akkor az inicializáló rutin nem fut, és a régi értékek megmaradnak, amíg a kód folyamatosan fut. Ha a táblázatban szereplő adatok megváltoznak, ez nem jelenik meg az objektumban

1234567 Sub Test_Static ()Statikus Myclass mint új MyItems, n mint IntegerN = 1 esetén Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n). RészletekKövetkező nEnd Sub

Összefoglalás egy objektum létrehozásáról osztálymodul használatával

Amint látta, az osztálymodulok hierarchiájának létrehozása objektumként használni meglehetősen bonyolult feladat, még egy olyan egyszerű szerkezet esetében is, mint az itt bemutatott példa. Hatalmas a tévedési lehetőség!

Ennek azonban óriási előnyei vannak, mivel elegánsabbá és könnyebben olvashatóvá teszi a kódot. Ezenkívül könnyebb megosztani más Excel-alkalmazásokkal és fejlesztőkkel, ha bővítménnyé alakítja.

Ebben a példában, hogyan hozhat létre objektumot adatok tárolására, normális megoldás lenne egy többdimenziós tömb létrehozása a több oszlopból álló táblázatadatok tárolására, és írjon egy kódsort az egyes elemek frissítéséhez vagy olvasásához a tömböt. Ez valószínűleg elég rendetlen lenne, és könnyen elkövethetnének hibákat a különböző elemek kezelésében.

Az új objektummal egyszerűen hivatkozhat rá és az alatta létrehozott tagokra az adatok tárolásához.

Továbbá, ha az adatok megváltoznak a táblázatban (vagy egy összekapcsolt adatbázisban, ha ezt használták adatforrásként az osztálymodulon belül), amikor a „Dim” utasítást használja, az inicializáló rutin meghívásra kerül, és az adatok azonnal frissülnek . Nem kell kódot írnia a tömb újbóli feltöltéséhez.

Osztálymodul használata változótár létrehozásához

Amikor VBA -kódot ír, mindenhol változókat használ, különböző hatókörökkel. Néhányat csak egy adott eljáráshoz, néhányat egy adott modulhoz lehet definiálni, és vannak olyan globális változók, amelyek az egész alkalmazásban használhatók

Létrehozhat egy osztálymodult, amely nagyszámú változót tartalmaz, és mivel ez egy objektum, a kódon belül bárhol használható, akár egy felhasználói űrlapon, vagy egy munkalapon elhelyezett Active X -vezérlőben.

A további előny az, hogy amikor a változó objektumra hivatkozik, akkor az objektumban lévő összes változónév listáját látja növekvő sorrendbe rendezve.

Adattár létrehozásához be kell illesztenie egy új osztálymodult. Ezt a Beszúrás | Osztálymodul a VB Editor menüből

Módosítsa a nevet „MyVariables” értékre ugyanazzal a módszerrel, amelyet ebben a cikkben korábban tárgyaltunk.

Írja be a következő kódot:

12345678910111213141516 Privát mV mint változatPublic Property Get Variable1 () VariantVáltozó1 = mVTulajdon végeKöztulajdon engedélyezett változója1 (ByVal vNewValue as Variant)mV = vÚjértékTulajdon végePublic Property Get Variable2 () VariantVáltozó1 = mVTulajdon végeKöztulajdon let 2. változó (ByVal vNewValue as Variant)mV = vÚjértékTulajdon vége

Ez a kód két változóhoz („Változó1” és „Változó2”) állítja be a „Let” és a „Get” tulajdonságokat. A Let and Get tulajdonságokra minden változónál szükség van, hogy olvasható / írható legyen

Ebben a kódban használhatja a saját nevét a változókhoz a minta helyett, és további változókat is hozzáadhat, ügyelve arra, hogy minden új változó „Let” és „Get” utasítással rendelkezzen.

Az „mV” változó privát deklarációja egy működő változó létrehozása, amelyet csak az osztálymodulon belül használnak az értékek átvitelére.

A változótár használatához írja be a következő kódot egy szabványos modulba:

123456 Globális VarRepo új MyVariables -kéntSub TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1End Sub

Ez a kód globális példányt hoz létre az Ön által létrehozott „MyVariables” objektumból. Ezt a nyilatkozatot csak egyszer kell elvégeznie a kódon belül bárhonnan.

A kód először a „Variable1” értékét jeleníti meg annak jelzésére, hogy üres.

A „Változó1” 10 -es értéket kap, és az objektumon belüli új érték jelenik meg annak jelzésére, hogy ez a tulajdonság mostantól ezt az értéket tartalmazza.

Mivel a „MyVariables” objektum példányát globálisan határozták meg, a kódon belül bárhol hivatkozhat az objektumon belüli meghatározott változókra.

Ennek óriási előnye van abban, hogy ha a változóit bárhol a kódjában szeretné használni, akkor csak egy globális változót kell definiálnia, és ettől a példától kezdve az összes változó szabadon hozzáférhető és módosítható a kódban.

Az objektum bővítménnyé alakítása

Eddig az objektum létrehozásának kódja megtalálható a munkafüzet alkalmazásban. Ha azonban szeretné megosztani az objektumot más fejlesztőkkel vagy más saját Excel-alkalmazásokkal, akkor bővítményt készíthet belőle

Ehhez mindössze annyit kell tennie, hogy a fájlt bővítményként menti. Válassza a Fájl | Mentés másként, és megjelenik egy böngészőablak

Válassza ki a fájltípust bővítményként (.xlam) a fájltípus legördülő menüből, majd kattintson az OK gombra. A fájl alapértelmezés szerint a Bővítmény mappába kerül, de módosíthatja a helyét.

Ezt követően beépítheti a bővítményfájlt Excel-alkalmazásaiba, így rugalmasan használhatja az új objektumot

Ha az új bővítményt be szeretné illeszteni az Excelbe, kattintson a Fájl elemre az Excel szalagon, majd kattintson a Beállítások lehetőségre a bal oldali panel alján

Kattintson a megjelenő előugró ablak bal oldali ablaktábláján található „Bővítmények” elemre. Az ablak alján található egy „Go” feliratú gomb

Kattintson erre, és megjelenik egy „Bővítmény” előugró ablak. Kattintson a „Tallózás” gombra, majd keresse meg a bővítményfájlt. Ezután hivatkozhat az objektumra a kódban.

Segít a fejlesztés a helyszínen, megosztva az oldalt a barátaiddal

wave wave wave wave wave