PDA

Vollständige Version anzeigen : MsgBox mit Geburtsdatum +-5 Tagen


WAL5
01.09.2012, 23:08
Hallo Forum,

ich bastele an einem schon behandelten Problem mit der Anzeige von nahen kommenden und gewesenen Geburtstagen in einer MsgBox-Ausgabe.

Dazu habe ich den im Forum bekannten Code verwendet und etwas umgewandelt. Er funktioniert für tagesaktuelle Anzeigen!

Leider schaffe ich es derzeit nicht, den Code so abzuwandeln, das mir zusätzlich die Geburtstage der letzten und kommenden 4 Tage mit angezeigt werden.
Alle meine Überlegungen enden derzeit darin, das die Teilung des Datums im Code dazu führen würde, das Probleme bei Monatsübergängen auftreten.

Ich hoffe auf Eure Hilfe... Danke!
Andreas

Dim dat As Date
Dim intRow As Integer
Dim strTxt As String
intRow = 4
Do Until IsEmpty(Sheets("Personal").Cells(intRow, 4))
dat = Sheets("Personal").Cells(intRow, 4).Value
If Month(dat) = Month(Date) And Day(dat) = Day(Date) Then
strTxt = strTxt & Day(dat) & "." & Month(dat) & _
". " & Sheets("Personal").Cells(intRow, 3).Value & _
" " & Sheets("Personal").Cells(intRow, 2).Value & _
", " & Right(Year(Sheets("Personal").Cells(intRow, 5).Value), 2) & _
" Jahre" & vbLf
End If
intRow = intRow + 1
Loop
If strTxt <> "" Then
MsgBox strTxt, vbInformation, "Aktuelle Geburtstage"
Else
End If

Erklärung:
4 = Geburtsdatum
3 = Vorname
2 = Nachname
5 = Errechnetes Alter am Jahresende

ebs17
01.09.2012, 23:23
Teilung des Datums im Code dazu führen würde, das Probleme bei Monatsübergängen auftreten
... von Jahreswechseln ganz zu schweigen.

