Události VBA

Obsah

VBA Události DoE funkce dočasně pozastaví spuštěné makro, což dává Excelu možnost zpracovávat stisknutí kláves, kliknutí myší a další zprávy operačního systému.

V dlouhotrvajících makrech se může zdát, že Excel přestal reagovat a přestal reagovat, a makro může být nemožné přerušit. Pokud je do vašeho kódu zahrnut DoEvents, uživatelé si mohou být jisti, že makro stále běží, a v případě potřeby mohou přesto přerušit provádění.

Příklad VBA DoEvents

Zvažte následující kód:

1234567891011 Veřejný dílčí test ()Dim i As LongPro i = 1 až 20 000Rozsah („A1“). Hodnota = iPříště jáEnd Sub

Když tento kód vyzkoušíte, všimnete si, že s oknem aplikace Excel nelze interagovat. Protože to ale není na procesor příliš náročné, makro lze přesto přerušit stisknutím kláves ESC nebo CTRL+BREAK.

Pokud by se v této smyčce provádělo mnoho složitých a náročných funkcí, Excel by registraci události stisknutí klávesy zabralo déle - až několik minut, případně vůbec ne, zvláště pokud na počítači běží současně jiné programy.

Nyní přidejte jeden řádek s DoEvents pod přiřazení rozsahu:

123 Rozsah („A1“). Hodnota = iUdálosti DoE

Pokud tento kód spustíte znovu, uvidíte, že Excel nyní reaguje - lze jej zaměřit a přenést do popředí. DoEvents je voláno pokaždé ve smyčce, což zajišťuje, že makro vždy přináší spuštění, aby Excel mohl zpracovat všechny zprávy, které mu byly zaslány. Protože toto makro běží rychle, téměř se zdá, jako by běželo na pozadí (i když není) - více operací uvnitř smyčky by tuto iluzi rychle odhalilo.

DoEvents Nebezpečí

Podívejte se ale ještě jednou. Víc než jen umožnit soustředění Excelu, můžete ve skutečnosti klikat uvnitř buněk a dokonce přepínat karty, když je makro spuštěné (zkuste to - uvidíte nějaké zábavné chování). To ukazuje jedno z nebezpečí DoEvents - může to být příčinou nezamýšlených důsledků, pokud vaše makro není pečlivě kódováno.

Dalším nebezpečím je, že DoEvents může sloužit jako okno pro spuštění dalších maker uvnitř. Zkuste to: umístěte ActiveX CommandButton na list, dvakrát na něj klikněte a do události CommandButton1_Click () přidejte následující kód:

1234567 Dim c As RangePro každé c v dosahu („B3: E8“)c.Hodnota = c.Hodnota + 1Další c

V aplikaci Excel vypněte režim návrhu a poté spusťte makro Test (), které jste přidali dříve. Když je spuštěné testovací makro, můžete na listu kliknout na CommandButton a související makro se spustí, jakmile DoEvents dá makru Test () pauzu.

Zde je nebezpečí, pokud makro CommandButton změnilo data, na kterých makro Test () pracovalo, nebo znovu spustilo makro Test (). Pokud si nedáte pozor, můžete skončit s extrémně špinavými výsledky.

Nakonec byste si měli být vědomi toho, že DoEvents způsobí, že vaše makro při volání utrpí dopad na výkon. Ve smyčce se tento dopad rychle sčítá, pokud neomezíte, jak často se volání DoEvents volá. S odkazem na náš příklad Test () zkuste toto:

1 Pokud i Mod 1000 = 0, pak DoEvents

To viditelně snižuje odezvu Excelu, ale dopad na výkon se sníží.

Kdy použít DoEvents

Navzdory těmto nebezpečím je DoEvents praktická funkce, která pomáhá při testování a ladění. Zvažte přidání DoEvents do dlouhotrvajících smyček.

Dalším důvodem, proč zahrnout DoEvents, je umožnit zpětnou vazbu od uživatelů. Makro může například aktualizovat štítky UserForm pomocí indikátorů průběhu. Bez DoEvents nemusí Excel přijímat zprávy k překreslení UserForm, což v uživateli vyvolá dojem, že makro přestalo fungovat - zvláště pokud přepnete na jiný program a poté se pokusíte přepnout zpět do Excelu. S DoEvents však bude UserForm nadále překreslován a nadále se budou zobrazovat aktualizace postupu makra.

DoEvents z velké části není něco, co byste chtěli do kódu hodně zahrnout, a často to lze vynechat. Pokud však vaše makro něco potřebuje, nezapomeňte to spočítat!

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

wave wave wave wave wave