2016-04-23 4 views
1

Ich bin der Überzeugung, dass die VBA-IDE kein ordnungsgemäßes Brechen bei Fehlern zulässt. Ich stellte eine Frage, wie man Laufzeitfehler hier identifizieren:Wie verwende ich On Error GoTo?

How do I break on errors?

Die Lösung/Abhilfe scheint zu sein On Error GoTo ErrorHandler oder ähnlich zu verwenden. Ich versuche, diese Arbeit zu machen, habe aber nicht viel Erfolg gehabt.

Nach Microsoft On Error GoTo werden Sie an den angegebenen Code der Region gesendet, wenn ein Laufzeitfehler auftritt (https://msdn.microsoft.com/en-us/library/5hsw66as.aspx). Basierend auf meiner Erfahrung ist das nicht die ganze Geschichte. In dieser Frage geht es darum, wie diese Lösung tatsächlich funktioniert.

So habe ich die folgende Funktion:

Function generateTimeseries() As Variant 

On Error GoTo ErrorHandler 

Dim currentArray As Range 

currentArray = Selection.Range ' this doesn't work - I don't care why 

generateTimeseries = currentArray.Rows 

Return 

ErrorHandler: 
    Debug.Assert False 
    Resume ' break here if you want to catch errors 

End Function 

Diese Funktion tritt nie den ErrorHandler Code. Statt dessen fällt es auf Selection.Range, wobei die Funktion einfach #VALUE zurückgibt. Es ist mir eigentlich egal, warum das kaputt ist, ich möchte nur wissen, wie ich die IDE dazu bringen kann, mir zu sagen, dass sie tatsächlich in dieser Zeile umgefallen ist, ohne dass ich manuell durch den Code gesprungen bin.

+0

Griff „Mit dieser Funktion nie tritt der Fehlerbehandler-Code“: Kann dies nicht reproduzieren. Für mich gibt es den ErrorHandler-Code ein. Zwei Fehler: 1. Da 'currentArray' ein Objekt ist, muss es über' Set' gesetzt werden: 'Set currentArray = Selection'. 2. "Auswahl" kann ein "Bereich" sein, aber wenn dies der Fall ist, benötigt seine Methode "Bereich" Parameter. Und was soll "Return" in diesem Zusammenhang tun? –

+0

@AxelRichter Ich habe das Problem gefunden. Siehe meine gepostete Antwort. – arman

Antwort

1

ich gerade getestet und Ihre Fehlerbehandlungsroutine funktioniert, bricht es korrekt auf

Debug.Assert False 

-> die Debugger-Optionen überprüfen.

Dies ist jedoch keine korrekte Methode zur Behandlung von Fehlern in vBA. Wenn Sie Ihre Anwendung kompilieren und vergessen, diese Fehlerbehandlung anzupassen, wird die Anwendung in eine Endlosschleife fallen, wenn ein Benutzer einen Fehler in der Prozedur findet .

In fast allen Situationen müssen Sie eine msgbox auslösen, um den Benutzer darüber zu informieren, dass ein Fehler aufgetreten ist, und die aktuelle Prozedur zu beenden. Die einzige Situation, in der dies nicht anwendbar ist, ist, wenn Sie etwas tun, das einen Fehler auslösen kann, aber Sie wissen es und wollen den Fehler bewusst umgehen. Es ist eine seltene Situation.

Ich habe nie Assert Methode und das ist, wie ich meine Fehler in jedem Verfahren

Function generateTimeseries() As Variant 

    On Error GoTo ErrorHandler 

    Dim currentArray As Range 

    currentArray = Selection.Range ' this doesn't work - I don't care why 

    generateTimeseries = currentArray.Rows 

Exit_Function: 
     Exit Function 

ErrorHandler: 
     MsgBox Err.Description, vbCritical, "Error " & Err.Number 
     Resume Exit_Function ' breakpoint here if you want examine the code after error, otherwhise it terminates the function 
     Resume ' Once the code breaks on the above line, move to this instruction and F8 to return to the statement in error 

End Function 
+0

Danke. Das ist viel besser als das, was ich hatte.Als der Grund ist es auf Fehlern nicht gebrochen. Siehe meine Antwort. Ich werde dies als die Antwort markieren. – arman

0

Ich hatte die Funktion "Alle Fehler unterbrechen" in einem früheren Versuch aktiviert, alle Fehler zu beheben.

Ich habe das ausgeschaltet, indem ich Tools->Options->General gehe und Break on All Errors durch Break on Unhandled Errors ersetze.

Es stellt sich heraus, dass Break on All Errors Windows ist für "Break auf einige Fehler, aber nur Müll zurückgeben, wenn es ein UDF-Fehler ist".

+0

Nein, es bedeutet Pause bei allen Fehlern, aber nicht behandelte Fehler in einer UDF **, die von einer Zelle ** aufgerufen wird, führen einfach zu einem #VALUE-Fehler, anstatt den Benutzer in den VBE zu werfen. – Rory

+0

@Rory danke, das war mir nicht bewusst. – arman