Hier wäre eine Datenbanklösung, die man auch in Excel nachbauen kann:
Geburtstagsliste sortiert mit Altersberechnung und Hervorhebung von runden Geburtstagen (http://dbwiki.net/wiki/Datei:AccSampleSortedBirthdayList.zip)

GMG-CC
02.09.2012, 00:35
Hallo,

ich will dir ja nicht die ganze Freude am Programmieren nehmen, darum hier ein Ansatz, der aber den entscheidenden Punkt gelöst hat.

Beverly
02.09.2012, 06:51
Hi, Andreas,

schau dir mal das Beispiel Geburtstage einfärben (http://excel-inn.de/dateien/vba_beispiele/geburtstag_heute_ermitteln_zellen_einfaerben.zip) auf meiner HP, Seite Beispiele m. VBA (http://excel-inn.de/vba_beispiele.htm) an - vielleicht hilft es dir weiter.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/" onclick="window.open(this.href);return false"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

WAL5
04.09.2012, 20:38
Hallo Karin,

ich habe mich für deine Variante entschieden. Diese habe ich soweit verstanden. Den Ansatz von GMG-CC leider nicht ;-)

Aber ich habe noch zwei kleine Probleme:
1. Ich bekomme die Umsetzung mit den vier Tagen im Voraus nicht hin. Theoretisch denke ich, das ich eine Zeile unter dem +4 auch noch einmal +4 einfüge. Aber das funktioniert nicht. Dann bekomme ich nur noch einen Namen meiner Liste angezeigt, obwohl ich mehrere (im Test) angezeigt bekommen müsste. Lasse ich die zweite +4 weg, werden mir alle angezeigt die bis zu 4 Tage zurück liegen. Setze ich sie an eine andere Stelle (zB hinter Day) bekomme ich ne Fehlermeldung. Ich habe herumprobiert, verstehe aber nicht wie ich wahrscheinlich "> Date" ändern muss.

Dim datDatum As Date ' Variable für das Datum
Dim lonZeile As Long ' Variable für die Zeile
Dim strNamen As String ' Variable für die Namen
lonZeile = 4
Do Until IsEmpty(Sheets("Personal- und Stammdaten").Cells(lonZeile, 4))
datDatum = Sheets("Personal- und Stammdaten").Cells(lonZeile, 4)
With Range(Sheets("Personal- und Stammdaten").Cells(lonZeile, 2), _
Sheets("Personal- und Stammdaten").Cells(lonZeile, 3))
' wenn das Datum mehr als 4 Tage
' - nach dem aktuellen Datum oder
' - vor dem aktuellen Datum liegt --> Nichts tun!
If CDate(Day(datDatum) & "." & Month(datDatum) & "." & Year(Date)) + 4 < Date Or _
CDate(Day(datDatum) & "." & Month(datDatum) & "." & Year(Date)) > Date Then
Else
If CDate(Day(datDatum) & "." & Month(datDatum) & "." & Year(Date)) = Date Then
' Vor- und Nachname von 'Treffern' auf die Variable schreiben
strNamen = strNamen & _
Sheets("Personal- und Stammdaten").Cells(lonZeile, 3) & " " & _
Sheets("Personal- und Stammdaten").Cells(lonZeile, 2) & vbLf
Else
strNamen = strNamen & _
Sheets("Personal- und Stammdaten").Cells(lonZeile, 3) & " " & _
Sheets("Personal- und Stammdaten").Cells(lonZeile, 2) & vbLf
End If
End If
End With
lonZeile = lonZeile + 1
Loop
If strNamen <> "" Then
MsgBox strNamen, vbInformation, "Heute haben Geburtstag:"
Else: End If

Meine zweite Frage:
In diesem und in einigen weiteren Codes findet sich oft "Sheets("Personal- und Stammdaten")".
Kann ich dafür nicht eine Konstante benennen und dann nur den Platzhalter einfügen?

In etwa so:
Dim wsPUS as Worksheet
wsPUS = Sheets("Personal- und Stammdaten")

Vielen Dank für die Hilfe,
beste Grüße,
Andreas


Ach, und noch ne dritte:
Ich möchte nach dem Namen noch das Alter einfügen. Das bekomme ich technisch soweit hin. Es hapert aber am Alter selbst. Dies wird in einer Zelle gleich hinter dem Datum berechnet und angezeigt.
Alle Versuche meinerseits mit Value lieferten bisher aber keine korrekten Ergebnisse und ich weiß nicht woran es liegt. Was ich bisher gelesen habe lese ich mit Value den angezeigten Wert aus! Oder doch nicht?

Beverly
04.09.2012, 20:58
Hi Andreas,

zu Frage 1 - ändere die Codezeile im Workbook_Open:
If CDate(Day(daDatum) & "." & Month(daDatum) & "." & Year(Date)) + 4 < Date Or _
CDate(Day(daDatum) & "." & Month(daDatum) & "." & Year(Date)) > Date + 4 Then
und die Codezeile im Worksheet_Change:
If CDate(Day(Target) & "." & Month(Target) & "." & Year(Date)) + 4 < Date Or _
CDate(Day(Target) & "." & Month(Target) & "." & Year(Date)) > Date + 4 Then

Zu Frage 2 - da du (richtiger Weise) die Variable als Worksheet(objekt) deklarierst, musst du sie über Set füllen, also:
Set wsPUS = Sheets("Personal- und Stammdaten")

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/" onclick="window.open(this.href);return false"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

WAL5
04.09.2012, 21:38
Hatta gemacht. Funktioniert!

:cool: Danke Karin

Hast Du noch meine dritte Frage gesehen? :upps:

Beverly
05.09.2012, 07:08
Hi Andreas,

ich nehme an, die 3. Frage hast du ergänzt, nachdem ich meinen vorhergehenden Beitrag geschreiben habe - aus diesem Grund konnte ich sie natürlich nicht sehen.
Allerdings kann ich daraus das eigentliche Problem nicht ableiten, da du nicht genau beschreibst, worin es besteht und was "Es hapert aber am Alter selbst" bedeutet, wenn das Alter doch schon in der Zelle steht.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/" onclick="window.open(this.href);return false"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

WAL5
05.09.2012, 09:01
Moin,

ja, du hast recht. Ich hab's später ergänzt.

Also, in meiner Tabelle stehen
B = Nachname
C = Vorname
D = Geb. Datum
E = Alter zum Jahresende errechnet aus 31.12.akt.Jahr-Geb.Datum

Auf dem Tabellenblatt wird das Alter korrekt errechnet.
Wenn ich nun das errechnete Alter aus der Spalte E (=5) abgreifen will mit
wsPUS.Cells(lonZeile, 5).Value
dann bekomme ich zwar vierstellige Zahlen, die vermutlich auch Jahreszahlen sind, aber die passen absolut nicht zum errechneten Alter...

Beverly
05.09.2012, 09:09
Hi Andreas,

in welcher Form ist denn die Zelle formatiert? Dieses Format müsstest du dann auch für die Anzeige verwenden - so auf die Art:

Format(wsPUS.Cells(lonZeile, 5).Value, "DeinFormat")

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/" onclick="window.open(this.href);return false"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

WAL5
05.09.2012, 09:30
Ja, Danke. Ein bisschen herumprobiert bis ich das richtige Format gefunden habe, aber jetzt wird das richtige Alter angezeigt.

Vielen Dank, Karin!!!! :mrcool: