Udalosti programu Excel VBA

Udalosti sa dejú vždy, keď používateľ otvorí zošit programu Excel a začne vykonávať rôzne akcie, ako napríklad vkladanie údajov do buniek alebo presúvanie medzi listami.

V editore jazyka Visual Basic (ALT+F11) sú už nakonfigurované čiastkové rutiny, ktoré sa môžu spustiť, keď používateľ urobí niečo napr. zadávanie údajov do bunky. Drobná rutina neposkytuje žiadny kód akcie, iba príkaz „Sub“ a príkaz „End Sub“, pričom medzi nimi nie je žiadny kód. Sú v skutočnosti spiace, takže sa nič nestane, kým nezadáte kód.

Tu je príklad založený na udalosti „Zmeniť“ v pracovnom hárku:

Ako programátor VBA môžete pridať kód, aby sa určité veci stali, keď používateľ vykoná konkrétnu akciu. To vám dáva možnosť ovládať používateľa a zabrániť mu v tom, aby robil činnosti, ktoré nechcete, aby robili a ktoré by mohli poškodiť váš zošit. Môžete napríklad chcieť, aby si uložili svoju vlastnú individuálnu kópiu zošita pod iným menom, aby neovplyvnili originál, ktorý môže používať niekoľko používateľov.

Ak zatvoria zošit, budú automaticky vyzvaní na uloženie svojich zmien. Zošit má však udalosť „BeforeClose“ a vy môžete zadať kód, aby ste zabránili zatvoreniu zošita a spusteniu udalosti „Uložiť“. Potom môžete do samotného pracovného hárka pridať tlačidlo a vložiť doň svoju vlastnú rutinu „Uložiť“. Rutinu „Uložiť“ môžete tiež deaktivovať pomocou udalosti „BeforeSave“

Pochopenie toho, ako udalosti fungujú, je pre programátora VBA úplne nevyhnutné.

Druhy udalostí

Pracovný zošit Diania - tieto udalosti sa spúšťajú na základe toho, čo používateľ robí so samotným zošitom. Zahŕňajú činnosti používateľa, ako je otvorenie zošita, zatvorenie zošita, uloženie zošita, pridanie alebo odstránenie hárka

Pracovný list Udalosti - tieto udalosti sú spustené používateľom, ktorý vykonáva akcie na konkrétnom pracovnom hárku. Každý pracovný hárok v zošite má modul individuálneho kódu, ktorý obsahuje rôzne udalosti konkrétne pre tento pracovný hárok (nie pre všetky pracovné hárky). Patria sem akcie používateľov, ako je zmena obsahu bunky, dvojité kliknutie na bunku alebo kliknutie pravým tlačidlom myši na bunku.

Udalosti aktívneho ovládania X - Ovládacie prvky Active X je možné pridať do pracovného hárka pomocou ikony „Vložiť“ na karte „Vývojár“ na páse s nástrojmi programu Excel. Často ide o tlačidlové ovládacie prvky, ktoré umožňujú používateľovi vykonávať rôzne akcie pod kontrolou vášho kódu, ale môžu to byť aj objekty, ako napríklad rozbaľovacie ponuky. Použitie ovládacích prvkov Active X na rozdiel od ovládacích prvkov formulára v pracovnom hárku poskytuje celý rozsah programovateľnosti. Ovládacie prvky Active X vám poskytujú z programovacieho hľadiska oveľa väčšiu flexibilitu pri používaní ovládacích prvkov formulára v hárku.

Na pracovnom hárku môžete mať napríklad dve rozbaľovacie ovládacie prvky. Chcete, aby dostupný zoznam v druhom rozbaľovacom zozname vychádzal z toho, čo si používateľ vybral v prvom rozbaľovacom zozname. Pomocou udalosti „Zmeniť“ v prvom rozbaľovacom zozname môžete vytvoriť kód na prečítanie toho, čo si používateľ vybral, a potom aktualizovať druhé rozbaľovacie okno. Môžete tiež deaktivovať druhú rozbaľovaciu ponuku, kým si používateľ nevyberie v prvej rozbaľovacej ponuke

