Události aplikace Excel VBA

Události se dějí neustále, když uživatel otevře sešit aplikace Excel a začne provádět různé akce, jako je zadávání dat do buněk nebo přesun mezi listy

V editoru jazyka Visual Basic (ALT+F11) jsou již nastaveny dílčí rutiny, které se mohou spustit, když uživatel něco provede, např. zadávání dat do buňky. Dílčí rutina neposkytuje žádný akční kód, pouze příkaz „Sub“ a příkaz „End Sub“, aniž by mezi nimi byl kód. Jsou ve skutečnosti spící, takže se nic nestane, dokud nezadáte nějaký kód.

Zde je příklad založený na události „Změnit“ v listu:

Jako programátor VBA můžete přidat kód, aby se určité věci staly, když uživatel provede konkrétní akci. To vám dává možnost ovládat uživatele a zabránit mu v tom, aby prováděl akce, které nechcete, aby dělali a které by mohly váš sešit poškodit. Můžete například chtít, aby si uložili svou vlastní jednotlivou kopii sešitu pod jiným názvem, aby neovlivnily originál, který může používat řada uživatelů.

Pokud sešit zavřou, budou automaticky vyzváni k uložení změn. Sešit má však událost „BeforeClose“ a vy můžete zadat kód, který zabrání zavření sešitu a spuštění události „Uložit“. Poté můžete do samotného listu přidat tlačítko a vložit na něj vlastní rutinu „Uložit“. Rutinu „Uložit“ můžete také deaktivovat pomocí události „BeforeSave“

Pochopení toho, jak události fungují, je pro programátora VBA naprosto zásadní.

Typy událostí

pracovní sešit Události - tyto události se spouští na základě toho, co uživatel dělá se samotným sešitem. Zahrnují akce uživatele, jako je otevření sešitu, zavření sešitu, uložení sešitu, přidání nebo odstranění listu

Události pracovního listu - tyto události jsou spuštěny uživatelem, který provádí akce na konkrétním listu. Každý list v sešitu má samostatný modul kódu, který obsahuje různé události konkrétně pro tento list (ne pro všechny listy). Patří sem akce uživatele, jako je změna obsahu buňky, dvojité kliknutí na buňku nebo kliknutí pravým tlačítkem na buňku.

Události Active X Control - Ovládací prvky Active X lze přidat do listu pomocí ikony „Vložit“ na kartě „Vývojář“ na pásu karet aplikace Excel. Často se jedná o ovládací prvky tlačítek, které umožňují uživateli provádět různé akce pod kontrolou vašeho kódu, ale mohou to být také objekty, jako například rozevírací seznamy. Použití ovládacích prvků Active X na rozdíl od ovládacích prvků formuláře na listu poskytuje celý rozsah programovatelnosti. Ovládací prvky Active X vám poskytnou mnohem větší flexibilitu z hlediska programování při používání ovládacích prvků formuláře v listu.

Například na listu můžete mít dva rozevírací ovládací prvky. Chcete, aby dostupný seznam ve druhém rozevíracím seznamu vycházel z toho, co si uživatel vybral v prvním rozevíracím seznamu. Pomocí události „Změnit“ v prvním rozevíracím seznamu můžete vytvořit kód, který bude číst, co uživatel vybral, a poté aktualizovat druhé rozevírací seznam. Deaktivovat můžete také druhé rozevírací seznam, dokud uživatel nevybere výběr v prvním rozevíracím seznamu

Události UserForm - Můžete vložit a navrhnout profesionálně vypadající formulář, který použijete jako vyskakovací okno. Všechny ovládací prvky, které umístíte do formuláře, jsou ovládací prvky Active X a mají stejné události jako ovládací prvky Active X, které můžete umístit na list

Události grafu - Tyto události se týkají pouze listu grafu, a nikoli grafu, který se zobrazuje jako součást listu. Mezi tyto události patří změna velikosti grafu nebo výběr grafu.

Události aplikace - Používají objekt aplikace ve VBA. Příklady by umožnily vypálení kódu při stisknutí určité klávesy nebo po dosažení určitého času. Můžete naprogramovat situaci, kdy je sešit ponechán otevřený 24/7 a importuje data z externího zdroje přes noc ve předem stanoveném čase.

