VBA DoEvents

Sadržaj

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!

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave