Výukový program modulu Modul VBA a příklady

Tento tutoriál vás naučí o modulech třídy ve VBA. Dozvíte se, co jsou zač a jak je používat.

Moduly třídy VBA - úvod

Když vložíte moduly do editoru jazyka Visual Basic (VBE) za účelem zadání kódu, možná jste si všimli, že můžete také vložit takzvaný „modul třídy“.

Moduly třídy vs. moduly

Moduly třídy fungují velmi odlišným způsobem než běžné moduly v tom, že usnadňují vytváření modelu Component Object Model (COM), který pak lze použít v rámci normálního kódu VBA

Účinně vytvoříte objekt, který funguje stejným způsobem jako vestavěný objekt aplikace Excel, například „Pracovní listy“. V objektu sešitů máte řadu vlastností a metod, které vám umožňují získat počet listů v sešitu nebo každý jednotlivý název listu nebo mnoho dalších informací.

Když tímto způsobem vytvoříte nový objekt, vytvoříte stavební blok, který lze použít kdekoli ve VBA. Objekt má řadu vlastností a metod, ke kterým má váš kód VBA přístup odkudkoli ze sešitu, aniž byste museli kód znovu přepisovat.

Kromě odkazu na váš nový objekt ze standardního modulu VBA ho můžete také použít v kódu za UserForm, který je součástí vaší vlastní aplikace

Můžete jej také použít tam, kde jste na list umístili ovládací prvky Active X, například příkazové tlačítko nebo rozevírací seznam. Všechny tyto ovládací prvky používají VBA a váš nový objekt lze snadno začlenit do kódu události pro tyto ovládací prvky.

Svůj objekt můžete také změnit na doplněk aplikace Excel. Váš objekt bude automaticky k dispozici ostatním uživatelům, kteří mají tento doplněk načten. To přidá do vaší aplikace Excel vaši vlastní víceúrovňovou architekturu

Excel je víceúrovňová aplikace. Existuje vrstva klientských služeb, která řídí skutečné okno pracovního listu, se kterým je uživatel obeznámen. Objektový model aplikace Excel je další vrstva pod ním. Stiskněte F2 v modulu VBA a budete moci vidět obrovské množství objektů a členů těch objektů, které jsou motorem Excelu. Všimněte si, že zde bude také zobrazen váš nový objekt.

Konečně pod tím vším máte vrstvu datových služeb, která obsahuje všechna data, která jste zadali do listů a buněk. Excel k tomu přistupuje pomocí objektového modelu Excelu.

Vytvoření modulu třídy umožňuje rozšířit objektový modul aplikace Excel o vlastní objekty a členy

Tento článek vám vysvětluje, jak pomocí modulů třídy vytvořit jednoduchou hierarchii objektů.

Výhody použití třídních modulů

  1. Můžete vyvinout robustní stavební blok, který lze použít v libovolném počtu různých aplikací aplikace Excel
  2. Jakmile je důkladně testován, pak se lze spolehnout, že vždy vytvoří správné výsledky stejným způsobem jako vestavěné objekty aplikace Excel
  3. Pokud jsou provedeny aktualizace kódu jinde v aplikaci, nový objekt bude i nadále fungovat stejným způsobem
  4. Nový objekt můžete použít v jiných aplikacích aplikace Excel jako doplněk
  5. Objekty lze znovu použít v jiných aplikacích a pomáhají při ladění

Nevýhody používání třídních modulů

  1. Může být obtížné je vytvořit a pochopit.
  2. Konvence pojmenování jsou velmi důležité, protože to uvidíte při použití objektu v normálním modulu.
  3. Pokud jste dosud nevytvořili modul třídy, může být obtížné je pochopit a existuje strmá křivka učení
  4. Nelze provádět změny za běhu-musíte projekt znovu nastavit.
  5. Pokud mají vlastnosti a soukromé proměnné stejný název, může dojít k nekonečným smyčkám, což vede k chybám

Vložení modulu třídy