Udalosti UserForm - Môžete vložiť a navrhnúť profesionálne vyzerajúci formulár, ktorý sa použije ako kontextové okno. Všetky ovládacie prvky, ktoré umiestnite do formulára, sú ovládacie prvky Active X a majú rovnaké udalosti ako ovládacie prvky Active X, ktoré môžete umiestniť do pracovného hárka

Udalosti grafu - Tieto udalosti sa týkajú iba hárka grafu, a nie grafu, ktorý sa zobrazuje ako súčasť pracovného hárka. Medzi tieto udalosti patrí zmena veľkosti grafu alebo výber grafu.

Udalosti aplikácie - Tieto používajú objekt aplikácie vo VBA. Príklady by umožnili spustenie kódu pri stlačení určitého klávesu alebo po dosiahnutí určitého času. Môžete naprogramovať situáciu, keď zošit zostane otvorený 24/7 a importuje údaje z externého zdroja cez noc vo vopred určenom čase.

Nebezpečenstvo používania kódu v udalostiach

Keď píšete kód, aby ste urobili niečo, keď používateľ vykoná určitú akciu, musíte mať na pamäti, že váš kód môže spúšťať ďalšie udalosti, ktoré by mohli váš kód zaradiť do súvislej slučky.

Predpokladajme napríklad, že v hárku použijete udalosť „Zmeniť“, takže keď používateľ vloží do bunky hodnotu, výpočet založený na tejto bunke sa vloží do bunky bezprostredne napravo od nej.

Problém je v tom, že vloženie vypočítanej hodnoty do bunky spustí ďalšiu udalosť „Zmena“, ktorá potom spustí ďalšiu udalosť „Zmena“ atď., Kým vášmu kódu nedôjdu stĺpce na použitie a nevráti sa chybové hlásenie.

Pri písaní kódu udalosti musíte starostlivo premyslieť, aby ste sa presvedčili, že ostatné udalosti neboli spustené neúmyselne

Zakázať udalosti

Na vyriešenie tohto problému môžete použiť kód na zakázanie udalostí. Čo budete musieť urobiť, je vložiť kód na deaktiváciu udalostí počas spustenia kódu udalosti a potom znova povoliť udalosti na konci kódu. Tu je príklad, ako to urobiť:

1234 Sub DisableEvents ()Application.EnableEvents = FalseApplication.EnableEvents = PravdaKoniec pod

Majte na pamäti, že týmto sa deaktivujú všetky udalosti v celej aplikácii Excel, takže to ovplyvní aj ďalšie funkcie v programe Excel. Ak to z akéhokoľvek dôvodu použijete, uistite sa, že potom budú udalosti znova zapnuté.

Význam parametrov v udalostiach

Udalosti majú spravidla parametre, pomocou ktorých môžete zistiť viac o tom, čo používateľ robí a o umiestnení bunky, v ktorej sa nachádza.

Udalosť Zmena pracovného hárka napríklad vyzerá takto:

1 Súkromný čiastkový pracovný hárok_Zmeniť (ByVal cieľ ako rozsah)

Pomocou objektu rozsah môžete zistiť súradnice riadka/stĺpca bunky, v ktorých sa používateľ skutočne nachádza.

1234 Súkromný čiastkový pracovný hárok_Zmeniť (ByVal cieľ ako rozsah)MsgBox Target.ColumnCieľ MsgBox. RiadokKoniec pod

Ak chcete, aby váš kód fungoval iba na určitom stĺpci alebo čísle riadka, pridajte podmienku, ktorá ukončí podprogram, ak stĺpec nie je požadovaný.

123 Súkromný čiastkový pracovný hárok_Zmeniť (ByVal cieľ ako rozsah)Ak je Target.Stĺpec 2, potom Ukončiť SubKoniec pod

Toto obchádza problém vášho kódu so spustením viacerých udalostí, pretože bude fungovať iba vtedy, ak používateľ zmenil bunku v stĺpci 2 (stĺpci B)

