Hi,
hat jemand eine Idee wie man einen gescheiten Geburtstagserinnerer prgrammieren kann?
Es soll so es funktionieren:
Option Explicit
' in dieser Struktur wird die
' Zeitdifferenz gespeichert
Public Type tDateDiff
Years As Long
Months As Long
Days As Long
End Type
Public Function GetDateDiff(ByVal vDateBegin As Variant, _
ByVal vDateEnd As Variant) As tDateDiff
' Hilfsvariable
Dim vTemp As Variant
' Datums-Werte nach Typ DATE umwandeln
vDateBegin = CDate(vDateBegin)
vDateEnd = CDate(vDateEnd)
With GetDateDiff
.Years = 0
.Months = 0
.Days = 0
' Als erstes ermitteln wir die Jahre mit der DateDiff-Funktion.
' Da diese aber sagt, dass es 2 Jahre sind, egal ob wir z.B.
' von Januar 2000 bis Dezember 2002 eingeben oder
' von Dezember 2000 bis Januar 2002, ermitteln wir lieber die
' Monate.
' Beispiel: von "10.02.2001" bis "31.12.2003"
.Months = DateDiff("m", vDateBegin, vDateEnd)
' Die Monate rechnen wir in Jahre plus Monate um
.Years = Int(.Months / 12)
.Months = .Months - (.Years * 12)
' Ergibt 2 Jahre und 10 Monate
' Jetzt brauchen wir noch die Tage. Dazu addieren wir unsere
' ermittelten Jahre zum Anfagsdatum hinzu.
' Beispiel: "10.02.2001" + 2 Jahre = "10.02.2003"
vTemp = DateAdd("yyyy", .Years, vDateBegin)
' und dann die ermittelten Monate: + 10 Monate = "10.12.2003"
vTemp = DateAdd("m", .Months, vTemp)
' Wir berechnen die Tage zwischen dem so gewonnenen
' Hilfsdatum und dem EndDatum.
' von "10.12.2003" bis "31.12.2003" = 21 Tage. Stimmt.
.Days = DateDiff("d", vTemp, vDateEnd)
' Ist die Tagesangabe des Anfangsdatum jedoch höher als die
' des Enddatums, z.B. "10.02.2001" bis "01.12.2003", so
' bekämen wir eine negative Anzahl-Tage heraus: -9 Tage
' Also ziehen wir einfach von der ermittelten Anzahl-Monate
' einen ab und wandeln ihn in Tage um. Schon stimmt wieder
' alles.
If .Days < 0 Then
.Months = .Months - 1
vTemp = DateAdd("yyyy", .Years, vDateBegin)
vTemp = DateAdd("m", .Months, vTemp)
.Days = DateDiff("d", vTemp, vDateEnd)
End If
End With
End Function und das habe ich in der Prozedur geschreiben (Verwende eine andere Tabelle!!)
Dim row As Integer
For row = 1 To List1.RowsCount
vDateBegin = Format$(List1.ItemText(row, 6), "dd.mm.yyyy")
tDiff = GetDateDiff(vDateBegin, vDateEnd)
With tDiff
If CStr(.Months) = "0" And (CStr(.Days) <= "3") Then
MsgBox "" & List1.ItemText(1, 1) & ", " & List1.ItemText(1, 2) & " hat in " & _
.Days & " Tag(en) Geburtstag." & vbCrLf & _
"Er wird " & .Years + 1 & " Jahre alt.", vbInformation + vbSystemModal + _
vbOKOnly, "Geburtstags-Erinnerung"
End If
End With
Next row Schon jetzt danke ich euch für euere Ideen.
Gruß
jogi15 |