Nebezpečí používání kódu v událostech

Když píšete kód, abyste něco udělali, když uživatel provede určitou akci, musíte mít na paměti, že váš kód může spouštět další události, které by mohly váš kód vložit do souvislé smyčky.

Předpokládejme například, že na listu použijete událost „Změnit“, takže když uživatel vloží hodnotu do buňky, výpočet založený na této buňce bude umístěn do buňky bezprostředně napravo od ní.

Problém je v tom, že umístění vypočtené hodnoty do buňky spustí další událost „Změnit“, která následně vyvolá další událost „Změnit“ a tak dále, dokud vašemu kódu nedojdou sloupce, které se mají použít, a vyvolá chybová zpráva.

Při psaní kódu pro událost musíte pečlivě přemýšlet, abyste zajistili, že ostatní události nebudou spuštěny neúmyslně

Zakázat události

Chcete -li tento problém vyřešit, můžete použít kód k deaktivaci událostí. Co budete muset udělat, je začlenit kód pro deaktivaci událostí, zatímco je spuštěn váš kód události, a poté znovu povolit události na konci kódu. Zde je příklad, jak to udělat:

1234 Sub DisableEvents ()Application.EnableEvents = FalseApplication.EnableEvents = TrueEnd Sub

Mějte na paměti, že to zakáže všechny události přímo v aplikaci Excel, takže by to ovlivnilo i další funkce v aplikaci Excel. Pokud to z jakéhokoli důvodu použijete, ujistěte se, že se události poté znovu zapnou.

Význam parametrů v událostech

Události mají obvykle parametry, pomocí kterých se můžete dozvědět více o tom, co uživatel dělá, a o umístění buňky, ve které se nacházejí.

Událost Změna pracovního listu například vypadá takto:

1 Soukromý dílčí pracovní list_Změna (cíl podle cíle jako rozsah)

Pomocí objektu range můžete zjistit souřadnice řádku/sloupce buňky, ve které se uživatel skutečně nachází.

1234 Soukromý dílčí pracovní list_Změna (cíl podle cíle jako rozsah)MsgBox Target.ColumnMsgBox Target.RowEnd Sub

Pokud chcete, aby váš kód fungoval pouze na určitém sloupci nebo čísle řádku, přidáte podmínku, která podprogram ukončí, pokud sloupec není požadovaný.

123 Soukromý dílčí pracovní list_Změna (cíl podle cíle jako rozsah)Pokud Target.Column 2 Then Exit SubEnd Sub

To obchází problém vašeho kódu, který spouští více událostí, protože to bude fungovat pouze v případě, že uživatel změnil buňku ve sloupci 2 (sloupec B)

Příklady událostí sešitu (nejsou vyčerpávající)

Události sešitu se nacházejí pod objektem „ThisWorkbook“ v Průzkumníku projektů VBE. V prvním rozevíracím seznamu v okně kódu budete muset vybrat „Sešit“ a poté druhý rozevírací seznam zobrazí všechny dostupné události

Otevřená událost sešitu

Tato událost se spustí vždy, když uživatel sešit otevře. Můžete jej použít k zaslání uvítací zprávy uživateli zachycením jeho uživatelského jména

123 Soukromý dílčí sešit_Otevřít ()MsgBox „Vítejte“ a Application.UserNameEnd Sub

Můžete také zkontrolovat jejich uživatelské jméno podle seznamu na skrytém listu a zjistit, zda jsou oprávněni k přístupu k sešitu. Pokud nejsou oprávněnými uživateli, můžete zobrazit zprávu a zavřít sešit, aby jej nemohli používat.

Sešit Nová událost na listu

Tato událost se spustí, když uživatel přidá nový list do sešitu

Tento kód můžete použít pouze k přidání nového listu, nikoli k přidávání listů a vytváření nepořádku v sešitě od různých uživatelů

1234567 Soukromý dílčí sešit_Nový list (objekt ByVal Sh jako objekt)Application.DisplayAlerts = FalsePokud Application.UserName "Richard" PakSh.DeleteKonec IfApplication.DisplayAlerts = TrueEnd Sub

