Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Fehler überspringen

Fehler überspringen
08.05.2013 14:16:44
Christopher

Huhu Hallo,
ich habe diesen Code hier im Forum gestohlen!!!
Der funktioniert soweit auch TOp nur leider wenn mal kein Datum verfügbar ist schmiert das ganze Teil ab. kann man das so umbauen dass das dann einfach ignoriert wird?
Private Sub Workbook_Open()
Dim sMldg1 As String, sMldg2 As String, lR As Long, iDiff As Integer
Dim sMldg3 As String, sMldg4 As String, iDiff1 As Integer
Dim arrJub(1 To 6) As Integer, intI As Integer
Const iVn As Integer = 3   ' Spalte C - Vornamen
Const iNn As Integer = 2   ' Spalte D - Nachnamen
Const iG As Integer = 7    ' Spalte H - Geburtstage
Const iEin As Integer = 8  ' Spalte I - Eintrittsdatum
arrJub(1) = 10    ' 10-jähriges Jubiläum
arrJub(2) = 20    ' 20-jähriges Jubiläum
arrJub(3) = 25    ' 25-jähriges Jubiläum
arrJub(4) = 30    ' 30-jähriges Jubiläum
arrJub(5) = 40    ' 40-jähriges Jubiläum
arrJub(6) = 50    ' 50-jähriges Jubiläum
ActiveSheet.Protect Password:=""
Beep
' Überprüfung auf Geburtstage (dieses Makro hab ich hier im Forum gefunden)
sMldg1 = "Geburtstage:" & vbLf
lR = 2
Do Until IsEmpty(Cells(lR, iVn))
iDiff = DateSerial(Year(Date), Month(Cells(lR, iG)), Day(Cells(lR, iG))) - Date
If iDiff  "" Then
MsgBox "Geburtstage in den nächsten 31 Tagen:" & vbLf & sMldg2, , "Vorschau"
Else
MsgBox "Keine Geburtstage in den nächsten 31 Tagen!", , "Info"
End If
End If
' Überprüfung auf  Jubiläen
sMldg3 = "Jubiläum:" & vbLf
lR = 2
Do Until IsEmpty(Cells(lR, iVn))
For intI = LBound(arrJub) To UBound(arrJub)
iDiff1 = DateSerial(Year(Cells(lR, iEin)) + arrJub(intI), Month(Cells(lR, iEin)), _
Day(Cells(lR, iEin))) - Date
If iDiff1  "" Then
MsgBox "Jubiläen in den nächsten 31 Tagen:" & vbLf & sMldg4, , "Vorschau"
Else
MsgBox "Keine Jubiläen in den nächsten 31 Tagen!", , "Info"
End If
End If
End Sub

Anzeige

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler überspringen
08.05.2013 14:19:35
Toumas
ich weiß nicht ob es stimmt,
aber versuch es mal mit
On Error Resume Next
Gruß
Toumas

AW: Fehler überspringen
08.05.2013 14:35:53
Christopher
Funktioniert so wies aussieht ;)

Freut mich....
08.05.2013 14:41:04
Toumas
Freut mich, bin ja noch Anfänger..... ;-)

Anzeige
Autsch ....
08.05.2013 15:12:22
Klaus
Hallo zusammen,
über einen Code unreflektiert "on error resume next" drüber zu knallen ist ungefähr so, wie die Motorkontrolleuchte im Auto mit schwarzem Tesa zu überkleben.
Aber wenns hilft ....
Grüße,
Klaus M.vdT.

AW: Autsch ....
08.05.2013 15:17:45
Toumas
Hallo Klaus,
sorry... war nur eine Anfängeridee.....
Grüße
Toumas

Anzeige
@Toumas:
08.05.2013 15:24:48
Klaus
Hallo Toumas,
wir haben uns mit den Postings überschnitten, darum hier nochmal:
du musst dich nicht entschuldigen, wenn du eine funktionale Idee postest! Nur grad bei "On Error" sollte man mit einem Satz darauf hinweisen, dass dies auch Nachteile mitbringt.
Falls ich dich eingeschüchtert habe (was nicht wollte!) dann kann ich dir im Archiv mal ein paar Beiträge raussuchen in denen ich zu Themen wie "volatile Funktionen" und "Matrixberechung" kluggeschissen habe und dann von Hansueli und / oder Luc zurechtgewiesen wurde :-) hier gehts halt manchmal etwas rauher zu. Aber wir lernen alle noch!
Grüße,
Klaus M.vdT.

