Laufzeitfehler ‚20‘
Dies ist ein Laufzeitfehler, der auftritt, wenn eine Resume-Anweisung außerhalb des Fehlerbehandlungscodes platziert wird. Um den Code effizient zu debuggen, ist es wichtig, zuerst den Fehler Ihres VBA-Codes zu verstehen. In diesem Artikel behandeln wir die möglichen Gründe für das Auftreten dieses Fehlers und wie der Fehler behoben werden kann.
Dies sind die zwei möglichen Ursachen des Fehlers:
- Resume-Anweisung außerhalb des Fehlerbehandlungscodes
- Code ist in eine Fehlerbehandlungsroutine gesprungen
Wir werden uns jede dieser möglichen Ursachen ansehen und eine Lösung anbieten.
Was verursacht den Fehler?
Bevor Sie mit der Behebung des Fehlers fortfahren, müssen Sie die Fehlerursache in Ihrem VBA-Code identifizieren. Die Codezeile, die den Fehler verursacht, wird gelb hervorgehoben, sobald die Debug-Schaltfläche gedrückt wird.
Ursache 1: Resume-Anweisung außerhalb des Fehlerbehandlungscodes
Beispielfehlercode:
Sub ErrResumeWithoutCode()
On Error Resume Next
\'Some Code
On Error GoTo 0
Resume Next \'Laufzeitfehler 20
End Sub
Lösung: Verschieben Sie die Anweisung in eine Fehlerbehandlungsroutine oder löschen Sie sie.
Code:
Sub ErrResumeWithoutCode()
On Error Resume Next
\'Some Code
Resume Next ‘Die Resume-Anweisung wurde in einen Fehlerbehandler verschoben
On Error GoTo 0
End Sub
Sub ErrResumeWithoutCode()
On Error Resume Next
\'Some Code
On Error GoTo 0
End Sub
Ursache 2: Code ist in einen Fehlerhandler gesprungen
Ihr Code ist in einen Fehlerhandler gesprungen, obwohl kein Fehler aufgetreten ist.
Beispielfehlercode:
Sub ErrResumeWithoutCode()
On Error GoTo ErrHandler
ReapplyingFormula
ErrHandler:
Debug.Print Err.Number
Resume Next
End Sub
Warum gibt der obige Code einen Laufzeitfehler 20 aus? Wenn die ReapplyingFormula-Prozedur einen Fehler auslöst, springt die Ausführung zur ErrHandler-Zeilenbezeichnung, gibt die Fehlernummer aus, und die Resume Next-Anweisung springt zurück zu der Anweisung, die unmittelbar auf die Zeile folgt, in der der Fehler aufgetreten ist, in diesem Fall Debug.Print Anweisung: Die Fehlerbehandlungs-Subroutine wird ohne einen Fehlerkontext ausgeführt, und wenn die Anweisung Resume Next erreicht wird, wird der Laufzeitfehler 20 ausgelöst, da es keinen Ort gibt, an dem die Fortsetzung fortgesetzt werden kann.
Hinweis: Die Zeilenbezeichnung wird verwendet, um eine einzelne Codezeile zu identifizieren. Eine Zeilenbezeichnung kann eine beliebige Kombination von Zeichen sein, die mit einem Buchstaben beginnt und mit einem Doppelpunkt (:) endet. Zeilenbeschriftungen unterscheiden nicht zwischen Groß- und Kleinschreibung und müssen in der ersten Spalte beginnen.
In diesem Codeabschnitt ist ErrHandler: eine sogenannte Zeilenbezeichnung.
ErrHandler:
Debug.Print Err.Number
Resume Next
End Sub
Lösung: Durch Einfügen einer Exit-Anweisung vor dem ErrHandler-Zeilenlabel haben wir die Fehlerbehandlungs-Subroutine ErrHandler vom Rest des Prozedurkörpers getrennt – die einzige Möglichkeit, die Fehlerbehandlungs-Subroutine auszuführen, ist über einen On Error-Sprung; Daher erreicht kein Ausführungspfad die Resume-Anweisung außerhalb eines Fehlerkontexts, wodurch der Laufzeitfehler 20 vermieden wird.
Code:
Sub ErrResumeWithoutCode()
On Error GoTo ErrHandler
ReapplyingFormula
Exit Sub
ErrHandler:
Debug.Print Err.Number
Resume Next
End Sub
Benötigen Sie einen VBA Programmierer?
Wir als exact construct programmieren mit einem Team von rd. 20 Mitarbeitern seit über 10 Jahren Excel-Tools. Wir sind ein Nischenanbieter der spezialisiert auf Makros/VBA-Codes ist. Daneben unterstützen wir auch als 3rd Level Support die IT-Abteilungen rund um Probleme bei MS Office (Excel, Word, PowerPoint, etc.).
Haben Sie ein Excel-Problem? Benötigen Sie einen Makro-Programmierer? Rufen Sie uns unverbindlich an +41 52 511 05 25 oder kontaktieren Sie uns via Kontaktformular.