Všimněte si, že musíte vypnout výstrahy, protože varování uživatele se objeví, když je list odstraněn, což uživateli umožňuje obejít váš kód. Ujistěte se, že poté znovu zapnete upozornění!

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

Sešit před uložením události

Tato událost se spustí, když uživatel klikne na ikonu „Uložit“, ale předtím, než se „Uložit“ skutečně uskuteční

Jak již bylo popsáno dříve, možná budete chtít zabránit uživatelům v uložení jejich změn do původního sešitu a přinutit je vytvořit novou verzi pomocí tlačítka na listu. Vše, co musíte udělat, je změnit parametr ‘Zrušit’ na True a sešit nelze konvenční metodou nikdy uložit.

123 Soukromý dílčí sešit_BeforeSave (ByVal SaveAsUI jako Boolean, Zrušit jako Boolean)Zrušit = PravdaEnd Sub

Sešit před zavírací událostí

Pomocí této události můžete zabránit tomu, aby uživatelé zavírali sešit, a znovu je přinutili opustit tlačítko listu. Znovu nastavíte parametr „Zrušit“ na „True“. Červené X v pravém horním rohu okna aplikace Excel již nefunguje.

123 Soukromý dílčí sešit_BeforeClose (Zrušit jako booleovský)Zrušit = PravdaEnd Sub

Příklady událostí pracovního listu (není vyčerpávající)

Události listu se nacházejí pod konkrétním objektem názvu listu v Průzkumníku projektů VBE. V prvním rozevíracím seznamu v okně kódu budete muset vybrat „Pracovní list“ a poté druhý rozevírací seznam zobrazí všechny dostupné události

Událost změny pracovního listu

Tato událost se spustí, když uživatel provede změnu listu, například zadáním nové hodnoty do buňky

Tuto událost můžete použít k vložení další hodnoty nebo komentáře vedle změněné buňky, ale jak již bylo zmíněno dříve, nechcete začít započítávat smyčku událostí.

12345 Soukromý dílčí pracovní list_Změna (cíl podle cíle jako rozsah)Pokud Target.Column 2 Then Exit SubActiveSheet.Cells (Target.Row, Target.Column + 1). Hodnota = _ActiveSheet.Cells (Target.Row, Target.Column). Hodnota * 1,1End Sub

V tomto případě bude kód fungovat pouze v případě, že je hodnota zadána do sloupce B (sloupec 2). Pokud je to pravda, přidá k číslu 10% a umístí jej do další dostupné buňky

Pracovní list před událostí dvojitého kliknutí

Tato událost spustí kód, pokud uživatel dvakrát klikne na buňku. To může být velmi užitečné pro finanční zprávy, jako je rozvaha nebo výkaz zisku a ztráty, kde je pravděpodobné, že manažery napadnou čísla, zvláště pokud je konečný výsledek záporný!

Toho můžete využít k vytvoření hloubkové analýzy, takže když manažer napadne konkrétní číslo, stačí dvakrát kliknout na číslo a rozpis se zobrazí jako součást sestavy.

To je z pohledu uživatele velmi působivé a šetří to, když se neustále ptají „proč je toto číslo tak vysoké?

Chcete -li zjistit záhlaví / kritéria pro číslo (pomocí vlastností objektu Target), musíte napsat kód a poté filtrovat tabulková data a poté je zkopírovat do sestavy.

Programování VBA | Generátor kódu pracuje pro vás!

Pracovní list Aktivovat událost

K této události dochází, když se uživatel přesune z jednoho listu na druhý. Platí pro nový list, do kterého se uživatel přesouvá.

Dalo by se použít k zajištění toho, aby byl nový list zcela vypočítán, než na něm uživatel začne něco dělat. Lze jej také použít pouze k přepočtu konkrétního listu bez přepočítání celého sešitu. Pokud je sešit velký a obsahuje složitý vzorec, přepočítání jednoho listu ušetří spoustu času

123 Soukromý dílčí list_aktivovat ()ActiveSheet.CalculateEnd Sub

Active X Control Events (není vyčerpávající)

