web-dev-qa-db-de.com

Wie stoppe ich VBA-Makros automatisch?

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?

6
iliketocode

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

http://www.cpearson.com/Excel/errorhandling.htm

9
iliketocode

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
1
Ceres