Anzeige
AW: @Toumas: => zu spät gesehen - Anmerkung
10.05.2013 09:01:30
Toumas
Hallo Klaus,
keine Bange, so schnell schüchtert man mich nicht ein. Da ich, wie man ja durchaus durch meine "unzähligen" Fragen bezüglich VBA usw. erst am Anfang bin, war ich schon recht froh auch mal antworten zu können ;-) Auch, und da gebe ich dir vollkommen Recht, ich auch auf die Problematik, die hinter einen solchen Befehl steckt aufmerksam machen sollte....
Darf ich als Ausrede anbringen, dass ich es noch nicht besser weiß ? ;-)
Also von dem her keine Bange, so rauh empfand ich es nicht :-))
Viele Grüße
Toumas

Anzeige
AW: @Toumas: => zu spät gesehen - Anmerkung
10.05.2013 10:09:40
Klaus
Darf ich als Ausrede anbringen, dass ich es noch nicht besser weiß ? ;-)
Klar! Die Ausrede benutze ich ständig!
Viel Erfolg beim Excel-und-VBA-lernen, herber.de ist dafür der richtige Ort.
Grüße,
Klaus M.vdT.

und nochmal was konstruktives hinterher:
08.05.2013 15:20:23
Klaus
Hi Christopher,
soweit ich das sehe, erwartet dein Code ein Datum. Leider hast du nicht geschrieben WO und mit WELCHER Meldung er abschmiert, darum kann ich nur raten.
Ich habe innerhalb der beiden LOOP-Schleifen jeweils eine ISDATE() Abfrage mit einem IF-Block versehen. So wird die jeweilige Aktion nur ausgeführt, wenn die fragliche Zelle auch ein Datum hat.
Prüf mal ob dir das so hilft. Es ist vielleicht etwas aufweniger als die "On Error" Methode, aber .. naja, mein Vergleich mit dem Auto von oben ;-)
Hallo Thoumas,
bitte nichts für ungut! Du hast eine funktionale Lösung geliefert, und erlaubt ist was funktioniert.
Hier der neue Code (ungetestet!):
Private Sub Workbook_Open()
Dim sMldg1 As String, sMldg2 As String, lR As Long, iDiff As Integer
Dim sMldg3 As String, sMldg4 As String, iDiff1 As Integer
Dim arrJub(1 To 6) As Integer, intI As Integer
Const iVn As Integer = 3   ' Spalte C - Vornamen
Const iNn As Integer = 2   ' Spalte D - Nachnamen
Const iG As Integer = 7    ' Spalte H - Geburtstage
Const iEin As Integer = 8  ' Spalte I - Eintrittsdatum
arrJub(1) = 10    ' 10-jähriges Jubiläum
arrJub(2) = 20    ' 20-jähriges Jubiläum
arrJub(3) = 25    ' 25-jähriges Jubiläum
arrJub(4) = 30    ' 30-jähriges Jubiläum
arrJub(5) = 40    ' 40-jähriges Jubiläum
arrJub(6) = 50    ' 50-jähriges Jubiläum
ActiveSheet.Protect Password:=""
Beep
' Überprüfung auf Geburtstage (dieses Makro hab ich hier im Forum gefunden)
sMldg1 = "Geburtstage:" & vbLf
lR = 2
Do Until IsEmpty(Cells(lR, iVn))
        If IsDate(Cells(lR, iVn)) Then
iDiff = DateSerial(Year(Date), Month(Cells(lR, iG)), Day(Cells(lR, iG))) - Date
If iDiff         End If
Loop
If sMldg1 = "Geburtstage:" & vbLf Then sMldg1 = "Heute kein Geburtstag!"
If MsgBox(sMldg1, vbOKCancel, "Info") = vbOK Then
If sMldg2  "" Then
MsgBox "Geburtstage in den nächsten 31 Tagen:" & vbLf & sMldg2, , "Vorschau"
Else
MsgBox "Keine Geburtstage in den nächsten 31 Tagen!", , "Info"
End If
End If
' Überprüfung auf  Jubiläen
sMldg3 = "Jubiläum:" & vbLf
lR = 2
Do Until IsEmpty(Cells(lR, iVn))
        If IsDate(Cells(lR, iVn)) Then
