VBA DoEvents

Innehållsförteckning

VBA DoEvents funktion pausar tillfälligt ett igång makro, vilket ger Excel en chans att bearbeta knapptryckningar, musklick och andra operativsystemmeddelanden.

I långvariga makron kan det hända att Excel hänger och inte svarar, och makrot kan vara omöjligt att avbryta. Om DoEvents ingår i din kod kan användarna vara säkra på att makrot fortfarande körs och kan fortfarande avbryta körningen om det behövs.

VBA DoEvents Exempel

Tänk på följande kod:

1234567891011 Public Sub Test ()Dim i As LongFör i = 1 Till 20000Område (“A1”). Värde = iNästa iAvsluta Sub

När du provar den här koden kommer du att notera att Excel -fönstret inte kan interagera med. Men eftersom det inte är särskilt krävande för processorn kan makrot fortfarande avbrytas genom att trycka på ESC eller CTRL+BREAK.

Om många komplexa och krävande funktioner utfördes inuti den här slingan skulle Excel dock ta längre tid att registrera en knapptryckningshändelse - upp till flera minuter eller kanske inte alls, särskilt om datorn kör andra program samtidigt.

Lägg nu till en enda rad med DoEvents under Range -tilldelningen:

123 Område ("A1"). Värde = iDoEvents

Om du kör den här koden igen ser du att Excel nu är responsivt - det kan fokuseras och föras till förgrunden. DoEvents anropas varje gång genom loop, vilket säkerställer att makrot alltid ger körning så att Excel kan bearbeta alla meddelanden som skickas till den. Eftersom detta makro körs snabbt verkar det nästan som om det körs i bakgrunden (även om det inte är det) - fler operationer inuti slingan skulle snabbt avslöja den illusionen.

DoEvents Faror

Ta en andra titt, dock. Mer än att bara tillåta Excel att vara fokuserad, kan du faktiskt klicka runt i cellerna och till och med byta flik medan makrot körs (prova - du kommer att se lite roligt beteende). Detta visar en av farorna med DoEvents - det kan vara orsaken till oavsiktliga konsekvenser om ditt makro inte kodas noggrant.

En annan fara är att DoEvents kan fungera som ett fönster för andra makron att köra inuti. Prova så här: placera en ActiveX CommandButton i kalkylbladet, dubbelklicka på den och lägg till följande kod i CommandButton1_Click () -händelsen:

1234567 Dim c As RangeFör varje c i intervall ("B3: E8")c.Value = c.Value + 1Nästa c

Avaktivera designläge i Excel och kör sedan makrot Test () som du lagt till tidigare. Medan testmakrot körs kan du klicka på kommandoknappen i kalkylbladet och dess tillhörande makro körs så snart DoEvents ger test () -makrot.

Faran här är om CommandButton -makrot ändrade data som Test () -makrot arbetade med eller utlöste Test () -makrot igen. Du kan få extremt röriga resultat om du inte är försiktig.

Slutligen bör du vara medveten om att DoEvents kommer att få ditt makro att drabbas av prestanda när det anropas. Inuti en loop kommer denna effekt att öka snabbt om du inte begränsar hur ofta DoEvents kallas. Prova med detta i vårt Test () -exempel:

1 Om i Mod 1000 = 0 Då gör DoEvents

Detta minskar synligt Excel: s respons, men prestandaeffekten kommer att minska.

När ska du använda DoEvents

Trots dessa faror är DoEvents en praktisk funktion som hjälper till att testa och felsöka. Överväg att lägga till DoEvents i långa loopar.

En annan anledning att inkludera DoEvents är att tillåta feedback från användare. Till exempel kan ett makro uppdatera en UserForms etiketter med framstegsindikatorer. Utan DoEvents kanske Excel inte tar emot meddelandena för att måla om UserForm, vilket ger en användare intrycket av att makrot har slutat fungera - särskilt om du byter till ett annat program och sedan försöker växla tillbaka till Excel. Med DoEvents kommer dock UserForm att fortsätta målas om och uppdateringar av makrons framsteg kommer att fortsätta att visas.

För det mesta är DoEvents inte något du vill ha med mycket i din kod och kan ofta utelämnas. Om lyhördhet är något ditt makro behöver, räkna inte bort det!

Du kommer att bidra till utvecklingen av webbplatsen, dela sidan med dina vänner

wave wave wave wave wave