Vyberte Vložit | Class Module z nabídky VBE (Editor jazyka). Nový modul třídy bude automaticky nazýván „Třída 1“, ale to je třeba okamžitě změnit na název, který budete pro svůj objekt používat

Název změníte v okně Vlastnosti, kam ukazuje šipka. Jednoduše zadáte své nové jméno a to se změní v kolekci modulů třídy

Pokud okno Vlastnosti není viditelné, vyberte Zobrazit | Vlastnosti v nabídce VBE nebo stiskněte F4

Zavolejte svůj nový modul třídy „MyItem“ a dvojitým kliknutím na název ve stromovém zobrazení v Průzkumníku projektů zobrazte okno kódu.

Vytvoření položky objektu

Tento příklad vytvoří objekt nejvyšší úrovně s názvem „MyItems“ a pod ním členský objekt s názvem „MyItem“, který bude uchovávat jednotlivá data pro každou položku. Po vytvoření bude fungovat stejným způsobem jako vestavěný objekt aplikace Excel. Existuje například objekt nazvaný „Pracovní listy“, což je sbírka každého listu ve vašem sešitu. Existuje také objekt nazvaný „List“, který představuje každý jednotlivý list ve vašem sešitu a obsahuje všechny vlastnosti a metody pro každý list. Tento objekt se týká objektu sbírky „Pracovní listy“.

Můžete iterovat prostřednictvím kolekce „Pracovní listy“ a postupně si prohlížet každý „List“. Stejným způsobem budete moci iterovat prostřednictvím kolekce „MyItems“ a prohlížet vlastnosti, které jste vytvořili v členu „Myitem“.

První věcí, kterou musíte udělat, je vytvořit dílčí objekt pro členskou úroveň, který bude obsahovat skutečné položky v kolekci objektu nejvyšší úrovně. Toto je ekvivalent členů (např. Název, viditelný, počet) v objektu „List“ v aplikaci Excel. Tento kód je zadán do modulu třídy s názvem „MyItem“

Moduly třídy mají vlastnosti a metody. Vlastnosti jsou ve skutečnosti jako proměnné v tom, že uchovávají hodnoty dat jako proměnné a metody jsou jako dílčí rutiny nebo funkce.

V dílčím objektu vytvoříme pro objekt dvě vlastnosti - Item a Detail

Zpočátku je třeba deklarovat dvě proměnné řetězce, aby obsahovaly hodnoty pro vlastnosti:

12 Soukromá položka jako řetězecSoukromý mDetail jako řetězec

Ty je třeba deklarovat v sekci Deklarace v horní části kódu pro modul třídy, aby je bylo možné použít ve všech dílčích rutinách v celém modulu

Je třeba jim přidělit jedinečná jména, aby se odlišovali od vlastností, které se chystáme vytvořit, takže před každé jméno bylo uvedeno „m“ (pro člena).

Proměnné jsou deklarovány jako soukromé, takže je nemůže vidět nikdo, kdo objekt používá. Jsou to pracovní proměnné pro použití v kódu objektu a nejsou tam jako součást konečného objektu.

Dalším krokem je nastavení kódu, který umožní přístup ke dvěma vlastnostem. To provedete pomocí prohlášení Property Let a Property Get pro každou vlastnost. Ty musí být veřejné, jinak objekt nejvyšší úrovně nebude mít žádné viditelné vlastnosti

123456789101112131415 Public Property Let Item (vdata As String)mItem = vdataKoncová vlastnostVeřejný majetek Získat položku () jako řetězecItem = mItemKoncová vlastnostPublic Property Let Detail (vdata As String)mDetail = vdataKoncová vlastnostVeřejný majetek Získejte detail () jako řetězecDetail = mDetailKoncová vlastnost

Tento kód vytváří prostředky pro čtení a zápis hodnot do dvou vlastností (Item a Detail) pomocí dvou soukromých proměnných, které byly definovány v sekci deklarací modulu.

Parametr „vdata“ se používá k předávání dat do dotyčného majetku.

Je důležité, aby každá vlastnost měla příkazy „Let“ a „Get“ a aby název vlastnosti byl v každém případě stejný. V případě chybné hláskování můžete skončit se dvěma různými vlastnostmi - jednou, ze které můžete číst a do které můžete psát!

Chcete -li pomoci s vytvořením tohoto kódu, můžete použít Vložit | Postup v nabídce VBE k vytvoření kostry kódu, která vytvoří počáteční kód pro vlastnosti „Získat“ a „Nechat“ pro název dané vlastnosti

Zobrazí se vyskakovací okno, do kterého zadáte název vlastnosti a na přepínačích vyberete „Vlastnost“:

Klikněte na „OK“ a kód kostry bude přidán do modulu třídy:

1234567 Veřejný majetek Získejte MyProperty () jako variantuKoncová vlastnostPublic Property Let MyProperty (ByVal vNewValue As Variant)Koncová vlastnost

Tím se zabrání jakýmkoli chybám v názvech vlastností. Jednoduše přidáte kód mezi prohlášení „Veřejné vlastnictví“ a „Koncové vlastnictví“.

Nyní máte objekt s názvem „MyItem“, který bude uchovávat všechna data pro toto cvičení.

Už vás nebaví hledat příklady kódu VBA? Zkuste AutoMacro!

Vytvoření kolekce

Další fází je vytvoření objektu nejvyšší úrovně jako objektu Collection, který umožní přístup k vlastnostem, které jste nastavili v objektu „MyItem“

Opět musíte definovat fungující objekt tak, aby fungoval jako objekt kolekce stejným způsobem, jakým jste definovali dvě řetězcové proměnné v objektu „MyItem“.

1 Soukromé položky jako sbírka

Opět platí, že toto musí mít jedinečný název, proto je před jménem „m“ (členský objekt) a je také deklarováno jako „soukromé“, takže se nezobrazí, když je nový objekt právě použitý

Dále musíte naplnit kód Class_Initialize. Spustí se při prvním použití objektu v kódu a určuje, jaké hodnoty budou do objektu načteny

K této dílčí rutině se dostanete výběrem „Třída“ v prvním rozevíracím seznamu a „Inicializovat“ ve druhém rozevíracím seznamu v okně modulu

12345678910 Soukromá podtřída_Initialize ()Dim objItem As MyItemNastavit mItems = Nová kolekcePro n = 1 až 3Nastavit objItem = New MyItemobjItem.Item = Pracovní listy ("List1"). Rozsah ("a" & n) .HodnotaobjItem.Detail = Pracovní listy ("List1"). Rozsah ("b" & n) .HodnotamItems.Add objItemDalší nEnd Sub

Kód nastaví objekt nazvaný „objItem“ pomocí definice „MyItem“, kterou jsme dříve vytvořili jako modul třídy.

Poté vytvoří novou kolekci na základě dříve definovaného objektu „mItems“

Iteruje prostřednictvím hodnot uložených na listu 1 sešitu a vkládá je do vlastností, které jsme vytvořili pro objekt „MyItem“. Všimněte si, že když použijete „objitem“, zobrazí se rozevírací seznam zobrazující dvě vlastnosti, přesně jako byste používali vestavěný objekt aplikace Excel.

Objekt item je pak přidán do objektu kolekce, který nyní obsahuje všechna data v hodnotách vlastností.

Vstupní data nemusí být převzata z listu. Mohou to být statické hodnoty, nebo to může pocházet z připojení k databázi, jako je Microsoft Access nebo SQL Server, nebo to může pocházet z jiného listu.

Poté musíte přidat veřejnou funkci s názvem „Položka“

123 Položka veřejné funkce (index jako celé číslo) jako MyItemNastavit položku = mItems.Item (index)Koncová funkce

To vám umožňuje odkazovat na jednotlivé objekty v rámci objektu kolekce podle jejich indexového čísla. Tato funkce poskytuje „zrcadlo“ toho, co se děje v kolekci „mMyItems“ na pozadí.