For intI = LBound(arrJub) To UBound(arrJub)
iDiff1 = DateSerial(Year(Cells(lR, iEin)) + arrJub(intI), Month(Cells(lR, iEin)), _
Day(Cells(lR, iEin))) - Date
If iDiff1         End If
Loop
If sMldg3 = "Jubiläum:" & vbLf Then sMldg3 = "Heute kein Jubiläum!"
If MsgBox(sMldg3, vbOKCancel, "Info") = vbOK Then
If sMldg4  "" Then
MsgBox "Jubiläen in den nächsten 31 Tagen:" & vbLf & sMldg4, , "Vorschau"
Else
MsgBox "Keine Jubiläen in den nächsten 31 Tagen!", , "Info"
End If
End If
End Sub

Anzeige
Adressierung und Anderes
08.05.2013 16:36:36
EtoPHG
Hallo zusammen,
@Klaus: Sorry wenn du dich von mir zurechtgewiesen fühlst, ich werde mich in Zukunft mehr hin-, denn zurechtweisend, zu geben ;-)
@Christopher: Ich bin Lucs Meinung (ausnahmsweise ;-), sowas gehört ausgelagert. In einem Workbook_Open Ereignis hat dieser Code schon gar nichts zu suchen. Alle Zell- und Bereichsreferenzierungen sind unklassifiziert, sprich zufällig für das gerade aktive Blatt gültig. Ist ein Diagrammblatt in der Mappe vorhanden und aktiviert und ich schliesse die Mappe, dann dürfte sich der nächste der die Mappe öffnet ziemlich wundern.
Woher wurde dieser Code kopiert? Gibt es eine Link-Referenz?
Gruess Hansueli

Anzeige
@Hansueli
09.05.2013 08:13:33
Klaus
Hallo Hansueli,
wenn ich Blödsinn erzähle (was ja häufig vorkommt), dann bitte BITTE hör nicht auf micht zurechtzuweisen! Ich halte mich für extrem schlau und allwissend, ich brauche die gelegentlichen Dämpfer hier um nicht total abzuheben.
Wenn meine Lösung bereits gut ist und nur verbessert werden könnte, dann reicht ein Hinweis :-)
Grüße,
Klaus M.vdT.

Anzeige
AW: @Hansueli
10.05.2013 08:19:09
Christopher
Hallo,
Das ist der Link wo ich den Code geklaut habe.
https://www.herber.de/forum/archiv/1012to1016/1012455_Verschiedene_Jubilaeen_in_einer_MsgBox_anzeigen.html
Ich hab mir natürlich zuerst durchgelesen wie On Error resume next funktioniert. Dort wurde schon beschrieben dass man das nur in Ausnahmefällen nutzen sollte und auch nicht den ganzen Code reinsetzen.
Was mir noch aufgefallen ist, das ganze scheint nur zu funktionieren wenn ab der ersten Zeile Datum oder ähnliches steht . Stehen meine Infos erst ab der bsp. 12 Zeile passiert garnichts mehr.

Anzeige
AW: Adressierung und Anderes
10.05.2013 08:24:55
Christopher
Wenn ich diesen Code laufen lasse passiert garnichts mehr. Sanduhr und Ende Gelände. Keine Fehlermeldung nichts.
Musste den Prozess dann abwürgen.

AW: Adressierung und Anderes
10.05.2013 08:31:08
Klaus
Hi Christopher,
kein Grund auf Anrede und Gruß zu verzichten! :-)
Ich könnte jetzt natürlich kompliziert fragen, in welcher Zeile der debugger nach dem Abwürgen steht (abwürgen = STRG+Pause?) oder ob du mit Geierkralle (STRG+ALT+DEL) abwürgen musst ... Vorschläge mit Haltepunkten usw usw machen ... Aber ich glaube, bei deinem angegebenen Level macht es mehr Sinn, wenn einer von uns selbst nach dem Fehler sucht. Magst du mal eine Musterdatei hochladen? Reicht ja eine handvoll Datümer im relevaten Bereich, Realnamen bitte gegen "Max Mustermann" usw ersetzen.
Oder du beschließt, einfach die erste "on Error resume next" Variante (die lief offensichtlich?) zu nutzen. Ich kenne Leute, die seit Jahren mit abgeklebter Motorkontrolleuchte fahren und deren Kiste macht keine Probleme.
Grüße,
Klaus M.vdT.

Anzeige
AW: Adressierung und Anderes
10.05.2013 08:59:17
Christopher
Hallo Klaus ;),
diese Lampe abzukleben ist so garnicht meine Art. Dazu hat das ganze zu viel gekostet als dass es das Wert wäre !!
Ich muss die wie du sie nennst Geierkralle benutzen.
Da ich mir meine Datenbank nicht zerballern wollte mit dem Code hab ich sowieso nur ne Datei in der 4 Spalten sind.
Spalte 1 Vorname Spalte 2 Nachname Spalte 3 Geburtsdatum Spalte 4 Eintrittsdatum
Sonst rein garnichts.
Nur das ab und zu mal eines der beiden Datum oder auch mal beide fehlen. Im ursprünglichen Code kommt hier irgendwann mal ein Überlauffehler. Mit On Error Resume next funktioniert das soweit. In deinem Code bleibt Excel stehen.

Anzeige
Fehler gefunden:
10.05.2013 10:02:12
Klaus
Hallo Christopher,
ich habe den Fehler gefunden. Der Zeilenindex - Erhöher
lR = lR + 1
stand innerhalb des IF-Blockes. Dadurch wird das DO-LOOP eine Endlosschleife, da Excel ewig in der ersten nicht-leeren Zelle hängen bleibt.
Hier der neue Code, Änderung (einfach 2x 2 Zeilen getauscht!) fett:

Dim sMldg1 As String, sMldg2 As String, lR As Long, iDiff As Integer
Dim sMldg3 As String, sMldg4 As String, iDiff1 As Integer
Dim arrJub(1 To 6) As Integer, intI As Integer
Const iVn As Integer = 3   ' Spalte C - Vornamen
Const iNn As Integer = 2   ' Spalte D - Nachnamen
Const iG As Integer = 7    ' Spalte H - Geburtstage
Const iEin As Integer = 8  ' Spalte I - Eintrittsdatum
arrJub(1) = 10    ' 10-jähriges Jubiläum
arrJub(2) = 20    ' 20-jähriges Jubiläum
arrJub(3) = 25    ' 25-jähriges Jubiläum
arrJub(4) = 30    ' 30-jähriges Jubiläum
arrJub(5) = 40    ' 40-jähriges Jubiläum
arrJub(6) = 50    ' 50-jähriges Jubiläum
ActiveSheet.Protect Password:=""
Beep
' Überprüfung auf Geburtstage (dieses Makro hab ich hier im Forum gefunden)
sMldg1 = "Geburtstage:" & vbLf
lR = 2
Do Until IsEmpty(Cells(lR, iVn))
If IsDate(Cells(lR, iVn)) Then
iDiff = DateSerial(Year(Date), Month(Cells(lR, iG)), Day(Cells(lR, iG))) - Date
If iDiff      End If
lR = lR + 1
Loop
If sMldg1 = "Geburtstage:" & vbLf Then sMldg1 = "Heute kein Geburtstag!"
If MsgBox(sMldg1, vbOKCancel, "Info") = vbOK Then
If sMldg2  "" Then
MsgBox "Geburtstage in den nächsten 31 Tagen:" & vbLf & sMldg2, , "Vorschau"
Else
MsgBox "Keine Geburtstage in den nächsten 31 Tagen!", , "Info"
End If
End If
' Überprüfung auf  Jubiläen
sMldg3 = "Jubiläum:" & vbLf
lR = 2
Do Until IsEmpty(Cells(lR, iVn))
If IsDate(Cells(lR, iVn)) Then
For intI = LBound(arrJub) To UBound(arrJub)
iDiff1 = DateSerial(Year(Cells(lR, iEin)) + arrJub(intI), Month(Cells(lR, iEin)), _
Day(Cells(lR, iEin))) - Date
If iDiff1      End If
lR = lR + 1
Loop
If sMldg3 = "Jubiläum:" & vbLf Then sMldg3 = "Heute kein Jubiläum!"
If MsgBox(sMldg3, vbOKCancel, "Info") = vbOK Then
If sMldg4  "" Then
MsgBox "Jubiläen in den nächsten 31 Tagen:" & vbLf & sMldg4, , "Vorschau"
Else
MsgBox "Keine Jubiläen in den nächsten 31 Tagen!", , "Info"
End If
End If
Übrigens: ich bin, unter anderem aus diesem Grund, kein Freund von DO-LOOP Schleifen. Ich finde die einfach unübersichtlich. Den o.g. Code könnte man leicht auf FOR-NEXT Schleifen umstellen und auf diesen Zeilenindexzähler ganz verzichten (soll ich?).
Übrigens 2: ein so langer Code gehört nicht in "Workbook Open". Aus Prinzip nicht! Pack den lieber in ein eigenes Modul unter einem sprechenden Namen, und Calle das Makro aus WorkbookOpen. Macht - in diesem Fall - zwar Null unterschied, aber man sollte sich schnell angewöhnen seine Ereignissprozeduren übersichtlich zu halten. Auto-Analogie: Wenn die Karre total verdreckt ist, fährt sie trotzdem genausogut wie vorher. Eine Fahrt durch die Waschstrasse schadet aber nicht.
Grüße,
Klaus M.vdT.