Príklady udalostí v zošite (nie sú vyčerpávajúce)

Udalosti zošita sa nachádzajú pod objektom „ThisWorkbook“ v Prieskumníkovi projektov VBE. V prvom rozbaľovacom zozname v okne kódu budete musieť vybrať „Pracovný zošit“ a potom v druhom rozbaľovacom zozname sa zobrazia všetky dostupné udalosti.

Otvorená udalosť zošita

Táto udalosť sa spustí vždy, keď používateľ otvorí zošit. Môžete to použiť na odoslanie uvítacej správy používateľovi zachytením jeho používateľského mena

123 Súkromný čiastkový zošit_Otvorený ()MsgBox „Vitajte“ a Application.UserNameKoniec pod

Môžete tiež skontrolovať ich používateľské meno v zozname umiestnenom na skrytom hárku a zistiť, či majú oprávnenie na prístup k zošitu. Ak nie sú autorizovanými používateľmi, môžete zobraziť správu a zavrieť zošit, aby ho nemohli používať.

Zošit Udalosť nový list

Táto udalosť sa spustí, keď používateľ pridá nový hárok do zošita

Tento kód by ste mohli použiť iba na to, aby ste si mohli pridať nový hárok, a nie na to, aby všetci používatelia pridávali hárky a robili chaos v zošite

1234567 Súkromný čiastkový zošit_Nový list (objekt ByVal Sh As)Application.DisplayAlerts = FalseAk Application.UserName "Richard" PotomSh.DeleteKoniec AkApplication.DisplayAlerts = PravdaKoniec pod

Upozorňujeme, že musíte vypnúť upozornenia, pretože keď sa hárok odstráni, zobrazí sa používateľské upozornenie, ktoré používateľovi umožní obísť váš kód. Uistite sa, že potom znova zapnete upozornenia!

Ste unavení z hľadania príkladov kódu VBA? Skúste AutoMacro!

Zošit pred uložením udalosti

Táto udalosť sa spustí, keď používateľ klikne na ikonu „Uložiť“, ale skôr, ako sa „Uložiť“ skutočne uskutoční

Ako je popísané vyššie, možno budete chcieť zabrániť používateľom ukladať ich zmeny do pôvodného zošita a prinútiť ich vytvoriť novú verziu pomocou tlačidla na pracovnom hárku. Všetko, čo musíte urobiť, je zmeniť parameter „Zrušiť“ na „True“ a zošit nemožno nikdy uložiť konvenčnou metódou.

123 Súkromný čiastkový zošit_BeforeSave (ByVal SaveAsUI ako Boolean, Zrušiť ako Boolean)Zrušiť = PravdaKoniec pod

Zošit pred blízkou udalosťou

Túto udalosť môžete použiť na to, aby ste zabránili zatvoreniu zošita a znova ich prinútili opustiť tlačidlo pracovného hárka. Opäť ste nastavili parameter „Zrušiť“ na „True“. Červené X v pravom hornom rohu okna programu Excel už nefunguje.

123 Súkromný čiastkový zošit_BeforeClose (zrušiť ako boolean)Zrušiť = PravdaKoniec pod

Príklady udalostí pracovného hárka (nie sú vyčerpávajúce)

Udalosti pracovného hárka sa nachádzajú pod konkrétnym objektom názvu hárka v programe VBE Project Explorer. V prvom rozbaľovacom zozname v okne kódu budete musieť vybrať „Pracovný list“ a potom v druhom rozbaľovacom zozname sa zobrazia všetky dostupné udalosti.

Udalosť zmeny pracovného hárka

Táto udalosť sa spustí, keď používateľ vykoná zmenu v hárku, napríklad zadaním novej hodnoty do bunky

Túto udalosť môžete použiť na vloženie ďalšej hodnoty alebo komentára vedľa zmenenej bunky, ale ako už bolo uvedené vyššie, nechcete začať započítavať slučku udalostí.

12345 Súkromný čiastkový pracovný hárok_Zmeniť (ByVal cieľ ako rozsah)Ak je cieľový stĺpec 2, potom ukončite podpoložkuActiveSheet.Cells (Target.Row, Target.Column + 1). Hodnota = _ActiveSheet.Cells (Target.Row, Target.Column). Hodnota * 1,1Koniec pod

V tomto prípade bude kód fungovať iba vtedy, ak je hodnota zadaná do stĺpca B (stĺpec 2). Ak je to pravda, číslo sa zvýši o 10% a umiestni sa do ďalšej dostupnej bunky

Pracovný list pred udalosťou dvojitého kliknutia

Táto udalosť spustí kód, ak používateľ dvakrát klikne na bunku. To môže byť veľmi užitočné pre finančné správy, ako sú súvaha alebo výkaz ziskov a strát, kde manažéri môžu spochybniť čísla, najmä ak je konečný výsledok negatívny!

Môžete to použiť na poskytnutie podrobnej analýzy, takže keď manažér napadne konkrétne číslo, stačí dvakrát kliknúť na číslo a členenie sa zobrazí ako súčasť správy.

To je z pohľadu používateľa veľmi pôsobivé a šetrí ho to, že sa neustále pýta: „Prečo je toto číslo také vysoké?

Na zistenie záhlavia / kritérií pre číslo (pomocou vlastností objektu Cieľ) budete musieť napísať kód a potom filtrovať tabuľkové údaje a potom ich skopírovať do zostavy.

Programovanie VBA | Generátor kódu pracuje za vás!

Pracovný list Aktivovať udalosť

K tejto udalosti dochádza, keď sa používateľ presúva z jedného listu na druhý. Vzťahuje sa na nový hárok, do ktorého sa používateľ presúva.

Dalo by sa to použiť na zaistenie toho, aby bol nový hárok úplne vypočítaný predtým, ako na ňom používateľ začne čokoľvek robiť. Môže sa tiež použiť iba na prepočítanie konkrétneho listu bez prepočítania celého zošita. Ak je zošit veľký a obsahuje komplikovaný vzorec, prepočítanie jedného listu ušetrí veľa času

123 Súkromný čiastkový pracovný hárok_Aktivovať ()ActiveSheet.CalculateKoniec pod

Udalosti aktívneho ovládania X (nie sú vyčerpávajúce)

Ako bolo uvedené vyššie, ovládacie prvky Active X môžete pridať priamo do pracovného hárka. Môžu to byť príkazové tlačidlá, rozbaľovacie ponuky a zoznamy

Udalosti Active X sa nachádzajú pod konkrétnym objektom názvu hárka (kam ste pridali ovládací prvok) v Prieskumníkovi projektov VBE. V prvom rozbaľovacom zozname v okne kódu budete musieť vybrať názov ovládacieho prvku Active X a potom v druhom rozbaľovacom zozname sa zobrazia všetky dostupné udalosti.

Príkazové tlačidlo Kliknite na položku Udalosť

Keď do tabuľky vložíte príkazové tlačidlo, budete chcieť, aby vykonal nejakú akciu. Vykonáte to vložením kódu do udalosti Click.

Môžete na to ľahko vložiť správu „Ste si istí?“, Aby sa pred spustením kódu vykonala kontrola

12345 Súkromné ​​sub CommandButton1_Click ()Dim ButtonRet ako variantButtonRet = MsgBox („Ste si istí, že to chcete urobiť?“, VbQuestion Alebo vbYesNo)Ak ButtonRet = vbNo, potom ukončite podKoniec pod

Rozbaľovacia ponuka (kombinovaný box) Udalosť zmeny

Rozbaľovací zoznam Active X má udalosť zmeny, takže ak si používateľ vyberie konkrétnu položku z rozbaľovacieho zoznamu, môžete pomocou tejto udalosti zachytiť jeho výber a potom napísať kód, aby ste zodpovedajúcim spôsobom prispôsobili ďalšie časti listu alebo zošita.

123 Súkromný pod ComboBox1_Change ()MsgBox „Vybrali ste“ & ComboBox1.TextKoniec pod

Programovanie VBA | Generátor kódu pracuje za vás!

Začiarkavacie políčko (začiarkavacie políčko) Kliknite na položku Udalosť

Do pracovného hárka môžete pridať začiarknutie alebo začiarkavacie políčko, aby mal používateľ k dispozícii možnosti. Môžete pomocou udalosti kliknutia zistiť, či používateľ na tomto niečo zmenil. Vrátené hodnoty sú pravdivé alebo nepravdivé podľa toho, či bolo začiarknuté alebo nie.

123 Súkromný pod checkbox1_Click ()MsgBox CheckBox1.HodnotaKoniec pod

Udalosti UserForm (nie sú vyčerpávajúce)

Excel vám poskytuje možnosť navrhovať vlastné formuláre. Môžu byť veľmi užitočné ako kontextové okná na zhromažďovanie informácií alebo na poskytovanie viacerých možností pre používateľa. Používajú ovládacie prvky Active X, ako bolo popísané vyššie, a majú úplne rovnaké udalosti, aj keď udalosti veľmi závisia od typu ovládania.

Tu je príklad jednoduchého formulára:

Keď je zobrazený, takto vyzerá na obrazovke

Udalosti vo formulári by ste použili napríklad na zadanie predvoleného názvu spoločnosti pri otvorení formulára, na kontrolu, či zadanie názvu spoločnosti súhlasí s údajom, ktorý už je v tabuľke, a ktorý nebol napísaný nesprávne, a na pridanie kódu na kliknutie udalosti pomocou tlačidiel „OK“ a „Zrušiť“

Kód a udalosti za formulárom je možné zobraziť dvojitým kliknutím kdekoľvek vo formulári

Prvá rozbaľovacia ponuka poskytuje prístup ku všetkým ovládacím prvkom vo formulári. Druhá rozbaľovacia ponuka umožní prístup k udalostiam

Udalosť aktivácie UserForm

Táto udalosť sa spustí, keď je formulár aktivovaný, zvyčajne keď je zobrazený. Túto udalosť je možné použiť na nastavenie predvolených hodnôt, napr. predvolený názov spoločnosti v textovom poli názov spoločnosti

123 Private Sub UserForm_Activate ()TextBox1.Text = "Názov mojej spoločnosti"Koniec pod

Programovanie VBA | Generátor kódu pracuje za vás!

Zmeniť udalosť

Väčšina ovládacích prvkov vo formulári má udalosť zmeny, ale v tomto prípade môže textové pole názvu spoločnosti použiť udalosť na obmedzenie dĺžky zadávania názvu spoločnosti

123456 Súkromný podtextový rámček1_Zmeniť ()Ak Len (TextBox1.Text)> 20 PotomMsgBox „Názov je obmedzený na 20 znakov“, vbCriticalTextBox1.Text = ""Koniec AkKoniec pod

Kliknite na položku Udalosť

Túto udalosť môžete použiť na vykonanie akcie, keď používateľ klikne na ovládacie prvky vo formulári alebo dokonca v samotnom formulári

V tomto formulári je tlačidlo „OK“ a po zhromaždení názvu spoločnosti by sme ho chceli vložiť do bunky v tabuľke pre budúce použitie.

1234 Súkromné ​​sub CommandButton1_Click ()ActiveSheet.Range ("A1"). Hodnota = TextBox1. TextJa. SkryťKoniec pod

Tento kód funguje, keď používateľ klikne na tlačidlo „OK“. Vloží hodnotu do vstupného poľa názvu spoločnosti do bunky A1 na aktívnom hárku a potom skryje formulár, aby sa používateľské ovládanie vrátilo späť do pracovného hárka.

Udalosti grafu

Udalosti grafu fungujú iba na grafoch, ktoré sú na samostatnom hárku grafu, a nie na grafe, ktorý je začlenený do štandardného pracovného hárka

