VBA DoEvents

Inhoudsopgave

de VBA DoEvents functie pauzeert tijdelijk een actieve macro, waardoor Excel de kans krijgt toetsaanslagen, muisklikken en andere berichten van het besturingssysteem te verwerken.

In langlopende macro's kan het lijken alsof Excel vastloopt en niet meer reageert, en de macro kan onmogelijk worden onderbroken. Als DoEvents in uw code is opgenomen, kunnen gebruikers er zeker van zijn dat de macro nog steeds actief is en de uitvoering indien nodig nog steeds kunnen onderbreken.

VBA DoEvents-voorbeeld

Beschouw de volgende code:

1234567891011 Openbare subtest()Dim ik zo langVoor ik = 1 tot 20000Bereik ("A1"). Waarde = ivolgende iEinde sub

Wanneer u deze code probeert, zult u merken dat er geen interactie mogelijk is met het Excel-venster. Omdat het echter niet veel van de processor vraagt, kan de macro nog steeds worden onderbroken door op ESC of CTRL+BREAK te drukken.

Als er echter veel complexe en veeleisende functies binnen deze lus zouden worden uitgevoerd, zou Excel meer tijd nodig hebben om een ​​toetsaanslag te registreren - tot enkele minuten of mogelijk helemaal niet, vooral als de computer tegelijkertijd andere programma's uitvoert.

Voeg nu een enkele regel toe met DoEvents onder de Range-toewijzing:

123 Bereik ("A1"). Waarde = iDoEvents

Als u deze code opnieuw uitvoert, ziet u dat Excel nu responsief is - het kan worden gefocust en naar de voorgrond worden gebracht. DoEvents wordt elke keer door de lus aangeroepen, wat ervoor zorgt dat de macro altijd wordt uitgevoerd, zodat Excel alle verzonden berichten kan verwerken. Omdat deze macro snel werkt, lijkt het bijna alsof hij op de achtergrond draait (hoewel dat niet zo is) - meer bewerkingen binnen de lus zouden die illusie snel blootleggen.

DoEvents Gevaren

Kijk echter nog eens goed. Meer dan alleen Excel te laten focussen, je kunt in cellen rondklikken en zelfs van tabblad wisselen terwijl de macro actief is (probeer het - je zult wat grappig gedrag zien). Dit toont een van de gevaren van DoEvents - het kan de oorzaak zijn van onbedoelde gevolgen als uw macro niet zorgvuldig is gecodeerd.

Een ander gevaar is dat DoEvents kan dienen als een venster waarbinnen andere macro's kunnen worden uitgevoerd. Probeer dit: plaats een ActiveX CommandButton op het werkblad, dubbelklik erop en voeg de volgende code toe in de CommandButton1_Click() -gebeurtenis:

1234567 Dim c als bereikVoor elke c binnen bereik ("B3:E8")c.Waarde = c.Waarde + 1volgende c

Schakel Ontwerpmodus in Excel uit en voer vervolgens de Test()-macro uit die u eerder hebt toegevoegd. Terwijl de Test-macro wordt uitgevoerd, kunt u op de CommandButton op het werkblad klikken en de bijbehorende macro wordt uitgevoerd zodra DoEvents de macro Test() een pauze geeft.

Het gevaar hier is als de CommandButton-macro de gegevens wijzigt waar de Test()-macro aan werkte, of de Test()-macro opnieuw activeerde. Je kunt extreem rommelige resultaten krijgen als je niet voorzichtig bent.

Ten slotte moet u zich ervan bewust zijn dat DoEvents ervoor zorgt dat uw macro een prestatie-impact ondervindt wanneer hij wordt aangeroepen. Binnen een lus zal deze impact snel oplopen, tenzij je beperkt hoe vaak DoEvents wordt aangeroepen. Verwijzend naar ons Test() voorbeeld, probeer dit:

1 Als ik Mod 1000 = 0 Dan DoEvents

Dit vermindert zichtbaar het reactievermogen van Excel, maar de impact op de prestaties wordt verminderd.

Wanneer moet u DoEvents gebruiken?

Ondanks deze gevaren is DoEvents een handige functie die helpt bij het testen en debuggen. Overweeg om DoEvents toe te voegen aan langlopende lussen.

Een andere reden om DoEvents op te nemen, is om gebruikersfeedback mogelijk te maken. Een macro kan bijvoorbeeld de labels van een UserForm bijwerken met voortgangsindicatoren. Zonder DoEvents ontvangt Excel mogelijk niet de berichten om het UserForm opnieuw te schilderen, waardoor een gebruiker de indruk krijgt dat de macro niet meer werkt, vooral als u naar een ander programma overschakelt en vervolgens probeert terug te schakelen naar Excel. Met DoEvents zal het UserForm echter opnieuw worden geverfd en blijven updates van de voortgang van de macro verschijnen.

DoEvents is voor het grootste deel niet iets dat u veel in uw code wilt opnemen en kan vaak worden weggelaten. Als reactievermogen echter iets is dat uw macro nodig heeft, tel het dan niet mee!

U zal helpen de ontwikkeling van de site, het delen van de pagina met je vrienden

wave wave wave wave wave