VBA DoEvents

Cuprins

VBA DoEvents funcția întrerupe temporar o macrocomandă care rulează, oferind Excel șansa de a procesa apăsarea tastelor, clicurile mouse-ului și alte mesaje ale sistemului de operare.

În macro-urile cu funcționare îndelungată, Excel poate părea să blocheze și să nu mai răspundă, iar macro-ul poate fi imposibil de întrerupt. Dacă DoEvents este inclus în codul dvs., utilizatorii pot fi siguri că macro-ul este încă în funcțiune și poate întrerupe executarea, dacă este necesar.

Exemplu VBA DoEvents

Luați în considerare următorul cod:

1234567891011 Subtest public ()Dim i As LongPentru i = 1 până la 20000Interval („A1”). Valoare = iApoi euSfârșitul Sub

Când încercați acest cod, veți observa că fereastra Excel nu poate fi interacționată cu. Cu toate acestea, deoarece procesorul nu este foarte solicitant, macro-ul poate fi întrerupt în continuare apăsând ESC sau CTRL + BREAK.

Dacă totuși s-ar efectua o mulțime de funcții complexe și solicitante în interiorul acestei bucle, Excel ar dura mai mult timp pentru a înregistra un eveniment de apăsare a tastei - până la câteva minute sau chiar deloc, mai ales dacă computerul rulează alte programe în același timp.

Acum adăugați o singură linie cu DoEvents sub atribuirea Range:

123 Gama („A1”). Valoare = iDoEvents

Dacă rulați acest cod din nou, veți vedea că Excel este acum receptiv - poate fi focalizat și adus în prim-plan. DoEvents este apelat de fiecare dată prin buclă, ceea ce asigură că macro-ul produce întotdeauna execuție, astfel încât Excel să poată procesa orice mesaje trimise către acesta. Deoarece această macrocomandă rulează rapid, aproape se pare că rulează în fundal (deși nu este) - mai multe operațiuni în interiorul buclei ar expune rapid acea iluzie.

DoEvents Pericole

Aruncă o a doua privire, totuși. Mai mult decât să permiteți simplitatea focalizării Excelului, puteți face clic în jurul celulelor și chiar să comutați filele în timp ce macro-ul rulează (încercați - veți vedea un comportament amuzant). Aceasta arată unul dintre pericolele DoEvents - poate fi cauza consecințelor neintenționate dacă macro-ul dvs. nu este codat cu atenție.

Un alt pericol este că DoEvents poate servi ca fereastră pentru ca alte macrocomenzi să ruleze în interior. Încercați acest lucru: plasați un ActiveX CommandButton pe foaia de lucru, faceți dublu clic pe acesta și adăugați următorul cod în cadrul evenimentului CommandButton1_Click ():

1234567 Dim c As RangePentru fiecare c din interval ("B3: E8")c.Value = c.Value + 1Următorul c

Dezactivați Modul de proiectare în Excel, apoi rulați macroul Test () pe care l-ați adăugat mai devreme. În timp ce macrocomanda Test se execută, puteți face clic pe butonul Comandă din foaia de lucru, iar macrocomanda sa asociată va rula de îndată ce DoEvents dă macrocomandului Test () o pauză.

Pericolul este dacă macrocomanda CommandButton a modificat datele la care lucra macrocomanda Test () sau a declanșat din nou macrocomanda Test (). Puteți ajunge la rezultate extrem de dezordonate dacă nu sunteți atent.

În cele din urmă, trebuie să fiți conștienți de faptul că DoEvents va face ca macro-ul dvs. să aibă un impact asupra performanței atunci când este apelat. În interiorul unei bucle, acest impact se va adăuga rapid, cu excepția cazului în care limitați cât de des este apelat DoEvents. Referindu-ne la exemplul nostru Test (), încercați acest lucru:

1 Dacă i Mod 1000 = 0 atunci DoEvents

Acest lucru reduce în mod vizibil reacția Excel, dar impactul asupra performanței va fi redus.

Când utilizați DoEvents

În ciuda acestor pericole, DoEvents este o funcție utilă care ajută la testare și depanare. Luați în considerare adăugarea DoEvents la buclele de lungă durată.

Un alt motiv pentru a include DoEvents este de a permite feedback-ul utilizatorilor. De exemplu, o macrocomandă poate actualiza etichetele unui UserForm cu indicatori de progres. Fără DoEvents, Excel ar putea să nu primească mesajele pentru a revopsi UserForm, oferindu-i utilizatorului impresia că macro-ul a încetat să funcționeze - mai ales dacă treceți la un alt program și apoi încercați să reveniți la Excel. Cu DoEvents, totuși, UserForm va fi repictat în continuare și vor continua să apară actualizări ale progresului macro-ului.

În cea mai mare parte, DoEvents nu este un lucru pe care doriți să îl includeți în codul dvs. și poate fi adesea omis. Totuși, dacă răspunsul este ceva care are nevoie de macro-ul dvs., nu îl luați în calcul!

Vei ajuta la dezvoltarea site-ului, partajarea pagina cu prietenii

wave wave wave wave wave