Excel VBA mehrere Fehler-handling in der gleichen Prozedur
Habe ich vorher verwendet, Fehlerbehandlung in VBA-erfolgreich, aber wenn man versucht, mehrere Fehlerbehandlung Blöcke ich kann nicht herausfinden, wie es zu tun.
Den code, den ich geschrieben habe sieht wie folgt aus:
...
On Error GoTo ErrorHandler1
shpArrow1.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolProduct").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpArrow1.Width / 2
shpTag1.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolProduct").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpTag1.Width / 2
shpArrow2.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolUnderlyings").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpArrow2.Width / 2
shpTag2.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolUnderlyings").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpTag2.Width / 2
shpIndexLine.Left = shpLine.Left + shpLine.Width / 2 - shpIndexLine.Width / 2
GoTo NoError1
ErrorHandler1:
shpArrow1.Left = shpLine.Left - shpArrow1.Width / 2
shpTag1.Left = shpLine.Left - shpTag1.Width / 2
shpArrow2.Left = shpLine.Left - shpArrow2.Width / 2
shpTag2.Left = shpLine.Left - shpTag2.Width / 2
shpIndexLine.Left = shpLine.Left + shpLine.Width / 2 - shpIndexLine.Width / 2
errorRelativeRisk = 1
NoError1:
On Error GoTo 0
On Error GoTo ErrorHandler2
Output.ChartObjects("ChartHistoryUnderlyings").Activate
ActiveChart.Axes(xlValue).CrossesAt = ActiveChart.Axes(xlValue).MinimumScale
ActiveChart.Axes(xlCategory).CrossesAt = ActiveChart.Axes(xlCategory).MinimumScale
GoTo NoError2
ErrorHandler2:
errorHistUnderl = 1
NoError2:
On Error GoTo 0
...
Zweiten Fehlerbehandlung-block funktioniert nicht. Ich vermute, dass ich nicht beenden Sie den ersten Fehler-handling-block richtig. Habe versucht, eine Antwort zu finden, das funktioniert für mich, aber ohne Erfolg.
Dankbar für jede Hilfe!!!
- Tun die
...
stehen fürPrivate Sub DoSomething()
undEnd Sub
beziehungsweise, oder es steckt mehr dahinter? Ich denke, dein code könnte einfacher sein, zu Folgen, wenn Sie extrahiert die Methode aus jedem "block", jeder mit seinen eigenen Fehlerbehandlung; im Grunde müssen Sie zu entwirren, dasGoTo Mess
. - Ja die
...
steht für Beginn und Ende der sub, aber es gibt einige einfachen Berechnungen, die sollten nicht auf die Fehlerbehandlung. Im Grunde beide die Fehlerbehandlung Blöcke funktioniert, wenn ich nur einen davon benutzen, aber beide vielleicht habe ich zu "verstecken" Sie den code, indem Sie zwei kurze U-Boote statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie zwei oder mehr Fehlerbehandlung, Subroutinen, die in einem Verfahren ist definitiv ein design-Geruch; das ist nicht, wie VBA-error-handling funktioniert.
Grundsätzlich haben Sie diese:
Tritt ein Fehler in den ersten block, VBA springt
ErrHandler1
und immer noch denkt, dass es in einer Fehlerbehandlungs-Unterprogramm, wenn es um den 2. block.Müssen Sie
Resume
irgendwo, zu sagen, VBA - "ich habe verarbeitet alles, was ich zu bewältigen hatte".Also statt "fallen durch" in die
NoError1
Unterprogramm, IhreErrorHandler1
Unterprogramm endet mit einemResume
springen:Und die
ErrorHandler2
sollte auch am Ende mit einemResume
springen:Diese Weise VBA weiß, es ist aus der "Fehler-handling-Modus" und zurück in "normal-Ausführung".
Aber würde ich dringend empfehlen, angesichts separate Methoden/Prozeduren anstelle von Unterprogrammen gekennzeichnet.
ich denke, Sie sollten in
End Sub
nach jedem error-handling-codeExit Sub
?Die Lösung wäre die Anwendung
On Error GoTo -1
.Sie setzt die Fehlerbehandlung in VBA so können Sie mehrere
On Error GoTo
Aussagen.