Ich weiß, dass Sie ein laufendes VBA-Makro mit manuell stoppen können Ctrl+Break, aber gibt es eine Möglichkeit, den Code automatisch zu stoppen, wenn eine bestimmte Bedingung erfüllt ist? exit function
/exit sub
funktionieren nicht, da sie nur die Methode beenden, in der sie aufgerufen werden.
Zum Beispiel,
sub a
call b
msgbox "a complete"
end sub
sub b
call c
msgbox "b complete" 'this msgbox will still show after the `exit sub` in 'c'
end sub
sub c
msgbox "entering c"
exit sub 'this will only `exit sub` 'c', but not 'a' or 'b'
msgbox "exiting c"
end sub
'OUTPUT:
'entering c
'b complete
'a complete
Ich nehme an, ich könnte diese sub
in function
umwandeln und Rückgabecodes verwenden, um festzustellen, ob die Methode erfolgreich ausgeführt wurde. Gibt es eine einfachere Möglichkeit, dies zu tun?
Sie können Ihren eigenen benutzerdefinierten Fehler mit err.raise
auslösen. Dies ist ähnlich wie in Ihrem Beispiel, jedoch etwas leistungsfähiger, da es sich um einen tatsächlichen Fehler handelt, der die Codeausführung anhält, selbst wenn er auf einen verschachtelten Aufruf angewendet wird.
Zum Beispiel,
sub a
on error goto exitCode
call b
msgbox "a complete"
exit sub 'you need this to prevent the error handling code from always running
exitCode:
msgbox "code is exiting..."
'clean up code here
end sub
sub b
call c
msgbox "b complete"
end sub
sub c
msgbox "entering c"
err.raise 555, "foo", "an error occurred"
msgbox "exiting c"
end sub
'OUTPUT:
'entering c
'code is exiting...
Die Zeile err.raise
sendet das Steuerelement an das Label exitCode:
, obwohl es außerhalb von a
aufgerufen wurde. Sie können alle Bedingungen verwenden, um zu testen, ob dieser benutzerdefinierte Fehler ausgelöst werden soll.
Weitere Informationen zum err
-Objekt und zur VBA-Fehlerbehandlung
https://msdn.Microsoft.com/de-de/library/ka13cy19(v=vs.90).aspx
Ich glaube, Sie möchten den Fehler erneut in Ihrem Fehlerbehandlungscode anzeigen lassen. Versuchen Sie etwas (nicht getestet):
Private Sub Test
On Error Goto bad
x = 0
debug.print 1/x
Exit Sub
bad:
'Clean up code
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub
Wenn Sie On Error Goto
verwenden, benötigen Sie vor dem Etikett einen Exit Sub
. Andernfalls wird Ihr Code auch dann auf den Fehlerbehandler angewendet, wenn kein Fehler vorliegt.
Bei der ersten Fehlerbehandlung werden die tatsächlichen Fehler, die zur Laufzeit auftreten können, nicht aufgefangen. Es gibt auch keine bequeme Möglichkeit, der aufrufenden Funktion zu signalisieren, dass etwas schiefgelaufen ist, es sei denn, Sie fügen Prüfungen in alle aufrufenden Routinen hinzu.
Beachten Sie, dass es im Allgemeinen als schlechtes Design betrachtet wird, um einen Fehler nur für die Flusssteuerung zu erzeugen:
Private Sub Test
If x = 0 Then
Err.Raise
End If
End Sub