Anzeige
zweiten Fehler gefunden:
10.05.2013 10:31:54
Klaus
Hi Christopher,
ich weiss da kannst du nichts für, aber:
die Variablenbeschriftung in dem Makro ist ja unter aller Kanone. Statt der kryptischen "iG" und "iVn" hätten die Variablen gerne "iGeburtstag" und "iVorname" heissen dürfen, dann hätte ich die Fehler gleich gesehen.
Der hier ist auch echt fies:
Const iG As Integer = 7 ' Spalte H - Geburtstage
Const iEin As Integer = 8 ' Spalte I - Eintrittsdatum

natürlich glaube ich dem Kommentar einfach. Weil H eben nicht die siebte Spalte ist, ergab dass dann Unsinn ... glaube keinem Kommentar, den du nicht selbst geschrieben hast! Folgelogik: Code muss nicht kommentiert werden, da es eh keiner glaubt ... ehm, das nehme ich zurück!
Im vorherigen Code wird mit "ISDATE" noch der Vorname geprüft, das macht natürlich keinen Sinn. Vornamen sind nur ganz selten gültige Datümer, und wenn dann waren die Eltern echt fies.
Hier jetzt nochmal der Code, der tatsächlich funktioniert. Ich habe auch diese schrecklichen DO-LOOP rausgeworfen und gegen FOR-NEXT ersetzt.
Sub GebUndJubHolen()
Dim sMldg1 As String, sMldg2 As String, lR As Long, iDiff As Integer
Dim sMldg3 As String, sMldg4 As String, iDiff1 As Integer
Dim arrJub(1 To 6) As Integer, intI As Integer
Dim lRowLast As Long
Dim lRowFirst As Long
Const iVn As Integer = 3   ' Spalte C - Vornamen
Const iNn As Integer = 2   ' Spalte D - Nachnamen
Const iG As Integer = 7    ' Spalte H - Geburtstage
Const iEin As Integer = 8  ' Spalte I - Eintrittsdatum
arrJub(1) = 10    ' 10-jähriges Jubiläum
arrJub(2) = 20    ' 20-jähriges Jubiläum
arrJub(3) = 25    ' 25-jähriges Jubiläum
arrJub(4) = 30    ' 30-jähriges Jubiläum
arrJub(5) = 40    ' 40-jähriges Jubiläum
arrJub(6) = 50    ' 50-jähriges Jubiläum
'ActiveSheet.Protect Password:=""
Beep
' Überprüfung auf Geburtstage (dieses Makro hab ich hier im Forum gefunden)
sMldg1 = "Geburtstage:" & vbLf
'erste Zeile
lRowFirst = 2
'letzte Zeile
lRowLast = Cells(Rows.Count, iG).End(xlUp).Row
For lR = lRowFirst To lRowLast
If IsDate(Cells(lR, iG)) Then 'auf IG geändert!
iDiff = DateSerial(Year(Date), Month(Cells(lR, iG)), Day(Cells(lR, iG))) - Date
If iDiff  "" Then
MsgBox "Geburtstage in den nächsten 31 Tagen:" & vbLf & sMldg2, , "Vorschau"
Else
MsgBox "Keine Geburtstage in den nächsten 31 Tagen!", , "Info"
End If
End If
' Überprüfung auf  Jubiläen
sMldg3 = "Jubiläum:" & vbLf
'letzte Zeile
lRowLast = Cells(Rows.Count, iEin).End(xlUp).Row
For lR = lRowFirst To lRowLast
If IsDate(Cells(lR, iEin)) Then 'auf iEin geändert
For intI = LBound(arrJub) To UBound(arrJub)
iDiff1 = DateSerial(Year(Cells(lR, iEin)) + arrJub(intI), Month(Cells(lR, iEin)), _
Day(Cells(lR, iEin))) - Date
If iDiff1  "" Then
MsgBox "Jubiläen in den nächsten 31 Tagen:" & vbLf & sMldg4, , "Vorschau"
Else
MsgBox "Keine Jubiläen in den nächsten 31 Tagen!", , "Info"
End If
End If
End Sub
Grüße,
Klaus M.vdT.