Udalosti grafu sú do určitej miery obmedzené a nemožno ich použiť v pracovnom hárku, kde by ste mohli mať viacero grafov. Používatelia tiež nemusia nevyhnutne chcieť prejsť z pracovného hárka obsahujúceho čísla na hárok grafu - tu neexistuje žiadny okamžitý vizuálny vplyv

Najužitočnejšou udalosťou by bolo zistiť súčasť grafu, na ktorú používateľ klikol, napr. segment v koláčovom grafe alebo stĺpci v stĺpcovom grafe, ale toto nie je udalosť dostupná v štandardnom rozsahu udalostí.

Tento problém je možné vyriešiť použitím modulu triedy na pridanie udalosti „Mouse Down“, ktorá vráti podrobnosti o komponente grafu, na ktorý používateľ klikol. Toto sa používa v grafe v pracovnom hárku.

Zahŕňa to veľmi komplikované kódovanie, ale výsledky sú veľkolepé. Vŕtania môžete vytvárať napr. používateľ klikne na segment koláčového grafu a okamžite je tento diagram skrytý a na jeho mieste sa zobrazí druhý graf ukazujúci koláčový graf podrobností pre pôvodný segment, alebo by ste mohli vytvoriť tabuľkové údaje podporujúce tento segment koláčového grafu.

Udalosti aplikácie

Objekt Application vo VBA môžete použiť na vypálenie kódu podľa konkrétnej udalosti

Programovanie VBA | Generátor kódu pracuje za vás!

Application.OnTime

To vám umožní vypaľovať kus kódu v pravidelných intervaloch, pokiaľ je zošit načítaný do Excelu. Možno budete chcieť svoj zošit automaticky uložiť do iného priečinka každých 10 minút, alebo nechať pracovný hárok bežať cez noc, aby ste získali najnovšie údaje z externého zdroja.

V tomto prípade je do modulu vložená čiastková rutina. Každých 5 minút sa zobrazí okno so správou, aj keď to môže byť jednoducho iný kódovaný postup. Súčasne vynuluje časovač na aktuálny čas plus ďalších 5 minút.

Zakaždým, keď sa spustí, časovač sa resetuje, aby spustil rovnakú čiastkovú rutinu o ďalších 5 minút.

1234 Sub TestOnTime ()MsgBox „Testovanie včas“Application.OnTime (Now () + TimeValue ("00:05:00")), "TestOnTime"Koniec pod

Aplikácia.OnKey

Táto funkcia vám umožňuje navrhnúť vlastné klávesové skratky. Ktorúkoľvek kombináciu klávesov môžete nechať volať pod rutinou svojho stvorenia.

V tomto prípade je písmeno „a“ presmerované tak, že namiesto umiestnenia „a“ do bunky zobrazí pole so správou. Tento kód je potrebné vložiť do vloženého modulu.

123456 Sub TestKeyPress ()Application.OnKey "a", "TestKeyPress"Koniec podSub TestKeyPress ()MsgBox "Stlačili ste 'a'"Koniec pod

Najprv spustíte vedľajšiu rutinu „TestKeyPress“. Toto stačí spustiť iba raz. Hovorí Excelu, že pri každom stlačení písmena „a“ sa zavolá čiastková rutina „TestKeyPress“. Vedľajšia rutina „TestKeyPress“ iba zobrazí okno so správou, ktoré vám povie, že ste stlačili kláves „a“. Mohlo by to samozrejme načítať formulár alebo vykonávať všetky ostatné veci.

Môžete použiť akúkoľvek kombináciu klávesov, ktorú môžete použiť s funkciou „SendKeys“

Ak chcete túto funkciu zrušiť, spustíte príkaz „OnKey“ bez parametra „Procedúra“.

123 Sub CancelOnKey ()Application.OnKey "a"Koniec pod

Teraz je všetko späť do normálu.

Vám pomôže rozvoju miesta, zdieľať stránku s priateľmi

wave wave wave wave wave