Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Excel 2016 VBA für Profis

Fehler ignorieren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Manchmal ist es sinnvoller und übersichtlicher, Fehler zunächst einmal zu ignorieren. Trotzdem sollen solche Fehler manchmal doch behandelt werden.

Transkript

Diese offizielle Art der Fehlerbehandlung macht überhaupt keinen Spaß. Für letzten Endes drei lausige Zeilen Originalcode, diese nämlich, werden 20 Zeilen Fehlerbehandlungsprozedur erzwungen, und das sind nur ganz banale Fehler, da kann man noch viel mehr haben. Deswegen möchte ich Ihnen alternativ zeigen, wie Sie mit Fehlern auch umgehen können. Das wird inhaltlich was anderes machen, aber Sie sehen, das lässt sich dann auch übertragen. Eines der Probleme dabei, um nicht zu sagen, das wesentliche Problem, ist dieser Spaghetti-Code, von da nach da, wieder nach da zurück, dann vielleicht den nächsten Fehler, wieder da zurück. Sie haben also nach dem "Exit Sub" meistens zig Zeilen Fehlerbehandlung. Und was ich jetzt als Fehler bearbeiten möchte, ist nur ein einziger Fehler, ist also insgesamt ein bisschen kürzer, aber ich will Ihnen im ersten Anlauf zeigen, wie der normalerweise nach dieser Konstruktion behandelt werden müsste. Nennen wir das "Sub FehlerNormal()", und ich möchte ein neues Worksheet, ein Tabellenblatt, einfügen und dafür sorgen, dass es aktiviert ist. Ich brauche ein "Dim wksInfo", kann ich das schon mal nennen, "as Worksheet" und ich brauche schon mal eine zweite Zeile, nämlich eine Konstante, "cstrTabName" nenne ich mal das Ganze, also das Blatt soll "Info" heißen. Das werde ich gleich ein paarmal brauchen. Und dann kann ich hier nach einer Zeile Abstand "Set wksInfo=active" oder schreiben vielleicht besser "ThisWorkbook.Worksheets", und da drin will ich jetzt diesen "TabName" suchen. Ich benutze das Blatt namens Info und setze es in dieser Variablen erstmal nur als Verweis ein. Und dann kann ich als nächstes dafür sorgen, dass das aktiviert wird, also "wksInfo.Activate". Das ist mein grundsätzlicher Gedanke und Sie können das auch hier parallel angucken, ich mache das mal ein bisschen kleiner. Es gibt, sehen Sie hier in Klammern, kein Blatt, was so heißt. Wenn ich das also jetzt mit F5 starte, muss das erwartungsgemäß scheitern und beim Debuggen sehen Sie diese Fehlermeldung: "Index außerhalb des gültigen Bereichs", heißt nichts anderes, als in der Worksheetsauflistung gibt es keins, was Info heißt. Dass sich das dann auch nicht aktivieren lässt, so weit kommen wir gar nicht. Also können wir stoppen, wir müssen uns darum kümmern, dass das, was ich erwarte, vielleicht gar nicht drin ist. Ich mache jetzt also die Konstruktion, hier das "Exit Sub" nicht vergessen, das sollte man machen, bevor man seine Fehlerbehandlung macht. Da erfinde ich jetzt ein "TabelleFehlt"-Label mit einem Doppelpunkt dahinter und wenn dieses Blatt fehlt, dann kommt er in diesem Fehler, das muss ich natürlich noch auslösen, also "On Error GoTo TabelleFehlt". Wenn hier also ein Fehler auftritt, dann komme ich hier rein und dann kann ich neu anlegen: "Set wksInfo=ThisWorkbook.Worksheets.Add". Ich mache das mal deutlich mit den Klammern, dass man sieht, das hat einen Rückgabewert, funktionieren würde es auch trotzdem, aber ich finde, das zählt zu qualitativ gutem Code. Dann kann ich dem den Namen geben nachträglich, also der soll jetzt genau so heißen wie da oben vereinbart und dann geht es mit "Resume" wieder zurück. Wenn also hier ein Fehler auftritt, dann springt er hierhin, legt das Blatt an, benennt es, springt zurück und versucht sich erneut daran. Und dann müsste ich saubererweise hier auch direkt sagen, und jetzt interessiert mich die Fehlerbehandlung nicht mehr, das heißt "On Error Goto 0". Ja, sie haben richtig gehört, 0. Da ist die Zeilennummer aus frühen BASIC-Zeiten wieder. Das bedeutet, ab jetzt läuft die normale VBA-Fehlerbehandlung. Und Sie sehen schon wieder eine Zeile, zwei Zeilen Code und insgesamt eher schon so 15 Zeilen, die hier für die Fehlerbehandlung drumrumgebastelt sind. Aber immerhin haben wir die Chance, dass es funktioniert. Im Moment gibt es noch kein Info, also, wenn ich jetzt hier mit F5 einfach laufen lasse, keine Fehlermeldung, da ist das Info. So weit, so gut, aber mir zu viel Code oder sagen wir besser, mir zu viel Spaghetti-Code. Jetzt möchte ich Ihnen die andere Variante zeigen, also Strg+C zum Kopieren, Strg+V zum Einfügen, und dann in der anderen Fassung, ich nenne das zwar jetzt "Ignorieren", aber nennen wir es vielleicht besser "BlockweiseErledigen", denn das ist das Hauptkonzept dabei. Ich will dieses Hin- und Herspringen loswerden. Wenn ein Fehler auftritt, werde ich den jetzt anders behandeln. Ich sage einfach mehr oder weniger: Guck nicht hin, "Resume next". Das hieß in den Anfangszeiten von Excel, als das VBA noch Deutsch war, hieß das sehr schön "Bei Fehler Weiter Nächste", also bisschen freier übersetzt: Wenn in der folgenden Zeile ein Fehler auftaucht, ist mir egal, kümmere dich nicht drum. Das ist natürlich blöd an sich, wenn ich hier dann versuche, dieses Objekt mit einem Inhalt zu füllen, das scheitert, und dann denke, jetzt könnte ich das aktivieren, das kann nichts werden. Aber der Trick besteht darin, dass ich das, was hier passiert, nach da oben verlagere. Ich rücke das mit der Tab-Taste schonmal ein, weil es gerade so schön markiert ist und ziehe es nach hier oben, da brauchen wir noch eine Zeile Abstand, und das hier kann komplett wegfallen. Ich behandel den Fehler in dieser Reihenfolge mit, das ist der wesentliche Unterschied. Ich springe nicht im Fehlerfall von hier nach da und da weiter und von hier aus wieder zurück nach da, sondern ich prüfe jetzt hier, es ist ja beim Fehler weitergelaufen, ob irgendwas passiert ist. Das kann ich in der Fehlernummer sehen, also "If Err.Number<0", dann gab es ein Problem, "Then" behandle ich das, was hier drinsteht, "End If", ansonsten muss ich da nicht reingehen. Wenn hier ein Fehler ist, das merke ich hier, mache ich es anders, nämlich indem ich es hinzufüge und umbenenne, und dann geht es normal weiter, nämlich mit dem, was ich eigentlich machen wollte. Damit es ganz korrekt ist, muss ich hier mit "Err.Clear" auch den Fehler, der da aufgetreten ist, wieder löschen. Achtung, diese Zeile muss nach "Err.Number" stehen. Wenn Sie die vorher machen, erst aufräumen, ist "Err.Number" auf Null, das löst es nämlich genau aus. Also wenn ein Fehler aufgetreten ist, frage ich die Nummer ab und danach erst darf ich das löschen. Jetzt ist es im Moment natürlich einfach, es tritt kein Fehler auf. Ich kann nochmal eben gucken, ich gehe mal mit Absicht -- das "Info" gibt es --, gehe mit Absicht mal in irgendein anderes Blatt, mit Alt+F11 lasse ich das jetzt F5 hier starten, hat funktioniert, ich gucke mal, was passiert ist, ich bin im Infoblatt. Und jetzt lösche ich das Infoblatt, stehe also auf irgendeiner anderen Tabelle, und kann jetzt mit F5 das ohne Fehlermeldung wieder einfügen. Sie sehen, hier ist es schon erschienen. Es ist auch aktiviert. Also es funktioniert genauso, ich würde auch nicht so laut behaupten, dass der Code erheblich kürzer ist, Sie sehen, die Zeilen letzten Endes sind mehr oder weniger identisch, das "Resume" entspricht übrigens einem "Err.Clear", das macht er intern noch so mit, deswegen brauche ich das nicht extra. Aber die Reihenfolge ist anders. Das wird, wie es sich für ein anständiges Programm gehört, zeilenweise abgearbeitet, hier ein Fehler, wenn er auftritt, wander ich hier in diesen If-Block rein und ansonsten mache ich einfach direkt weiter. Es liest sich wie ein normales Programm mit einem If-Block drin, den man in dieser Reihenfolge weiter lesen kann. Und das ist das Problem mit dieser normalen Fehlerbehandlung, das sie ans Ende der Prozedur springt, wieder zurück und wieder nach hinten und wieder nach vorne und man nicht wirklich nachverfolgen kann, was da eigentlich passiert. Wenn Sie irgendwas machen müssen im Fehlerfall, würde ich diese Konstruktion empfehlen, erstmal weitermachen, locker bleiben, keine Panik und anschließend fragen, und zwar direkt hinterher, ob da ein Fehler aufgetreten ist, zur Not können Sie sogar die Nummer noch prüfen. Dann steht hier irgendwie ein "Select Case", aber auf jeden Fall wird es in einem Block abgearbeitet, danach schalten Sie bei Bedarf die Fehlerbehandlung wieder aus und machen ganz normal weiter.

Excel 2016 VBA für Profis

Nutzen Sie die Möglichkeiten der Programmiersprache VBA in Excel 2016, um eigene Dialoge zu erstellen, auf andere Arbeitsmappen zuzugreifen und wichtige Funktionen einzusetzen.

5 Std. 52 min (55 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Ihr(e) Trainer:
Erscheinungsdatum:25.01.2017
Laufzeit:5 Std. 52 min (55 Videos)

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!