Budete také muset přidat vlastnost nazvanou „Počet“, aby váš kód mohl určit, kolik objektů „MyItem“ se nachází v kolekci „MyItems“, pokud si přejete iterovat prostřednictvím této kolekce.

123 Veřejný majetek Získejte počet () jako dlouhýCount = mItems.CountKoncová vlastnost

V tomto případě potřebujete pouze vlastnost „Získat“, protože je jen pro čtení. Používá kolekci mItems, protože v ní je již integrována vlastnost count.

Nyní máte objekt (MyItems) s plnou hierarchií definovanou objektem „MyItem“

Aby to celé fungovalo, musíte nyní naplnit list (List1) daty, aby to rutina Class Initialize mohla shromáždit do objektu

Vaše tabulka by měla vypadat takto:

Použití nového objektu

Nyní můžete svůj objekt Collection (MyItems) používat ve standardním modulu Excel VBA. Zadejte následující kód:

12345678 Dílčí test_objekt ()Dim MyClass as New MyItems, n As IntegerMsgBox MyClass.CountPro n = 1 do MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailDalší nEnd Sub

Tento kód vytvoří objekt s názvem „MyClass“ na základě objektu kolekce, který jste vytvořili, s názvem „MyItems“. Tím vypnete rutinu „Inicializace“, která extrahuje všechna data z listu do objektu.

Zobrazuje počet položek ve sbírce a poté iteruje kolekcí a zobrazuje text „Položka“ a „Detail“. Všimnete si, že když v kódu odkazujete na objekt „MyClass“, zobrazí se vám seznam dvou členských vlastností, které pomáhají při přidávání správné vlastnosti.

Pokud změníte hodnotu buňky ve vstupních datech v tabulce, tato se automaticky aktualizuje v kolekci, když znovu spustíte výše uvedený kód, protože když objekt dimenzujete, spustí se inicializační rutina a vyzvedne všechna nová data

Pokud místo „Dim“ použijete slovo „Static“, inicializační rutina se nespustí a staré hodnoty zůstanou zachovány, pokud je kód nepřetržitě spuštěn. Pokud se data v tabulce změní, neprojeví se to v objektu

1234567 Dílčí test_statický ()Static Myclass As New MyItems, n As IntegerPro n = 1 do Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailDalší nEnd Sub

Souhrn vytváření objektu pomocí modulu třídy

Jak jste viděli, vytvoření hierarchie třídních modulů, které se mají použít jako objekt, je docela komplikovaná záležitost, a to i pro strukturu tak jednoduchou, jako je zde uvedený příklad. Rozsah chyb je obrovský!

Má však obrovské výhody v tom, že váš kód bude elegantnější a lépe čitelný. Je také snazší sdílet s jinými aplikacemi a vývojáři aplikace Excel tím, že z něj vytvoříte doplněk.

V tomto příkladu, jak vytvořit objekt pro uložení dat, by bylo běžným přístupem vytvořit vícerozměrné pole pro uložení dat více sloupcových tabulek a vy byste napsali řádek kódu pro aktualizaci nebo čtení každého prvku v pole. To by pravděpodobně skončilo docela nepořádně a snadno by se mohly dělat chyby při řešení různých prvků.

S novým objektem můžete jednoduše odkazovat na něj a na členy, které jste pod ním vytvořili, a uchovávat data.

Také, pokud se data změní v tabulce (nebo v propojené databázi, pokud jste ji použili jako zdroj dat ve svém modulu třídy), kdykoli použijete příkaz 'Dim', bude vyvolána inicializační rutina a data budou okamžitě aktualizována . K opětovnému naplnění pole není třeba psát kód.

Použití modulu třídy k vytvoření úložiště proměnných

Při psaní kódu VBA používáte proměnné všude, vše s různým rozsahem. Některé mohou být definovány pouze pro konkrétní postup, některé pro konkrétní modul a některé mohou být globálními proměnnými, které lze použít v celé aplikaci.

Můžete vytvořit modul třídy, který pojme velké množství proměnných, a protože se jedná o objekt, lze jej použít kdekoli v kódu, dokonce i ve formuláři uživatele nebo v ovládacím prvku Active X, který jste umístili na list.

Další výhodou je, že když odkážete na svůj proměnný objekt, zobrazí se seznam všech názvů proměnných uložených v objektu seřazených vzestupně.

Chcete -li vytvořit úložiště, musíte vložit nový modul třídy. To provedete pomocí Vložit | Class Module z nabídky editoru VB

Změňte název na „MyVariables“ pomocí stejné metodiky, jak byla popsána dříve v tomto článku.

Zadejte následující kód:

12345678910111213141516 Soukromý mV jako variantaVeřejný majetek Získejte proměnnou 1 () jako variantuProměnná1 = mVKoncová vlastnostPublic Property Let Variable1 (ByVal vNewValue As Variant)mV = vNewValueKoncová vlastnostVeřejný majetek Získejte proměnnou 2 () jako variantuProměnná1 = mVKoncová vlastnostPublic Property Let Variable2 (ByVal vNewValue As Variant)mV = vNewValueKoncová vlastnost

Tento kód nastavuje vlastnosti „Let“ a „Get“ pro dvě proměnné („Variable1“ a „Variable2“). Vlastnosti Let and Get jsou vyžadovány pro každou z vašich proměnných, aby mohly být čteny / zapisovány

Pro proměnné můžete místo vzorových v tomto kódu použít své vlastní názvy a můžete přidat další proměnné a zajistit, aby každá nová proměnná měla příkaz „Let“ a „Get“.

Soukromá deklarace proměnné „mV“ má vytvořit pracovní proměnnou, která se používá pouze v modulu třídy k přenosu hodnot.

Chcete -li použít úložiště proměnných, zadejte do standardního modulu následující kód:

123456 Globální VarRepo jako nové MyVariablesDílčí testVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1End Sub

Tento kód vytvoří globální instanci vašeho objektu „MyVariables“, který jste vytvořili. Toto prohlášení stačí provést pouze jednou z libovolného místa v kódu.

Kód nejprve zobrazí hodnotu ‘Variable1’, aby ukázal, že je prázdný.

K „Proměnné1“ je přiřazena hodnota 10 a nová hodnota v objektu je poté zobrazena, aby se ukázalo, že tato vlastnost nyní tuto hodnotu obsahuje.

Protože instance objektu „MyVariables“ byla definována globálně, můžete se na libovolnou z definovaných proměnných v objektu odkazovat odkudkoli z vašeho kódu.

To má obrovskou výhodu v tom, že pokud chcete použít své proměnné kdekoli v kódu, stačí definovat pouze jednu globální proměnnou a z této instance lze ke všem proměnným volně přistupovat a upravovat je v celém kódu.

Proměna vašeho objektu v doplněk

Doposud je kód pro vytvoření objektu ve vaší aplikaci sešitu. Pokud však chcete mít možnost sdílet svůj objekt s jinými vývojáři nebo v jiných vlastních aplikacích aplikace Excel, můžete z něj udělat doplněk

K tomu stačí pouze uložit soubor jako doplněk. Vyberte Soubor | Uložit jako a zobrazí se okno prohlížeče

V rozevíracím seznamu vyberte typ souboru jako doplněk (.xlam) a klikněte na OK. Soubor bude ve výchozím nastavení uložen do složky Doplněk, ale umístění můžete změnit.

Soubor doplňku pak můžete začlenit do aplikací aplikace Excel, což vám poskytne flexibilitu při používání nového objektu

Chcete-li zahrnout svůj nový doplněk do Excelu, klikněte na Soubor na pásu karet aplikace Excel a poté klikněte na Možnosti v dolní části levého podokna

V zobrazeném vyskakovacím okně v levém podokně klikněte na „Doplňky“. V dolní části okna je tlačítko označené „Přejít“

Klikněte na toto a zobrazí se vyskakovací okno „Doplněk“. Klikněte na „Procházet“ a poté vyhledejte svůj soubor doplňku. Poté budete moci odkazovat na svůj objekt v kódu.

wave wave wave wave wave