Anzeige
Da wäre noch was, ....
08.05.2013 15:32:49
Luc:-?
…Folks;
es ist immer ratsam, solche speziellen Vorgänge nicht direkt in eine Ereignisprozedur zu stecken (mache ich leider auch manchmal), sondern in eine ExtraProzedur, die dann (ggf unter bestimmten Bedingungen) aus der Ereignisprozedur heraus aufgerufen wird. Dadurch bleibt Letztere übersichtlich und lässt sich deshalb auch noch gut für Anderes verwenden.
On Error Resume Next kann uU sinnvoll sein, aber selten für die ganze Prozedur (eine Ausnahme können ggf UDF mit FehlerAuswertung und variantem Ergebnis sein). Wenn ein Wert (bzw Parameter) fehlen darf, sollte man diesen Fall direkt abfragen und, falls erforderlich, das On Error Resume Next nur hierfür gelten lassen (also davor notieren und danach wieder On Error GoTo fm (fm = irgendeine gesetzte Sprungmarke, bei der die FehlerBehandlung beginnt). Ohne Fehlerbehandlung (On Error GoTo 0 ) läuft man Gefahr, dass während der Abarbeitung eine VBA-Standard-Fehlermeldung erscheint, über die ins CodeModul gesprungen wdn kann. Ist das CodeProjekt geschützt, kommt eine kryptische Fmeldung wie Fehler in verborgenem Modul und aus ist's. Was soll ein (VBA-unkundiger) Endnutzer damit anfangen?
Gruß Luc :-?

Anzeige
ganz ohne VBA
10.05.2013 10:48:39
Klaus
Hallo Christopher,
weils mir grad Spaß gemacht hat, hier nochmal eine Lösung mit Boardmitteln:
https://www.herber.de/bbs/user/85270.xlsx
Einfach in "K" und "L" nach "nichtleeren" Filtern für die Übersicht. Damit es Geburstage und Jubis zum testen gibt, habe ich ein Datum fest eingetragen - stattdessen natürlich "=HEUTE()".
Grüße,
Klaus M.vdT.
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Fehler überspringen in Excel VBA


Schritt-für-Schritt-Anleitung

Um Fehler in deinem VBA-Code zu überspringen, kannst du die On Error Resume Next Anweisung verwenden. Diese Anweisung führt dazu, dass der Code bei einem Fehler einfach weiterläuft, anstatt eine Fehlermeldung anzuzeigen. Hier ist eine Schritt-für-Schritt-Anleitung, wie du diese Methode implementieren kannst:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den Editor zu öffnen.
  2. Finde dein Makro: Suche das Makro, in dem du Fehler überspringen möchtest.
  3. Füge die Anweisung hinzu: Setze On Error Resume Next direkt vor den Codeabschnitt, der potenziell Fehler verursachen könnte.

    Beispiel:

    On Error Resume Next
    ' Dein Code hier
    On Error GoTo 0  ' Fehlerbehandlung zurücksetzen
  4. Testen: Führe das Makro aus und überprüfe, ob es ohne Unterbrechungen läuft.

Häufige Fehler und Lösungen

Hier sind einige häufige Fehler, die bei der Verwendung von On Error Resume Next auftreten können, sowie deren Lösungen:

  • Endlosschleifen: Wenn du lR = lR + 1 innerhalb eines IF-Blocks vergisst, kann die Schleife endlos laufen. Stelle sicher, dass du den Zeilenindex außerhalb des IF-Blocks erhöhst.

  • Falsche Zellreferenzen: Wenn deine Daten nicht in der erwarteten Zeile beginnen, überprüfe die Startzeile in deinem Code. Stelle sicher, dass du ab der richtigen Zeile iterierst.

  • Ungültige Daten: Verwende die IsDate() Funktion, um sicherzustellen, dass nur gültige Datumswerte verarbeitet werden. Dies verhindert, dass dein Makro bei ungültigen Daten abstürzt.


Alternative Methoden

Wenn du On Error Resume Next nicht verwenden möchtest, gibt es Alternativen, um mit Fehlern umzugehen:

  1. If IsDate(...) Then: Überprüfe, ob die Zelle ein gültiges Datum enthält, bevor du Operationen darauf ausführst. Dies reduziert die Wahrscheinlichkeit von Laufzeitfehlern.

    Beispiel:

    If IsDate(Cells(lR, iG)) Then
       ' Datum verarbeiten
    End If
  2. Separate Fehlerbehandlung: Statt On Error Resume Next für den gesamten Code zu verwenden, kannst du spezifische Fehlerbehandlungen für bestimmte Teile des Codes definieren.


Praktische Beispiele

Hier ist ein Beispielcode, der sowohl die Verwendung von On Error Resume Next als auch die Überprüfung auf gültige Daten demonstriert:

Sub CheckBirthdays()
    Dim sMldg1 As String
    Dim lR As Long
    Const iG As Integer = 7 ' Spalte H - Geburtstage

    sMldg1 = "Geburtstage:" & vbLf
    For lR = 2 To Cells(Rows.Count, iG).End(xlUp).Row
        If IsDate(Cells(lR, iG)) Then
            ' Datum verarbeiten
            sMldg1 = sMldg1 & Cells(lR, iG).Value & vbLf
        End If
    Next lR

    MsgBox sMldg1
End Sub

Tipps für Profis

  • Vermeide globale Fehlerbehandlungen: Nutze On Error Resume Next sparsam und nur in spezifischen Fällen, um unvorhergesehene Probleme zu vermeiden.

  • Klarere Variablenbezeichnungen: Verwende aussagekräftige Variablennamen, um die Lesbarkeit deines Codes zu verbessern. Zum Beispiel iGeburtstag statt iG.

  • Ereignisprozeduren optimieren: Halte deine Ereignisprozeduren übersichtlich, indem du umfangreiche Logik in separate Subs oder Funktionen auslagerst.


FAQ: Häufige Fragen

1. Frage
Was passiert, wenn ich On Error Resume Next am Anfang meines Makros setze?
Antwort: Der Code wird bei jedem Fehler fortgesetzt, ohne eine Fehlermeldung anzuzeigen. Das kann zu unerwartetem Verhalten führen, wenn du nicht genau weißt, wo der Fehler auftritt.

2. Frage
Wie kann ich sicherstellen, dass mein Code auch ohne On Error Resume Next funktioniert?
Antwort: Verwende Bedingungen wie If IsDate(...) um sicherzustellen, dass nur gültige Daten verarbeitet werden. Dies reduziert die Anzahl der potenziellen Fehler.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige