von bis Datum in Jahre, Mon, Woch, Tage

Bild

Betrifft: von bis Datum in Jahre, Mon, Woch, Tage von: rlenz
Geschrieben am: 06.02.2005 10:33:23

Hallo Excelfreunde,
weil die Funktion DATEDIF fehlerhaft ist, habe ich für die Berechnung von Jahren, Monaten, Wochen und Tagen von einem Datum, bis zu einem Datum eigene Formeln erstellt. Mit entsprechend abgeänderten Formeln lassen sich natürlich auch zum Beispiel nur ganze Monate berechnen.
----------------------------------------------------
Ich möchte nun wissen ob meine Formeln richtig sind. Kann jemand mit VBA- Kenntnissen diese Formeln als Funktionen bereitsellen?
----------------------------------------------------
Das Add-In "Analyse-Funktion" muss installiert sein.
Finazmathematische oder kaufmännische Berechnungen sind ausgeschlossen. Ich habe eine kleine Datei die auch falsche DATEDIF Ergebnisse enthält. https://www.herber.de/bbs/user/17535.xls

Mit freundlichen Grüßen

Ruediger Lenz

Bild


Betrifft: AW: von bis Datum in Jahre, Mon, Woch, Tage von: Sigi
Geschrieben am: 06.02.2005 11:38:38

Hallo Ruediger,

ich hab' mir deine Mappe nicht im Detail angeschaut und kann daher zu deinen Formeln
nichts aussagen. Aber falls du eine VBA-Funktion suchst, die vergleichbares liefert,
dann hab' ich vielleicht was für dich ...

Function ZeitDifferenz(Von As Date, Bis As Date, Typ As Long) As String
Dim dblWert As Double
Dim intWert As Long
Dim Start As Date
Dim Ende As Date
Dim Jahre As Long
Dim Monate As Long
Dim Wochen As Long
Dim Tage As Long
Dim Tage2 As Long
Dim Zeit As Date
Dim Stunden As Long
Dim Minuten As Long
Dim Sekunden As Long
Dim Txt As String
Application.Volatile
If Von < Bis Then
Start = CDate(Int(Von))
Ende = CDate(Int(Bis))
dblWert = CDbl(Bis) - CDbl(Von)
dblWert = WorksheetFunction.Round(dblWert, 8)
intWert = Int(dblWert)
Zeit = CDate(dblWert - intWert)
If intWert < (Ende - Start) Then
Ende = Ende - 1
End If
If Month(Ende) > Month(Start) Then
Jahre = Year(Ende) - Year(Start)
ElseIf Month(Ende) < Month(Start) Then
Jahre = Year(Ende) - Year(Start) - 1
ElseIf Day(Ende) >= Day(Start) Then
Jahre = Year(Ende) - Year(Start)
ElseIf Day(Ende) < Day(Start) Then
Jahre = Year(Ende) - Year(Start) - 1
End If
If Month(Ende) > Month(Start) And Day(Ende) >= Day(Start) Then
Monate = Month(Ende) - Month(Start)
ElseIf Month(Ende) > Month(Start) And Day(Ende) < Day(Start) Then
Monate = Month(Ende) - Month(Start) - 1
ElseIf Month(Ende) < Month(Start) And Day(Ende) >= Day(Start) Then
Monate = (12 + Month(Ende)) - Month(Start)
ElseIf Month(Ende) < Month(Start) And Day(Ende) < Day(Start) Then
Monate = (12 + Month(Ende)) - Month(Start) - 1
ElseIf Month(Ende) = Month(Start) And Day(Ende) >= Day(Start) Then
Monate = 0
ElseIf Month(Ende) = Month(Start) And Day(Ende) < Day(Start) Then
Monate = 11
End If
If Day(Ende) >= Day(Start) Then
Tage = Day(Ende) - Day(Start)
ElseIf Day(Ende) < Day(Start) Then
Tage = TageDesMonats(Month(Start), Year(Start)) - Day(Start) + Day(Ende)
End If
Wochen = Tage \ 7
Tage2 = Tage - (Wochen * 7)
Stunden = Hour(Zeit)
Minuten = Minute(Zeit)
Sekunden = Second(Zeit)
End If
If Typ = 0 Then
Txt = Jahre & "'J " & Monate & "'M " & Tage & "'T " & _
Format(Zeit, "hh:mm:ss") & "*"
ElseIf Typ = 1 Then
If Jahre = 1 Then
Txt = "1 Jahr,"
Else
Txt = Jahre & " Jahre,"
End If
If Monate = 1 Then
Txt = Txt & " 1 Monat,"
Else
Txt = Txt & " " & Monate & " Monate,"
End If
If Tage = 1 Then
Txt = Txt & " 1 Tag,"
Else
Txt = Txt & " " & Tage & " Tage,"
End If
If Stunden = 1 Then
Txt = Txt & " 1 Stunde,"
Else
Txt = Txt & " " & Stunden & " Stunden,"
End If
If Minuten = 1 Then
Txt = Txt & " 1 Minute,"
Else
Txt = Txt & " " & Minuten & " Minuten,"
End If
If Sekunden = 1 Then
Txt = Txt & " 1 Sekunde,"
Else
Txt = Txt & " " & Sekunden & " Sekunden,"
End If
ElseIf Typ = 2 Then
If Jahre = 1 Then
Txt = "1 Jahr,"
ElseIf Jahre > 1 Then
Txt = Jahre & " Jahre,"
End If
If Monate = 1 Then
Txt = Txt & " 1 Monat,"
ElseIf Monate > 1 Then
Txt = Txt & " " & Monate & " Monate,"
End If
If Tage = 1 Then
Txt = Txt & " 1 Tag,"
ElseIf Tage > 1 Then
Txt = Txt & " " & Tage & " Tage,"
End If
If Stunden = 1 Then
Txt = Txt & " 1 Stunde,"
ElseIf Stunden > 1 Then
Txt = Txt & " " & Stunden & " Stunden,"
End If
If Minuten = 1 Then
Txt = Txt & " 1 Minute,"
ElseIf Minuten > 1 Then
Txt = Txt & " " & Minuten & " Minuten,"
End If
If Sekunden = 1 Then
Txt = Txt & " 1 Sekunde,"
ElseIf Sekunden > 1 Then
Txt = Txt & " " & Sekunden & " Sekunden,"
End If
ElseIf Typ = 3 Then
If Jahre = 1 Then
Txt = "1 Jahr,"
Else
Txt = Jahre & " Jahre,"
End If
If Monate = 1 Then
Txt = Txt & " 1 Monat,"
Else
Txt = Txt & " " & Monate & " Monate,"
End If
If Wochen = 1 Then
Txt = Txt & " 1 Woche,"
Else
Txt = Txt & " " & Wochen & " Wochen,"
End If
If Tage2 = 1 Then
Txt = Txt & " 1 Tag,"
Else
Txt = Txt & " " & Tage2 & " Tage,"
End If
If Stunden = 1 Then
Txt = Txt & " 1 Stunde,"
Else
Txt = Txt & " " & Stunden & " Stunden,"
End If
If Minuten = 1 Then
Txt = Txt & " 1 Minute,"
Else
Txt = Txt & " " & Minuten & " Minuten,"
End If
If Sekunden = 1 Then
Txt = Txt & " 1 Sekunde,"
Else
Txt = Txt & " " & Sekunden & " Sekunden,"
End If
Else
If Jahre = 1 Then
Txt = "1 Jahr,"
ElseIf Jahre > 1 Then
Txt = Jahre & " Jahre,"
End If
If Monate = 1 Then
Txt = Txt & " 1 Monat,"
ElseIf Monate > 1 Then
Txt = Txt & " " & Monate & " Monate,"
End If
If Wochen = 1 Then
Txt = Txt & " 1 Woche,"
ElseIf Wochen > 1 Then
Txt = Txt & " " & Wochen & " Wochen,"
End If
If Tage2 = 1 Then
Txt = Txt & " 1 Tag,"
ElseIf Tage2 > 1 Then
Txt = Txt & " " & Tage2 & " Tage,"
End If
If Stunden = 1 Then
Txt = Txt & " 1 Stunde,"
ElseIf Stunden > 1 Then
Txt = Txt & " " & Stunden & " Stunden,"
End If
If Minuten = 1 Then
Txt = Txt & " 1 Minute,"
ElseIf Minuten > 1 Then
Txt = Txt & " " & Minuten & " Minuten,"
End If
If Sekunden = 1 Then
Txt = Txt & " 1 Sekunde,"
ElseIf Sekunden > 1 Then
Txt = Txt & " " & Sekunden & " Sekunden,"
End If
End If
If Len(Txt) > 0 Then
Txt = Left(Txt, Len(Txt) - 1)
Txt = Trim(Txt)
End If
ZeitDifferenz = Txt
End Function
Private Function TageDesMonats(Monat As Long, Jahr As Long) As Long
Dim Tage As Long
    Select Case Monat
        Case 1, 3, 5, 7, 8, 10, 12
            Tage = 31
        Case 4, 6, 9, 11
            Tage = 30
        Case 2
            If IstSchaltjahr(Jahr) Then
                Tage = 29
            Else
                Tage = 28
            End If
    End Select
