Taggenaue Altersberechnung
#1
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?
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#2
Hi

Versuch es mal mit 365,25

Gruß Elex
[-] Folgende(r) 1 Nutzer sagt Danke an Elex für diesen Beitrag:
  • Klaus-Dieter
Antworten Top
#3
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
[-] Folgende(r) 1 Nutzer sagt Danke an Sigi.21 für diesen Beitrag:
  • Klaus-Dieter
Antworten Top
#4
Hi Klaus-Dieter,

CInt rundet ab 0,5 auf - nimm einfach nur Int.
[-] Folgende(r) 1 Nutzer sagt Danke an {Boris} für diesen Beitrag:
  • Klaus-Dieter
Antworten Top
#5
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.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#6
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
[-] Folgende(r) 1 Nutzer sagt Danke an Sigi.21 für diesen Beitrag:
  • Klaus-Dieter
Antworten Top
#7
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.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste