Noch ?? Tage bis zum Geburtstag

Anzahl der Tage bis zum Termin

Die Auf­gabe scheint ganz ein­fach zu sein: „Wie viele Tage sind es noch bis zum näch­sten Geburt­stag?” Solch eine Tabelle ist rasch angelegt und im Prinzip heißt das ja:
Tag_Der_Geburt_Aktuelles_JahrHEUTE().

Das haut aber nur im Prinzip hin, näm­lich immer nur dann, wenn der diesjährige Geburt­stag noch in der Zukun­ft liegt. In diese Datei habe ich das Geburts­da­tum in Zelle B2 so gelegt, dass das Ergeb­nis garantiert kor­rekt ist. Aber der Geburt­stag ist ja nicht immer Sil­vester, er muss dur­chaus öfter ein­mal angepasst wer­den …  😛

Für die Lösung bieten sich mehrere Möglichkeit­en an. In Zeile 2 der Tabelle sind alle Werte von Hand eingegeben, was zwar zum gewün­scht­en Erfolg führt aber nicht wirk­lich sin­nvoll ist. Hier muss dann natür­lich auch noch beachtet wer­den, dass das Jahr immer so angepasst wird, dass der näch­ste Geburt­stag garantiert in der Zukun­ft liegt. Damit gilt: Unbrauch­bar.

Ein gewiss­er „Automa­tismus” ist in Zeile 3 ver­wirk­licht. Hier wird auf den eigentlichen Geburt­stag in Zelle B2 Bezug genom­men und das aktuelle Jahr für die Berech­nung der Dif­ferenz per Funk­tion erset­zt. Aber auch diese Formel krankt daran, dass der diesjährige Geburt­stag eventuell noch nicht gewe­sen ist. Wenn Sie näm­lich das Datum in B2 ändern, kann es zu ein­er unan­genehmen Über­raschung kom­men.

Hin­weis: Der in dieser und den fol­gen­den Zeilen ver­wen­dete Bezug auf den Geburt­stag in Zelle B2 ist der Über­sicht und Klarheit hal­ber mit einem Bere­ich­sna­men (Geb­Tag) ver­wirk­licht wor­den. Beacht­en Sie aber unbe­d­ingt, dass Sie sin­nvoller­weise die Zel­ladressen ver­wen­den, wenn Sie die Formel nach unten kopieren (obwohl es auch unter gewis­sen Bedin­gun­gen mit einem Bere­ich­sna­men geht).

In Zeile 4 ist die Grund­lage die gle­iche wie vorher, aber ich habe eine andere Berech­nungsmeth­ode ver­wen­det. Statt der Sub­trak­tion der bei­den kalen­darischen Dat­en ist die Funk­tion Date­Dif() ver­wen­det wor­den. Diese hat beispiel­sweise den Vorteil, dass auch eine Aus­gabe wie „3 Monate 9 Tage” möglich ist. – Da an der Grund­lage bezüglich der Ein­schränkung, dass der Geburt­stag in diesem Jahr noch fol­gt nichts verän­dert wurde, kann auch diese Formel zu Fehlern führen. Im Fehler­fall wäre dann eine Fehler­mel­dung #ZAHL! fäl­lig. Pro­bieren Sie es ein­fach ein­mal aus … In der Musterta­belle ist das gut nachzu­vol­lziehen.

Die erste Formel, die wirk­lich funk­tion­iert, sehen Sie in Zeile 5. Egal, ob dieses Jahr der Geburt­stag schon war, heute ist oder noch fol­gt, das Ergeb­nis stimmt. Die Formel ist so gestal­tet, dass ein Jahr dazu addiert wird, wenn der Geburt­stag in diesem Jahr bere­its gewe­sen ist. Das wird mit ein­er WENN()-Funk­tion real­isiert. Dadurch wird die Formel zwar etwas länger aber ist für viele User etwas trans­par­enter, über­sichtlich­er. Dieser Teil der Formel ist dafür ver­ant­wortlich:

+WENN(DATUM(JAHR(HEUTE());MONAT(GebTag);TAG(GebTag))<HEUTE();1;0)

Dort wird Monat und Tag des Geburt­stages in das aktuelle Jahr trans­feriert und dann ver­glichen, ob dieses gener­ierte Datum klein­er ist, als der heutige Tag. Wenn das der Fall ist, dann wird der Geburt­stag des näch­sten Jahres zur Berech­nung ver­wen­det.

▲ nach oben …

Details dazu: -> über­lesen

Der Teil der Formel begin­nt mit einem Plus. Das bedeutet, es wird etwas (zur Jahreszahl) addiert. Dann fol­gt die WENN-Bedin­gung. Trifft diese zu, dann wird der Wert 1 addiert, son­st 0. Die Bedin­gung selb­st ist wiederum eine ver­schachtelte Funk­tion. Mit DATUM() wird ein Excel-Datum aus den drei Kom­po­nen­ten JAHR(), MONAT() und TAG() zusam­men geset­zt.

  • JAHR(HEUTE()) ist naturgemäß immer das aktuelle Jahr.
  • MONAT(GebTag) gibt den Monat des Datum­swertes zurück, der in der Zelle mit dem Bere­ich­sna­men Geb­Tag ste­ht. Sie wer­den vielle­icht in vie­len Fällen die tat­säch­liche Adresse, hier B3 eingeben. Den­noch hat der Bere­ich­sname seinen Charme, er ist „sprechend”.
  • TAG(GebTag) ist prak­tisch das Gle­iche wie vor, nur wird der Tag zurück gegeben.

Mit dieser Funk­tion und den drei Argu­menten ist ein Excel-Datum berech­net wor­den, welch­es dem Geburt­stag im aktuellen Jahr entspricht. Mit anderen Worten und stark vere­in­facht sagt die Formel nun fol­gen­des aus:

+ WENN(GeburtstagDiesesJahr < HEUTE();1;0)

Also: Wenn der Geburt­stag dieses Jahres in der Ver­gan­gen­heit liegt (weil klein­er als Heute), dann Plus_1, son­st Plus_0. – Und da dieser Teil der Formel ja wiederum ein Teil ein­er anderen Formel ist, wird nun ‑aus­ge­hend vom aktuellen Datum- berech­net, welch­es der näch­ste Geburt­stag ist.

Zugegeben, das Ganze ist nicht wirk­lich leicht. Aber wenn Sie Schritt für Schritt vor­ange­hen, die Formel in Blöck­en analysieren wie eben für einen Teil geschehen und das auch mehrfach wieder­holen, dann wer­den Sie auch ver­ste­hen, wie das Ganze zus­tande kommt.

▲ nach oben …

Vom Prinzip her gle­ich aber ohne die WENN()-Funk­tion arbeit­et die Formel in Zeile 6. Dort wird per Logik aus­gew­ertet, ob der Geburt­stag schon gewe­sen ist oder nicht:

+(DATUM(JAHR(HEUTE());MONAT(GebTag);TAG(GebTag))<HEUTE())

Dort wird „behauptet”, dass der diesjährige Geburt­stag klein­er ist als der heutige Tag. Das ist entwed­er WAHR oder FALSCH. Da intern WAHR als 1 und FALSCH als 0 gew­ertet wird, addiert Excel den entsprechen­den numerischen Wert. Für Excel-Freaks ist das gewiss klar­er und „bess­er”, aber nicht für jeden sofort ein­se­hbar.

Last but not least wird die eben dargelegte Formel in Zeile 7 so umgestellt, dass die Date­Dif()-Funk­tion zum Ein­satz kommt. Dadurch kann die Vari­abil­ität etwas erhöht wer­den. Das ist aber Geschmackssache.

Natür­lich lässt sich das Ganze auch mit VBA (also per Makro) berech­nen, dazu fügen Sie den fol­gen­den Code in ein Mod­ul dieser Mappe ein:

Option Explicit

Function RestTageGebTag(GebTag As Date) As Integer
   Dim GT As Date
   GT = DateSerial(Year(Date), Month(GebTag), Day(GebTag))
   If GT < Date Then GT = DateSerial(Year(Date) + 1, _
    Month(GebTag), Day(GebTag))
   RestTageGebTag = GT - Date
End Function

Auch hier ist es naturgemäß wichtig, dass die Zelle mit dem Geburt­stag ein kor­rek­tes Datum enthält. Diese Funk­tion (UDF) ist nicht in der Datei enthal­ten. Der Aufruf erfol­gt so: =RestTageGebTag(B2) und als Ergeb­nis wird die Anzahl der Tage bis zum näch­sten Geburt­stag zurück gegeben.

▲ nach oben …

Noch ein­mal zurück zu den reinen Excel-Funk­tio­nen ohne VBA. Schauen Sie sich ein­fach ein­mal die Zeilen 9 :11 an. Es ist gewiss nicht leicht, hin­ter das Geheim­nis zu kom­men, warum das läuft.

Ich beginne ein­mal mit der Funk­tion EDATUM(). Damit wird eine als Argu­ment übergebene Anzahl von Monat­en zum Aus­gangs­da­tum hinzu addiert. Soweit, so gut. Es muss nur noch irgend­wie fest­gestellt wer­den, ob der Geburt­stag im laufend­en Jahr schon war, heute ist oder noch kommt. Im erst­ge­nan­nten Fall müssen 12 Monate zum Tag der Geburt dieses Jahres hinzu gerech­net wer­den, dann lässt sich die kor­rek­te Dif­ferenz berech­nen.

So weit, so klar. Bleibt das unbekan­nte Geb­TagDJ. Das ist meine Abkürzung für „Geburt­stag Dieses Jahr” und ist ein berech­neter Wert. Dieser Name ste­ht stel­lvertre­tend für den berech­neten Geburt­stag im aktuellen Jahr. Geben Sie ein­fach in eine Zelle =Geb­TagDJ ein und for­matieren Sie die Zelle als Datum.

Und woher „weiß” Excel diesen Wert? Es kann sich ja nicht um eine Funk­tion han­deln, denn es fehlen ja die für eine Funk­tion typ­is­chen Klam­mern(). Zugegeben, etwas tricky gemacht. Ich habe über den Namensman­ag­er den Namen Geb­TagDJ deklar­i­ert und auch gle­ich einen passenden Wert berech­nen lassen. Der Aufwand lohnt gewiss nicht für eine einzige Formel, aber wenn ich so etwas in der Mappe öfter brauche oder eine Berech­nung etwas ver­schleiern will, dann ist das ganz hil­fre­ich.

Gle­icher­maßen habe ich den Namen GenJ erstellt und einen Wert zugewiesen. Es wird ein logis­ch­er Wert berech­net, ob Geburt­stag erst näch­stes Jahr ist. Und wenn ich WAHR als Mul­ti­p­lika­tor ver­wende, dann rech­net Excel mit 1, FALSCH entspricht 0. In Zeile 11 wäre das dann so, dass entwed­er 12*1 (also 12) Monate dazu addiert wer­den, falls der Geburt­stag schon war oder 12*0 also kein Monat dazu addiert wird, wenn der Geburt­stag heute ist oder dieses Jahr noch kommt.

[NachOben­Let­zte Verweis=„ML: noch ?? Tage bis …”]
Dieser Beitrag wurde unter Datum und Zeit, Musterlösungen, Ohne Makro/VBA abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.