VBA DoEvents funkcija privremeno pauzira pokrenutu makronaredbu, dajući Excelu priliku da obradi pritiske tipki, klikove mišem i druge poruke operacijskog sustava.
U dugotrajnim makronaredbama može se činiti da Excel visi i prestaje reagirati, a makronaredbu je nemoguće prekinuti. Ako su DoEvents uključeni u vaš kôd, korisnici mogu biti sigurni da je makro još uvijek aktivan te mogu prekinuti izvršavanje ako je potrebno.
Primjer VBA DoEvents
Uzmite u obzir sljedeći kod:
1234567891011 | Javno podtestovanje ()Dim i As LongZa i = 1 do 20000Raspon ("A1"). Vrijednost = iSljedeći iKraj podm |
Kada isprobate ovaj kôd, primijetit ćete da se s Excelovim prozorom ne može komunicirati. No, budući da nije zahtjevan za procesor, makronaredba se i dalje može prekinuti pritiskom na ESC ili CTRL+BREAK.
Da se u ovoj petlji izvršava mnogo složenih i zahtjevnih funkcija, Excelu bi trebalo više vremena da registrira događaj pritiska na tipku - do nekoliko minuta ili možda uopće ne, osobito ako računalo istodobno pokreće druge programe.
Sada dodajte jedan redak s DoEvents ispod dodjele raspona:
123 | Raspon ("A1"). Vrijednost = iDoEvents |
Ako ponovno pokrenete ovaj kôd, vidjet ćete da Excel sada reagira - može se fokusirati i staviti u prvi plan. DoEvents se poziva svaki put kroz petlju, što osigurava da makronaredba uvijek daje izvršavanje tako da Excel može obraditi sve poruke koje su mu poslane. Budući da se ovaj makro brzo izvodi, čini se kao da radi u pozadini (iako nije) - više operacija unutar petlje brzo bi razotkrilo tu iluziju.
DoEvents Opasnosti
Ipak, pogledajte još jednom. Više od jednostavnog dopuštanja da se Excel usredotoči, zapravo možete klikati unutar ćelija, pa čak i mijenjati kartice dok je makro pokrenut (isprobajte - vidjet ćete neko smiješno ponašanje). Ovo pokazuje jednu od opasnosti DoEvents - može uzrokovati neželjene posljedice ako makro nije pažljivo kodiran.
Druga je opasnost da DoEvents mogu poslužiti kao prozor za pokretanje drugih makronaredbi. Pokušajte ovo: postavite ActiveX CommandButton na radni list, dvaput kliknite na njega i dodajte sljedeći kod unutar događaja CommandButton1_Click ():
1234567 | Dim c As RangeZa svaki c u rasponu ("B3: E8")c.Vrijednost = c.Vrijednost + 1Sljedeće c |
Isključite Način dizajna u Excelu, a zatim pokrenite makronaredbu Test () koju ste dodali ranije. Dok je testna makronaredba aktivna, možete kliknuti CommandButton na radnom listu, a povezana makronaredba će se pokrenuti čim DoEvents makronu Test () da stanku.
Ovdje postoji opasnost ako je makronaredba CommandButton promijenila podatke na kojima je radila makro Test () ili je ponovno pokrenula makronaredbu Test (). Možete biti krajnje neuredni ako ne budete oprezni.
Konačno, trebali biste biti svjesni da će DoEvents uzrokovati da vaš makro utječe na performanse kada se pozove. Unutar petlje ovaj će se utjecaj brzo zbrajati osim ako ograničite učestalost pozivanja DoEvents -a. Pozivajući se na naš primjer Test (), pokušajte ovo:
1 | Ako je Mod 1000 = 0, učinite DoEvents |
Ovo vidljivo smanjuje Excel -ov odaziv, ali će se utjecaj na performanse smanjiti.
Kada koristiti DoEvents
Unatoč tim opasnostima, DoEvents je zgodna funkcija koja pomaže u testiranju i otklanjanju pogrešaka. Razmislite o dodavanju DoEvents u dugotrajne petlje.
Drugi razlog za uključivanje DoEvents -a je omogućavanje povratnih informacija korisnika. Na primjer, makronaredba može ažurirati oznake korisničkog obrasca s pokazateljima napretka. Bez DoEvents -a, Excel možda neće primiti poruke za ponovno bojenje UserForm -a, ostavljajući korisniku dojam da je makronaredba prestala raditi - osobito ako se prebacite na drugi program, a zatim pokušate vratiti na Excel. S DoEvents -ima, UserForm će se i dalje bojati, a ažuriranja napretka makronaredbe i dalje će se pojavljivati.
DoEvents uglavnom nije nešto što biste htjeli puno uključiti u svoj kôd i često se može izostaviti. Ako je vašem makronaponu nešto potrebno, nemojte to računati!