Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1312to1316
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
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

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..... ;-)

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

@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

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.

Anzeige
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.

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 :-?

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.

93 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige