AW: danke für die Backfeife
23.01.2008 00:13:00
Daniel
Hi
ist ja kein Problem,
aber ein Pauschales On Error Resume Next wirkt sich in einem Programm oft fatal aus, weil das Programm bei einem Fehler nicht mehr stoppt, sondern fröhlich weiter rechnet.
Man wundert sich dann zwar über seltsame, falsche oder unerwünschte Ergenisse, aber die Suche nach den Fehlerursachen gestaltet sich ungleich schwieriger, weil man keinen Anhaltspunkt hat, wo der Fehler liegen könnte.
Bei einem Programmabbruch bekommt man einen klaren Hinweis, an welcher Stelle man ansetzen muss, um den Fehler zu beheben (meistens zumindest).
kurz gesagt, es ungefähr so sinnvoll, wie wenn man sich mit einem Strick um den Hals am Autositzt festbindet und trotzdem glaubt, man wäre sicher angeschnallt.
Ich hoffe, du verstehts jetzt meinen ersten Kommentar zum Thema.
wenn man ein Problem mit Fehlern hat und mit ON ERROR RESUME NEXT arbeiten will, sollte man folgende Regeln beachtgen:
1. ON ERROR RESUME NEXT steht immer möglichst dicht vor der Programmzeile, von der man weiss, daß sie Fehler erzeugen kann.
2. danach schreibt man möglichst bald wieder ON ERROR GOTO 0, damit bei unbabsichtigten Fehlern wieder abgebrochen wird.
3. sollte danach eine Prüfung erfolgen, ob ein Fehler vorliegt und im Programm entsprechend darauf reagiert werden.
hier mal ein Beispiel, wie sowas aussehen kannt:
- per Inputbox wird eine Zahl eingegeben. Weil man bei einer Inputbox ja auch Text eingeben kann, kann es hier zu Fehlern im Programmablauf kommen.
Sub Test()
Dim Eingabe As Integer
Eingabe = 0 ' oder ein anderer, zulässiger Wert, der aber in der Regel nicht vorkommt
'--- Eingabe wegen Fehlermöglichkeit in On Error gekapslt
On Error Resume Next
Eingabe = InputBox("Bitte Zahl eingeben")
On Error GoTo 0
'--- Prüfung auf Fehler und berechnung, wenn es zu einem Fehler kam
'--- bleibt der Ausganswert der Variabel Eingabe (0) unverändert
If Eingabe = 0 Then
MsgBox "Es wurde keine gültige Zahl eingegeben, es wird nichts berechnet" 'das passiert _
beim Fehler
Else
MsgBox "Das Quadrad von " & Eingabe & " ist " & Eingabe ^ 2 ' Berechnung, wenn kein Fehler
End If
End Sub
Eine weiter Mehtode zu prüfen, ob ein Fehler passiert ist, ist die Abfrage der Systemvariable err
diese hat normalerweise den Wert 0, bei einem Fehler bekommt sie einen anderen Wert zugewiesen (im Prinip den Fehlercode).
eine Typische Prüfung sähe dann so aus (Beispielhaft)
on error resume next
... hier folgt Code, der Fehler erzeugen kann
if err = 0 then
msgbox "alles Paletti"
else
msgbox "Achtung Fehler, Fehlercode ist " & err
end if
On error goto 0
On error goto 0 kann man in diesem Fall erst dann verwenden, nachdem man err abgefragt hat, weil dabei err wieder auf 0 gesetzt wird.
Es gibt noch die Variable ERROR, die einen Hinweistext zum Fehler enthält.
Schließlich gibt es noch ein paar fälle, wo man es auch ohne Prüfung einsetzen kann, aber auch hier wird nur der Codeteil in die OnErrors gekapselt, der den Fehler erzeugen kann.
Beispiel:
ich will das Tabellenblatt mit dem Namen "xxx" per Makro-Code löschen.
da es aber sein könnte, daß es nicht vorhanden ist, weil ein Aufmerksamer Anwender es schon von Hand gelöscht hat, müsste ich hier um fehler zu vermeiden vorab prüfen, ob es überhaupt vorhanden ist.
das ist etwas aufwendig viel einfacher geht es in diesem Fall mit:
On Error Resume Next
Sheets("xxx").delete
On Error Goto 0
Auf Fehler braucht hier nicht geprüft zu werden, weil im Fehler - wie im Nicht-Fehlerfall das gleiche Ergebnis vorliegt: Blatt "xxx" ist nicht mehr vorhanden.
Allerdings sollte man sowas nur selten einsetzen und lieber vorab mit Fehlerfreien Methoden prüfen (wenn es nicht zuviel aufwand macht).
so, genug damit , ich hoffe du hast was dazu gelernt und bist wieder ein etwas besserer Programmierer geworden.
Gruß, Daniel