Jak již bylo uvedeno dříve, ovládací prvky Active X můžete přidat přímo na list. Mohou to být příkazová tlačítka, rozevírací seznamy a pole se seznamem

Události Active X se nacházejí pod konkrétním objektem názvu listu (kam jste přidali ovládací prvek) v Průzkumníku projektů VBE. V prvním rozevíracím seznamu v okně kódu budete muset vybrat název ovládacího prvku Active X a poté druhý rozevírací seznam zobrazí všechny dostupné události

Příkazové tlačítko Klikněte na Událost

Když do tabulky vložíte příkazové tlačítko, budete chtít, aby provedl nějakou akci. To provedete vložením kódu do události Click.

Můžete na to snadno vložit zprávu „Jste si jisti?“, Aby byla před spuštěním kódu provedena kontrola

12345 Private Sub CommandButton1_Click ()Dim ButtonRet jako variantaButtonRet = MsgBox („Jste si jisti, že to chcete udělat?“, VbQuestion Nebo vbYesNo)Pokud ButtonRet = vbNo Then Exit SubEnd Sub

Rozbalovací (rozbalovací) pole Událost změny

Rozevírací seznam Active X má událost změny, takže pokud uživatel vybere konkrétní položku z rozevíracího seznamu, můžete pomocí této události zachytit jeho výběr a poté napsat kód, aby odpovídajícím způsobem přizpůsobil další části listu nebo sešitu.

123 Private Sub ComboBox1_Change ()MsgBox „Vybrali jste“ & ComboBox1.TextEnd Sub

Programování VBA | Generátor kódu pracuje pro vás!

Zaškrtávací políčko (zaškrtávací políčko) Klikněte na událost

Do listu můžete přidat zaškrtnutí nebo zaškrtávací políčko, aby měl uživatel k dispozici možnosti. Pomocí události kliknutí můžete zjistit, zda uživatel v této věci něco změnil. Vrácené hodnoty jsou True nebo False podle toho, zda bylo zaškrtnuto nebo ne.

123 Private Sub CheckBox1_Click ()MsgBox CheckBox1.HodnotaEnd Sub

Události UserForm (nejsou vyčerpávající)

Excel vám poskytuje možnost navrhovat vlastní formuláře. Ty mohou být velmi užitečné jako vyskakovací okna ke shromažďování informací nebo k poskytování více možností uživateli. Používají ovládací prvky Active X, jak bylo popsáno výše, a mají přesně stejné události, přestože události velmi závisí na typu ovládacího prvku.

Zde je příklad jednoduchého formuláře:

Když je zobrazen, vypadá takto na obrazovce

Události ve formuláři byste používali například k zadání výchozího názvu společnosti při otevření formuláře, ke kontrole, zda zadaný název společnosti souhlasí s údajem, který již je v tabulce, a který nebyl napsán chybně, a k přidání kódu na kliknutí události na tlačítkách 'OK' a 'Zrušit'

Kód a události za formulářem lze zobrazit dvojitým kliknutím kdekoli ve formuláři

První rozevírací seznam umožňuje přístup ke všem ovládacím prvkům ve formuláři. Druhý rozevírací seznam umožní přístup k událostem

Událost aktivace UserForm

Tato událost se spustí při aktivaci formuláře, obvykle při jeho zobrazení. Tuto událost lze použít k nastavení výchozích hodnot, např. výchozí název společnosti v textovém poli název společnosti

123 Private Sub UserForm_Activate ()TextBox1.Text = "Název mé společnosti"End Sub

Programování VBA | Generátor kódu pracuje pro vás!

Změnit událost

Většina ovládacích prvků ve formuláři má událost změny, ale v tomto příkladu může textové pole názvu společnosti použít událost k omezení délky zadávaného názvu společnosti

123456 Private Sub TextBox1_Change ()Pokud Len (TextBox1.Text)> 20 PakMsgBox „Název je omezen na 20 znaků“, vbCriticalTextBox1.Text = ""Konec IfEnd Sub

Klikněte na Událost

Tuto událost můžete použít k tomu, aby uživatel provedl akci kliknutím na ovládací prvky ve formuláři nebo dokonce ve formuláři samotném

