VBA DoEvents

Indholdsfortegnelse

VBA DoEvents funktion midlertidigt sætter en kørende makro på pause, hvilket giver Excel en chance for at behandle tastetryk, museklik og andre operativsystemmeddelelser.

I langvarige makroer kan det se ud til, at Excel hænger og ikke reagerer, og makroen kan være umulig at afbryde. Hvis DoEvents er inkluderet i din kode, kan brugerne være sikre på, at makroen stadig kører, og kan stadig afbryde udførelsen, hvis det er nødvendigt.

VBA DoEvents -eksempel

Overvej følgende kode:

1234567891011 Public Sub Test ()Dim i så længeFor i = 1 Til 20000Område (“A1”). Værdi = iNæste iAfslut Sub

Når du prøver denne kode, bemærker du, at Excel -vinduet ikke kan interageres med. Men fordi det ikke er meget krævende for processoren, kan makroen stadig blive afbrudt ved at trykke på ESC eller CTRL+BREAK.

Hvis der imidlertid blev udført mange komplekse og krævende funktioner inde i denne loop, ville Excel tage længere tid at registrere en tastetrykshændelse - op til flere minutter eller muligvis slet ikke, især hvis computeren kører andre programmer på samme tid.

Tilføj nu en enkelt linje med DoEvents under Range -tildelingen:

123 Område ("A1"). Værdi = iDoEvents

Hvis du kører denne kode igen, vil du se, at Excel nu reagerer - den kan fokuseres og bringes i forgrunden. DoEvents kaldes hver gang gennem løkken, hvilket sikrer, at makroen altid giver udførelse, så Excel kan behandle alle meddelelser, der sendes til den. Fordi denne makro kører hurtigt, ser det næsten ud til, at den kører i baggrunden (selvom den ikke er det) - flere operationer inde i sløjfen ville hurtigt afsløre den illusion.

Eventer farer

Tag dog et andet kig. Mere end blot at lade Excel fokusere, kan du faktisk klikke rundt inde i cellerne og endda skifte faner, mens makroen kører (prøv det - du vil se en sjov adfærd). Dette viser en af ​​farerne ved DoEvents - det kan være årsagen til utilsigtede konsekvenser, hvis din makro ikke er omhyggeligt kodet.

En anden fare er, at DoEvents kan fungere som et vindue, hvor andre makroer kan køre inde i. Prøv dette: placer en ActiveX CommandButton på regnearket, dobbeltklik på det, og tilføj følgende kode inde i CommandButton1_Click () -hændelsen:

1234567 Dim c Som områdeFor hver c In Range ("B3: E8")c.Værdi = c.Værdi + 1Næste c

Slå Designtilstand fra i Excel, og kør derefter den test () makro, du tilføjede tidligere. Mens testmakroen kører, kan du klikke på kommandoknappen på regnearket, og den tilhørende makro kører, så snart DoEvents giver Test () -makroen en pause.

Faren her er, hvis CommandButton -makroen ændrede dataene, som Test () -makroen arbejdede på, eller udløste Test () -makroen igen. Du kan ende med nogle ekstremt rodede resultater, hvis du ikke er forsigtig.

Endelig skal du være opmærksom på, at DoEvents får din makro til at påvirke ydelsen, når den kaldes. Inde i en loop vil denne effekt hurtigt blive større, medmindre du begrænser, hvor ofte DoEvents kaldes. Prøv dette med henvisning til vores Test () -eksempel:

1 Hvis i Mod 1000 = 0 derefter DoEvents

Dette reducerer synligt Excel's lydhørhed, men ydelseseffekten reduceres.

Hvornår skal man bruge DoEvents

På trods af disse farer er DoEvents en praktisk funktion, der hjælper med testning og fejlfinding. Overvej at tilføje DoEvents til langvarige sløjfer.

En anden grund til at inkludere DoEvents er at tillade brugerfeedback. For eksempel kan en makro opdatere en UserForms etiketter med statusindikatorer. Uden DoEvents modtager Excel muligvis ikke meddelelserne for at male UserForm igen, hvilket giver en bruger indtryk af, at makroen er holdt op med at fungere - især hvis du skifter til et andet program og derefter forsøger at skifte tilbage til Excel. Med DoEvents vil UserForm imidlertid fortsat blive malet, og opdateringer af makroens fremskridt vil fortsat blive vist.

For det meste er DoEvents ikke noget, du vil have meget med i din kode, og kan ofte udelades. Hvis lydhørhed er noget din makro har brug for, skal du ikke regne det ud!

Du vil bidrage til udviklingen af ​​hjemmesiden, at dele siden med dine venner

wave wave wave wave wave