In VBA wollen wir manchmal das Programm beenden, nachdem eine Bedingung erfüllt ist. Aber soll ich "end" oder "exit sub" verwenden?
Dies ist ein bisschen außerhalb des Rahmens Ihrer Frage, aber um mögliche Verwirrung für Leser zu vermeiden, die neu in VBA sind: End
und End Sub
sind nicht dasselbe. Sie führen nicht die gleiche Aufgabe aus.
Mit End
wird die Ausführung von ALLEM Code gestoppt und Sie sollten fast immer Exit Sub
(bzw. Exit Function
) verwenden.
End stoppt die gesamte Ausführung. Das klingt zwar verlockend, aber es löscht auch alle globalen und statischen Variablen. (Quelle)
Siehe auch den MSDN dox für die End-Anweisung
Bei ihrer Ausführung setzt die End
-Anweisung alle Variablen auf Modulebene und alle statischen lokalen Variablen in allen Modulen zurück. Um den Wert dieser Variablen beizubehalten, verwenden Sie stattdessen die Anweisung Stop
. Sie können dann die Ausführung unter Beibehaltung des Werts dieser Variablen fortsetzen.
Hinweis: Die Anweisung "End" beendet die Codeausführung abrupt, ohne das Ereignis "Unload", "QueryUnload" oder "Terminate" oder anderen Visual Basic-Code aufzurufen. Code, den Sie in den Unload-, QueryUnload- und Terminate-Ereignissen von Formularen und Klassenmodulen platziert haben, wird nicht ausgeführt. Von Klassenmodulen erstellte Objekte werden zerstört, mit der Open-Anweisung geöffnete Dateien werden geschlossen, und der von Ihrem Programm verwendete Speicher wird freigegeben. Objektreferenzen, die von anderen Programmen gehalten werden, werden ungültig gemacht.
Auch End Sub
und Exit Sub
sind nicht dasselbe. End Sub
kann nicht auf die gleiche Weise wie Exit Sub
aufgerufen werden, weil der Compiler dies nicht zulässt.
Dies bedeutet wiederum, dass Sie Exit Sub
ausführen müssen, was eine vollkommen legale Operation ist:
Exit Sub Beendet sofort die Sub-Prozedur, in der es erscheint. Die Ausführung wird mit der Anweisung fortgesetzt, die auf die Anweisung folgt, die die Sub-Prozedur aufgerufen hat. Exit Sub kann nur innerhalb einer Sub verwendet werden. Prozedur verwendet werden.
Zusätzlich, und sobald Sie ein Gefühl dafür bekommen haben, wie Prozeduren funktionieren, löscht End Sub
natürlich keine globalen Variablen. Aber es löscht lokale (Dim'd) Variablen:
End Sub Beendet die Definition dieser Prozedur.