Udalosti VBA

Obsah

VBA DoEvents funkcia dočasne pozastaví spustené makro, čo dáva Excelu šancu spracovať stlačenia klávesov, kliknutia myšou a ďalšie správy operačného systému.

V dlho spustených makrách sa môže zdať, že Excel prestane reagovať a prestane reagovať, a prerušenie makra môže byť nemožné. Ak je vo vašom kóde zahrnutý DoEvents, užívatelia môžu mať istotu, že makro je stále spustené, a v prípade potreby môžu aj tak prerušiť spustenie.

Príklad VBA DoEvents

Zvážte nasledujúci kód:

1234567891011 Verejný čiastkový test ()Dim i As LongPre i = 1 až 20 000Rozsah („A1“). Hodnota = iĎalej iKoniec pod

Keď vyskúšate tento kód, všimnete si, že s oknom programu Excel nemožno pracovať. Pretože to však nie je na procesor veľmi náročné, makro je možné stále prerušiť stlačením klávesu ESC alebo CTRL+BREAK.

Ak by sa v tejto slučke vykonávalo veľa zložitých a náročných funkcií, programu Excel by registrácia udalosti stlačenia klávesu trvala dlhšie - až niekoľko minút alebo možno vôbec, obzvlášť ak na počítači súbežne prebiehajú iné programy.

Teraz pridajte jeden riadok s DoEvents pod priradenie rozsahu:

123 Rozsah („A1“). Hodnota = iDoEvents

Ak tento kód spustíte znova, uvidíte, že Excel teraz reaguje - dá sa naň zamerať a dostať do popredia. DoEvents sa volá zakaždým cez slučku, čo zaisťuje, že makro vždy prináša spustenie, aby Excel mohol spracovať všetky správy, ktoré mu boli odoslané. Pretože toto makro beží rýchlo, takmer sa zdá, že beží na pozadí (aj keď nie je) - viac operácií v rámci cyklu by túto ilúziu rýchlo odhalilo.

DoEvents Nebezpečenstvo

Skúste sa však pozrieť ešte raz. Viac než len umožnenie zamerania Excelu, môžete sa v skutočnosti klikať vnútri buniek a dokonca prepínať karty, keď je makro spustené (vyskúšajte to - uvidíte zábavné správanie). Toto ukazuje jedno z nebezpečenstiev DoEvents - môže to byť príčinou nechcených následkov, ak vaše makro nie je starostlivo kódované.

Ďalším nebezpečenstvom je, že DoEvents môže slúžiť ako okno, v ktorom môžu bežať ostatné makrá. Skúste to: umiestnite na pracovný hárok príkazové tlačidlo ActiveX, dvakrát naň kliknite a do udalosti CommandButton1_Click () pridajte nasledujúci kód:

1234567 Dim c As RangePre každé c v rozsahu („B3: E8“)c.Hodnota = c.Hodnota + 1Ďalej c

V programe Excel vypnite režim návrhu a potom spustite makro Test (), ktoré ste pridali predtým. Kým je testovacie makro spustené, môžete kliknúť na tlačidlo CommandButton na pracovnom hárku a súvisiace makro sa spustí hneď, ako DoEvents dá makru Test () prestávku.

Tu hrozí, že makro CommandButton zmenilo údaje, na ktorých makro Test () pracovalo, alebo znova spustilo makro Test (). Ak si nedáte pozor, môžete skončiť s extrémne chaotickými výsledkami.

Nakoniec by ste si mali uvedomiť, že DoEvents spôsobí, že vaše makro pri volaní ovplyvní výkon. V rámci slučky sa tento vplyv bude rýchlo sčítať, pokiaľ neobmedzíte frekvenciu volaní DoEvents. Podľa nášho príkladu Test () vyskúšajte toto:

1 Ak i Mod 1000 = 0, potom DoEvents

To viditeľne znižuje odozvu Excelu, ale vplyv na výkon sa zníži.

Kedy použiť DoEvents

Napriek týmto nebezpečenstvám je DoEvents praktická funkcia, ktorá pomáha pri testovaní a ladení. Zvážte pridanie DoEvents do dlhotrvajúcich slučiek.

Ďalším dôvodom zahrnutia DoEvents je umožniť spätnú väzbu od používateľov. Makro môže napríklad aktualizovať štítky UserForm pomocou indikátorov priebehu. Bez DoEvents nemusí Excel dostávať správy na premaľovanie UserFormu, čo v používateľovi vyvolá dojem, že makro prestalo fungovať - ​​najmä ak prepnete na iný program a potom sa pokúsite prepnúť späť do Excelu. Vďaka DoEvents sa však UserForm bude naďalej prekresľovať a naďalej sa budú zobrazovať aktualizácie postupu makra.

DoEvents väčšinou nie je niečo, čo by ste chceli do kódu veľa zahrnúť, a často sa dá vynechať. Ak však vaše makro potrebuje odozvu, nepočítajte to!

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

wave wave wave wave wave