TageDesMonats = Tage
End Function

Private Function IstSchaltjahr(Jahr As Long) As Boolean
   If (Jahr Mod 4 = 0 And Jahr Mod 100 <> 0) Or _
        (Jahr Mod 400 = 0) Then IstSchaltjahr = True
End Function


Für die Ausgabe gibt's die Typen 0 bis 4!

Gruß
Sigi


Bild


Betrifft: AW: von bis Datum in Jahre, Mon, Woch, Tage von: rlenz
Geschrieben am: 06.02.2005 17:11:07

Hallo Sigi,
vielen Dank für die schnelle Antwort. In der Erstellung der Funktionen steckt, wie ich es beurteilen darf, eine Menge Arbeit.
Ich habe die Funktion von Hand nachberechnet. Habe ich da etwas falsch gemacht? Vielleicht hast du doch mal die Zeit Vergleiche >auch< mit den Zwischenergebnissen wie Monate, Wochen oder Tage anzustellen. Dazu nachfolgende Datei:

https://www.herber.de/bbs/user/17544.xls

In Excel 9, also Excel 2000 gibt es die Funktion Edate im Add-In Manager "Analyse-Funktionen-VBA". Eigentlich könnte man damit doch von einem Datum aus bis zum Enddatum oder auch darüber mit Hilfe einer Schleife '''Anfangsdatum +1'''ein Edatum und damit Monate berechnen. Ist das errechnete Edate größer als das Enddatum, ziehe ich die Zahl 1 ab (1 für 1 Monat). Leider habe ich nur absolut wenig Kenntnisse von VBA, das vorher Erwähnte, wenn es denn machbar ist, wäre doch u.U. ein Lösungsversuch wert.

Vielleicht ist die konsequente "Übersetzung" in VBA meiner Formeln auch eine Möglichkeit zur Berechnung.

Ich bin wirklich sehr interessiert.

Mit freundlichen Grüßen

Ruediger Lenz
http://www.ruediger-lenz.de




 Bild

Beiträge aus den Excel-Beispielen zum Thema "von bis Datum in Jahre, Mon, Woch, Tage"