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 2013 VBA für Profis

Fehler ignorieren

LinkedIn Learning kostenlos und unverbindlich testen!

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

Transkript

Es ist ja ganz schön, wenn Sie Fehlerbehandlung machen. Aber diese Art der Fehlerbehandlung ist nicht schön. Es ist zwar die offizielle Version, aber das Problem ist, dass der sogenannte Spaghetti-Code entsteht. Das heißt, zur Laufzeit springt der Cursor sozusagen, also die Reihenfolge, in der das abläuft, wild hin und her. Und wenn Sie sich das genau betrachten, aus diesen drei ursprünglichen Zeilen sind ja ganze Blöcke am Ende der Prozedur geworden, die für je eine Zeile mehrere Zeilen irgendwo weit entfernt erzeugen. Deswegen möchte ich Ihnen eine Alternative zeigen, die die Fehlerbehandlung ein bisschen besser handhabbar macht lässt. Der Hauptkritikpunkt ist ja, dass der Code hin und her springt in Blöcke, die weit entfernt sind. Ich mache eine andere Art Fehler, nämlich ein Objekt, was fehlt. Und werde das jetzt als Sub FehlerNormal bezeichnen, weil das erstmal die normale Art ist, mit so einem Fehler umzugehen. Ich will zu einer bestimmten Tabelle springen und wie es der Teufel so will, ist die nicht da. Das ist natürlich jetzt provokativ so angelegt, aber das wird Ihnen früher oder später passieren. Ihr Benutzer hat die gelöscht oder sonst was. Also brauche ich zuerst eine entsprechende Variable: wksInfo. Weil es ein Worksheet-Objekt ist, As Worksheet. Und den Namen der gewünschten Tabelle nehme ich schonmal in eine Konstante. Dort schreiben wir ehrlicherweise TabName. Das ist nur damit es ordentlicher programmiert ist. Die wird also "Tabelle Info" heißen. Und an irgendeiner Stelle in Ihrem Code wollen Sie dort hingehen. Würden also sowas schreiben wie: Set wksInfo = ActiveWorkbook, von allen Worksheets dasjenige, was diesen tollen Namen trägt. Und diese Zeile könnte scheitern. Es folgt noch eine zweite, denn tatsächlich ist noch nicht passiert, was ich versprochen habe. Sie wollen zu dieser Tabelle hingehen. Das passiert erst, wenn Sie wksInfo.Activate machen. Und damit haben Sie schon zwei Kandidaten, die scheitern können. Wenn es diese Tabelle, dieses Tabellenblatt nicht gibt, dann wird diese Zeile scheitern. Es könnte natürlich auch ausgeblendet sein und dann ist das Activate nicht möglich. Es könnte auch sein, dass ActiveWorkbook gar nicht offen ist. Das geht aber erst Add-Ins. Also hier können wir uns darauf wenigstens verlassen. Aber Sie ahnen es schon, wenige Zeilen und trotzdem viele Kandidaten für Fehler. Der Hauptfehler wird sein, dass dieses Worksheet mit diesem Namen nicht existiert. Wir können gern schonmal einen Blick hineinwerfen. Es existiert wirklich nicht. Also Alt+F11. Wenn ich das jetzt versuche, vorher allerdings einmal speichern, auszuführen, mit der F5-Taste, gibt es die Fehlermeldung. Die ist nicht besonder hilfreich. Die sagt: "Index außerhalb des gültigen Bereichs". Und wenn wir auf Debuggen gehen, dann wird diese Zeile markiert. Und gemeint ist, von der Worksheets-Auflistung gibt es einen Namen, den Sie behaupten, der dann natürlich fehlt, und in den Indizes, in der Indexsammlung von Worksheets, von der Auflistung, gibt es diesen Namen nicht. Deswegen als Fehlermeldung: "Index außerhalb des gültigen Bereichs". Können wir hier stoppen. Was machen wir nun? Das Einfachste ist: dumm gelaufen, aufhören, fertig. Das erfreut den Benutzer natürlich nicht so, wenn Sie mit diesem Worksheet, mit diesem Tabelleblatt irgendwas machen wollen. Also eigentlich können wir es doch dann erzeugen, wenn der Benutzer da irgendwas drin reinschreiben soll, oder Sie das per VBA machen. Und wir stellen jetzt fest, es gibt dieses Tabelleblatt nicht. Na, dann erfinden wir es einfach. Also ist die offizielle Version: On Error GoTo. Und da erfinde ich jetzt TabelleFehlt. Das kann ich mir schon in die Zwischenablage nehmen, weil ich dann hier unten das Gleiche als Label schreibe und jetzt hier entsprechend reagiere. Das Ding gibt es nicht. Also, da kann ich mir eine Menge von oben kopieren, dann erfinden wir das doch. Wenn es das nicht gibt, dann muss ich nichts anderes machen als .Add. Ich mache mal deutlich die Klammern, damit klar ist, da ist ein Rückgabewert. Das frisch erfundene Tabelleblatt ist jetzt in wksInfo enthalten. Und damit es dann bitte auch den richtigen Namen kriegt, denn es heißt jetzt "Tabelle17" oder irgend sowas Zufälliges, schreibe ich direkt hinterher: wksInfo.Name =, und da haben wir wieder unsere Konstante. Und damit ist der Fehler behoben. Blatt ist nicht da, macht nichts. Dann erzeuge ich es eben. Gebe ihm den richtigen Namen. Und dann versuchen wir doch nochmal dieselbe Zeile durchzuführen. Also wenn hier ein Fehler auftritt, springt er hierhin, erzeugt ein neues Blatt, benennt es so, und mit Resume wird dann genau diese Zeile wieder ausgeführt. Tatsächlich wäre die Zeile sogar überflüssig, denn wksInfo haben wir schon gerade zugewiesen. Aber es tut nicht weh, das gleiche Objekt nochmal zuzuweisen. Und danach wird es aktiviert, ist alles in Ordnung. Hier ist natürlich noch ein kleiner Fehler drin, da muss noch ein Exit Sub hin. Und dann versuchen wir das einfach mal. Einmal F5. Sie haben nichts gemerkt, aber Sie ahnen es schon, das sieht man nämlich hier schon, das Blatt ist erzeugt. Mit Alt+F11 gucke ich mal eben nach. Da ist Tabelle Info erzeugt worden. Die ist auch aktiv. Ich gehe jetzt nochmal gezielt auf ein anderes Blatt, lasse das nochmal laufen, F5. Es ist nichts passiert an Fehlermeldungen, aber das Blatt ist wieder aktiv. So weit also technisch alles in Ordnung. Ich lösche das mal wieder. Aber der Code hat genau das Problem, dass er für die eigentlich zwei interessanten Zeilen ganz viel drumrum machen muss. Die Zeile und diese sechs, fünf, wie immer Sie die zählen wollen, Zeilen sind ausschließlich Fehlerbehandlungen. Im Grunde haben Sie eine Problemzeile und über den Daumen fünf bis sechs Fehlerbehandlungzeilen, nur für eine einzige. Deswegen will ich das umbauen, sodass diese Hin- und Herspringerei in andere Blöcke überflüssig ist Ich mache davon einfach eine Kopie und schreibe dazu jetzt FehlerIgnorieren. Das "FehlerIgnorieren" ist ein bisschen missverständlich, denn ich werde ihn nicht wirklich ignorieren, sondern ich werde ihn mit einem Ignorierbefehl behandeln. So müsste man es eigentlich sagen. Die wesentliche Änderung liegt hier: Nicht im Fehlerfall springen weit, weit weg irgendwohin, sondern im Fehlerfall: "Guck einfach mal nicht hin." On Error Resume Next heißt so viel: "Bei Fehler mach einfach weiter." Und das bedeutet, wenn in dieser Zeile ein Fehler auftritt, geht der Cursor oder die Codebehandlung einfach in die nächste Zeile und ignoriert den Fehler. Und jetzt gehe ich in die nächste Zeile und frage, ob da vielleicht gerade ein Fehler aufgetreten ist. Das ist der Unterschied. Dieser Block hier unten wird jetzt da rein kommen. Und zwar mit einem ehrlichen Block If. Das ist so, wie sich das gehört. Laufender Code, der zeilenweise abgearbeitet wird und Blöcke überspringen kann. Und ich frage jetzt einfach, ob ein Fehler aufgetreten ist. Wenn kein Fehler aufgetreten ist, ist die Err.Number gleich 0. Und das bedeutet, wenn sie ungleich 0 ist, dann hatten wir einen Fehler. Und nur wenn ein Fehler aufgetreten ist, wird der Code in diese Zeile gelangen. Und das, was er dann machen muss, ist genau das, was sonst hier unten steht, aus optischen Gründen ein bisschen eingerückt. Und dieser Teil ist jetzt überflüssig. Es ist also Code, der ganz normal geradeaus läuft, zeilenweise weiter, Blöcke überspringt, aber nie wild in der Prozedur hin und her hüpft. Ein kleiner Unterschied ist jetzt, es gibt hier kein Resume. Denn es ist keine echte Fehlerbehandlung, sondern es ist ein normales If. Ich kann jetzt also an der Stelle ganz normal weiterarbeiten. Das Objekt fehlte, dann wird es erstellt, richtig benannt und in beiden Fällen ist es jetzt vorhanden und es geht mit dem Activate weiter. Und damit sind wir fertig. Ich kann also hier mit erstens paar weniger Zeilen, aber vor allem übersichtlicheren Zeilen, den Fehler genauso behandeln. Und anständigerweise würde ich auch dafür sorgen, dass jetzt die Fehlerbehandlung ausgeschaltet ist. Das geht mit On Error GoTo 0. Ja, 0. Da sind die Zeilennummern wieder. Die Labels, die Sprungmarken sind ja nur verkappte Zeilennummern und der Befehl On Error GoTo 0, in die "0-te" Zeile, die es gar nicht gibt, die sagt dem Compiler, "ab jetzt bist du wieder selber verantwortlich". Die Fehlerbehandlung ist also beschränkt auf diese Zeile. Und damit, das sollten wir vielleicht nochmal testen, haben Sie den Fehler nicht nur kürzer, wenn Sie die beiden mal vergleichen, sondern vor allem übersichtlicher behandelt, weil der Fehler immer direkt hinter der auftretenden Zeile abgearbeitet wird Und jetzt ist vorbei. Jetzt haben Sie damit nichts mehr zu tun. Auch hier einmal speichern. F5. Und da ist also als einzige Änderung passiert: Es ist eine neue Tabelle entstanden. Kann man hier wieder sehen, es gab keine Rückmeldung, keine Probleme, weil der Fehler, obwohl das ja FehlerIgnorieren heißt, in Wirklichkeit abgearbeitet wurde, nur anders.

Excel 2013 VBA für Profis

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

4 Std. 59 min (53 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

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!