Na tomto formuláři je tlačítko „OK“ a po shromáždění názvu společnosti bychom jej chtěli umístit do buňky v tabulce pro budoucí použití.

1234 Private Sub CommandButton1_Click ()ActiveSheet.Range ("A1"). Hodnota = TextBox1.TextJá. SkrýtEnd Sub

Tento kód funguje, když uživatel klikne na tlačítko „OK“. Vloží hodnotu do vstupního pole názvu společnosti do buňky A1 na aktivním listu a poté skryje formulář, aby se uživatelský ovládací prvek vrátil zpět do listu.

Události grafu

Události grafu fungují pouze na grafech, které jsou na samostatném listu grafu, a nikoli na grafu, který je začleněn do standardního listu

Události grafu jsou poněkud omezené a nelze je použít na listu, kde byste mohli mít více grafů. Uživatelé také nemusí nutně chtít přepnout z listu obsahujícího čísla na list s grafem - zde neexistuje žádný okamžitý vizuální dopad

Nejužitečnější událostí by bylo zjistit součást grafu, na kterou uživatel klikl, např. segment v koláčovém grafu nebo sloupec v pruhovém grafu, ale toto není událost dostupná ve standardním rozsahu událostí.

Tento problém lze vyřešit použitím modulu třídy k přidání události „Mouse Down“, která vrátí podrobnosti o komponentě grafu, na kterou uživatel klikl. To se používá v grafu v listu.

To zahrnuje velmi komplikované kódování, ale výsledky jsou velkolepé. Můžete vytvářet hloubky, např. uživatel klikne na segment výsečového grafu a okamžitě je tento graf skrytý a na jeho místě se objeví druhý graf ukazující výsečový graf podrobností pro původní segment, nebo můžete vytvořit tabulková data podporující tento výseč výsečového grafu.

Události aplikace

Objekt aplikace ve VBA můžete použít k vypálení kódu podle konkrétní události

Programování VBA | Generátor kódu pracuje pro vás!

Application.OnTime

To vám umožní vypalovat kus kódu v pravidelných intervalech, dokud je sešit načten do Excelu. Možná budete chtít sešit automaticky ukládat do jiné složky každých 10 minut, nebo nechat list spuštěný přes noc, abyste mohli přenést nejnovější data z externího zdroje.

V tomto případě je dílčí rutina zadána do modulu. Zobrazuje okno se zprávou každých 5 minut, i když to může být snadno další kódovaná procedura. Současně resetuje časovač na aktuální čas plus 5 dalších minut.

Pokaždé, když se spustí, časovač se resetuje a spustí stejnou dílčí rutinu za dalších 5 minut.

1234 Dílčí testOnTime ()MsgBox „Testování v čase“Application.OnTime (Now () + TimeValue ("00:05:00")), "TestOnTime"End Sub

Application.OnKey

Tato funkce vám umožňuje navrhovat vlastní horké klávesy. Jakoukoli kombinaci kláves můžete zavolat jako podprogram pro vaše vytvoření.

V tomto případě je písmeno „a“ přesměrováno tak, že místo umístění „a“ do buňky zobrazí pole se zprávou. Tento kód je třeba umístit do vloženého modulu.

123456 Dílčí testovací klíč ()Application.OnKey "a", "TestKeyPress"End SubDílčí testovací klíč ()MsgBox "Stiskli jste 'a'"End Sub

Nejprve spustíte dílčí rutinu „TestKeyPress“. Toto stačí spustit pouze jednou. Říká Excelu, že při každém stisknutí písmene „a“ zavolá dílčí rutinu „TestKeyPress“. Dílčí rutina „TestKeyPress“ pouze zobrazí okno se zprávou, které vám řekne, že jste stiskli klávesu „a“. Samozřejmě to může načíst formulář nebo dělat nejrůznější další věci.

Můžete použít libovolnou kombinaci kláves, kterou můžete použít s funkcí „SendKeys“

Chcete -li tuto funkci zrušit, spusťte příkaz „OnKey“ bez parametru „Procedura“.

123 Sub CancelOnKey ()Application.OnKey "a"End Sub

Nyní se vše vrací do normálu.

Vám pomůže rozvoji místa, sdílet stránku s přáteli

wave wave wave wave wave