Rückkehr in VBA-Code-Beispiele

VBA – DoEvents

In diesem Turorial erläutern wir die Verwendung des DoEvents-Befehls in VBA.

Die VBA-Funktion DoEvents hält ein laufendes Makro vorübergehend an und gibt Excel die Möglichkeit, Tastendrucke, Mausklicks und andere Betriebssystemmeldungen zu verarbeiten.

Bei lang laufenden Makros kann es vorkommen, dass Excel sich aufhängt und nicht mehr reagiert und das Makro kann unmöglich unterbrochen werden. Wenn DoEvents in Ihrem Code enthalten ist, können die Benutzer sicher sein, dass das Makro noch läuft und die Ausführung bei Bedarf unterbrochen werden kann.

VBA – Beispiel für DoEvents

Betrachten Sie den folgenden Code:

Public Sub Test()
    Dim i As Long

    For i = 1 To 20000
        Range("A1").Value = i
    Next i

End Sub

Wenn Sie diesen Code ausprobieren, werden Sie feststellen, dass Sie mit dem Excel-Fenster nicht interagieren können. Da das Makro jedoch keine großen Anforderungen an den Prozessor stellt, kann es durch Drücken von ESC oder CTRL+BREAK unterbrochen werden.

Würden innerhalb dieser Schleife viele komplexe und anspruchsvolle Funktionen ausgeführt, würde Excel länger brauchen, um ein Tastendruckereignis zu registrieren (bis zu mehreren Minuten oder möglicherweise gar nicht, insbesondere wenn auf dem Computer gleichzeitig andere Programme laufen).

Fügen Sie nun eine einzelne Zeile mit DoEvents unterhalb der Bereichswertzuweisung ein:

       Range("A1").Value = i
        DoEvents

Wenn Sie diesen Code erneut ausführen, werden Sie sehen, dass Excel jetzt ansprechbar ist (es kann fokussiert und in den Vordergrund gebracht werden). DoEvents wird jedes Mal in der Schleife aufgerufen, wodurch sichergestellt wird, dass das Makro immer ausgeführt wird, damit Excel alle empfangenen Nachrichten/Anweisungen verarbeiten kann. Da dieses Makro schnell ausgeführt wird, scheint es fast so, als würde es im Hintergrund laufen, obwohl es das nicht tut (weitere Operationen innerhalb der Schleife würden diese Illusion schnell aufdecken).

Gefährdungen durch DoEvents

Schauen Sie aber noch einmal genau hin. Sie können nicht nur Excel fokussieren, sondern auch in Zellen herumklicken und sogar die Registerkarten wechseln, während das Makro läuft. Sie werden ein lustiges Verhalten sehen, wenn Sie es ausprobieren. Hier zeigt sich eine der Gefahren von DoEvents, denn sie können unbeabsichtigte Folgen haben, wenn der Code Ihres Makros nicht sorgfältig erstellt ist.

Eine weitere Gefahr besteht darin, dass DoEvents als Fenster dienen können, in dem andere Makros ausgeführt werden können. Versuchen Sie Folgendes: Platzieren Sie eine ActiveX-Befehlsschaltfläche auf dem Arbeitsblatt, doppelklicken Sie darauf und fügen Sie den folgenden Code in das Ereignis CommandButton1_Click() ein:

   Dim c As Range

    For Each c In Range("B3:E8")

        c.Value = c.Value + 1

    Next c

Schalten Sie den Entwurfsmodus in Excel aus und führen Sie dann das Makro Test() aus, das Sie zuvor hinzugefügt haben. Während das Makro Test() ausgeführt wird, können Sie auf die Befehlsschaltfläche auf dem Arbeitsblatt klicken, und das zugehörige Makro wird ausgeführt, sobald DoEvents dem Makro Test() eine Pause gibt.

Die Gefahr dabei ist, dass das Makro hinter der Befehlsschaltfläche die Daten verändert, an denen das Makro Test() gearbeitet hat, oder das Makro Test() selbst erneut auslöst. Wenn Sie nicht aufpassen, können Sie sehr unschöne Ergebnisse erzielen.

Schließlich sollten Sie sich darüber im Klaren sein, dass Ihr Makro beim Aufruf von DoEvents eine Leistungsbeeinträchtigung erleiden wird. Innerhalb einer Schleife summieren sich diese Auswirkungen schnell, es sei denn, Sie begrenzen die Häufigkeit des Aufrufs von DoEvents. Versuchen Sie dies anhand unseres Beispiels Test():

       If i Mod 1000 = 0 Then DoEvents

Dadurch wird die Reaktionsfähigkeit von Excel zwar sichtbar verringert, aber die Auswirkungen auf die Leistung werden geringer sein.

Wann sollte man DoEvents verwenden?

Trotz dieser Gefahren ist DoEvents eine praktische Funktion, die beim Testen und Debuggen hilft. Ziehen Sie in Erwägung, DoEvents zu lang laufenden Schleifen hinzuzufügen.

Ein weiterer Grund für die Einbindung von DoEvents ist die Möglichkeit für die Benutzer, Feedbacks zu geben. Ein Makro könnte zum Beispiel die Beschriftungen eines Benutzerformulars mit Fortschrittsanzeigen aktualisieren. Ohne DoEvents erhält Excel möglicherweise nicht die Meldungen, um das Benutzerformular neu zu zeichnen, was dem Benutzer den Eindruck vermittelt, dass das Makro nicht mehr funktioniert. Vor allem, wenn Sie zu einem anderen Programm wechseln und dann versuchen, wieder zu Excel zurückzuwechseln. Mit DoEvents hingegen wird das Benutzerformular weiterhin neu gezeichnet, und der Fortschritt des Makros wird weiterhin angezeigt.

In den meisten Fällen ist DoEvents nichts, was Sie häufig in Ihren Code einbauen möchten, und kann oft weggelassen werden. Wenn Ihr Makro jedoch Reaktionsfähigkeit benötigt, sollten Sie es nicht außer Acht lassen!

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro - A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users! vba save as


Learn More!