Clever-Excel-Forum

Normale Version: Taggenaue Altersberechnung
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen, 

folgendes Problem treibt mich um: ich möchte per VBA das Alter von Personen Taggenau ausrechnen. Diese Programmzeile liefert mir aber ein offenbar aufgerundetes Ergebnis: CInt((VBA.Date - Tabelle1.Cells(lngR, 6)) / 365)

Die Daten mit denen ich in meinem Beispiel gearbeitet habe sind der 06.08.2000 als Geburtstag. So steht es auch in der Adresse Tabelle1.Cells(lngR, 6). Das erwartete Ergebnis wäre 21 Jahre, VBA gibt mir aber 22 Jahre aus. Per Zellformel sieht das bei mir so aus:

Tabelle1

AB
1
206.08.200021
3
Formeln der Tabelle
ZelleFormel
B2=GANZZAHL((HEUTE()-A2)/365)

Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8

Auch die Tabellenfunktion von DATEDIF liefert 21 Jahre, die VBA-Version DATEDIFF kommt dagegen wieder auf 22 Jahre. 

Bin da da auf irgend einem falschen Dampfer?
Hi

Versuch es mal mit 365,25

Gruß Elex
Hallo Klaus-Dieter,

die Excel-Fkt. "DATEDIF"  und vba-Fkt "DATEDIFF"  ticken unterschiedlich!
Diese beiden kannst du nicht in gleicher Weise verwenden. 

Warum das so ist, weiß ich nicht. Aber es ist so.

Gruß Sigi
Hi Klaus-Dieter,

CInt rundet ab 0,5 auf - nimm einfach nur Int.
Hallo Boris,


vielen Dank, da hätte ich ja auch selbst drauf kommen können.

@ Sigi: dann war mein Eindruck also richtig. Da die Funktion schon lange nicht mehr dokumentiert ist, wird man das wohl auch nicht mehr heraus finden.

Hallo Elex,

das Problem mit den Schaltjahren ist mir schon klar, da es hier aber um relativ junge Leute geht, habe ich das vernachlässigt.
Hallo,

beim Ermitteln des Alters sollte man auch daran denken, dass Kunden/Vereinsmitglieder, etc. ja auch sterben können. In so einem Falls sollten sie in einer Datenbank auch nicht mehr älter werden, als wie am Sterbetag.
Da bietet sich eine VBA-Fkt. an, mit optionalem Sterbedatum:

Function Alter(GebDat As Date, Optional SterbeDat As Variant) As Long
Dim gd As Long, td As Long, J As Long
    If GebDat < Date Then
        If Not IsMissing(SterbeDat) Then
            If SterbeDat > 60 And SterbeDat >= GebDat And Date >= SterbeDat Then
                gd = Month(GebDat) * 100 + Day(GebDat)
                td = Month(SterbeDat) * 100 + Day(SterbeDat)
                J = Year(SterbeDat) - Year(GebDat)
            Else
                gd = Month(GebDat) * 100 + Day(GebDat)
                td = Month(Date) * 100 + Day(Date)
                J = Year(Date) - Year(GebDat)
            End If
        Else
            gd = Month(GebDat) * 100 + Day(GebDat)
            td = Month(Date) * 100 + Day(Date)
        End If
        Alter = J - IIf(td < gd, 1, 0)
    Else
        Alter = 0
    End If
End Function


Gruß Sigi
Hallo Sigi,

vielen Dank auch für diesen Hinweis. In meinem aktuellen Fall ist das aber nicht relevant, da es sich um eher jugendliche Personen handelt. Es geht auch nicht um einen Verein oder ähnliches. In diesem Fall werden die Daten nach Abschluss der Vorgänge wieder gelöscht.