Xtract: Eine Namen-Liste mit dem Geburtstag der jeweiligen Person soll so gefiltert werden, dass Tag-genau nur unter 30-Jährige ausgeben werden. Und die Schaltjahres-Problematik (Geburtstag 29.02.) ist auch gelöst.
Wissensstand: Level 3 ⇒ Excel GUT!, mindestens Basis-Kenntnisse in Power Query
In einem Forum wurde die Frage gestellt, wie es in Power Query mit möglichst wenig Aufwand machbar sei Geburtstagsdaten dergestalt zu filtern, dass nur Personen gezeigt werden, welche heute (!) jünger sind als 30 Jahre. Das bedeutet, dass der Filter dynamisch arbeiten muss. Als „erschwerend” kommt aus meiner Sicht noch hinzu, dass die Quelldaten in dem Fall als *.csv vorliegen und nach Möglichkeit in Excel selbst keine Zelle mit dem aktuellen Tagesdatum angelegt werden sollte. Auch die Altesgrenze sollte wohl nicht variabel sein (auch wenn das in PQ gut machbar ist).
Für die Realisierung dieser Aufgabe bietet es sich aus meiner Sicht an, eine bereits im Blog existierende Datei mit 1000 Namen und Geburtstagen zu verwenden, auch wenn es sich um keie *.csv sondern eine *.xlsx handelt; laden Sie dieses File gerne hier herunter.
Nach dem Import in den Power Query-Editor stellt sich vielleicht die Frage, ob es der „einfache” oder der etwas direktere Weg sein soll. Ich stelle Ihnen hier den aus meiner Sicht deutlich benutzerfreundlicheren Weg vor, da dieser auch für Einsteiger fast immer gut nachvollziehbar ist. An dieser Stelle gleich noch ein Hinweis: Nach dem Laden der Excel-Datei werden sie erkennen, dass die aktuelle Zelle C956 ist. Mit der dort verwendeten Formel wird erreicht, dass die Person genau heute Geburtstag hat, das Jahr wird durch die Funktion ZUFALLSBEREICH() festgelegt. Hier können Sie bei Bedarf natürlich auch eintragen, dass es genau 30 Jahre sein sollen und beim Filtervorgang entsprechend prüfen, ob das Filtrat ihren Vorstellungen entspricht. 😉
Nach kurzer Überlegung, wie dieses Problem mit den maximal 29 Jahren Alter anzugehen sei fiel mir ein, dass PQ ja die Möglichkeit bietet, in einer neuen Spalte das Alter direkt berechnen zu lassen. Das hörte sich gut an und „frisch ans Werk” habe ich gewohnheitsgemäß erst einmal das Format der Spalte Geburtstag auf Datum geändert, mich „nervt” einfach immer die Zeitangabe 00:00 Uhr. Wechsel zum Menü Spalte hinzufügen | Datum | Alter. Und das Ergebnis war durchaus ernüchternd: Error, Error, Error … Na gut, ein Klick in den Zellbereich rechts des Textes Error bringt dann diese Fehlermeldung auf den Schirm:
Aha … 😯 Verstehe ich nicht, denn zur Berechnung des Alters muss doch in jedem Fall eine Subtraktion (Operator -) durchgeführt werden. Und genau das hat doch Power Query auch getan. Zugegeben, es gehört schon einiges an Fantasie oder auch mehr als nur Basiswissen in Sachen Power Query dazu, um den eigentlichen Fehler zu erkennen. Was ja auffällig ist: Bei der Subtraktion der beiden kalendarischen Werte handelt es sich um zwei unterschiedliche Datentypen, nämlich Datum/Uhrzeit und (nur) Datum. Und genau das ist der Cassius Cactus. 🙂 Markieren Sie Geburtstag, gehen Sie im rechten Seitenfenster auf die Zeile Geänderter Typ, ändern Sie den Typ der Spalte auf Datum/Uhrzeit und wenn Sie anschließend auf die letzte Zeile bei Angewendete Schritte Klicken, ist die Fehlermeldung verschwunden.
Ich bin mit dem Ergebnis nicht wirklich zufrieden. Viele, auf den ersten Blick nicht wirklich aussagekräftige Zahlen. Nach kurzer Einschätzung (oder auch ihrem Wissen entsprechend) scheint es sich dabei um die Anzahl vergangener Tage seit dem Tag der Geburt zu handeln. Und so ist es! Wenn Sie nun über Transformieren | Datum & Uhrzeit | Dauer | Jahre gesamt gehen wird Ihnen ein Ergebnis ausgegeben, welches vor dem Dezimaltrenner die Jahre und danach die Tage als dezimal-numerischer Teil des Jahres ausgibt.
Ich empfinde diese Berechnungsweise nicht als empfehlenswert. Wenn Sie sich die jeweils durch Power Query verwendeten Funktionen/Formeln ansehen erkennen Sie, dass der Wert der Spalte Alter einfach nur durch 365 dividiert worden ist. Und das kann nicht das korrekte Ergebnis sein, denn es gibt schließlich auch noch Schaltjahre, welche 366 Tage haben. – Sollten Sie diese Ungenauigkeit nicht stören, könnten Sie natürlich Alter nach dem Wert kleiner 30 filtern und das in den meisten Fällen liegt das richtige Ergebnis vor. Dann noch die Spalte Alter löschen und Geburtstag idealerweise nur als Datum formatieren, dann ist eine suboptimale Lösung gegeben.
Besser ist es …
… Wenn Sie wirklich Tag-genau arbeiten, was ja auch gefordert war. Also idealerweise das Ganze noch einmal von vorne. Schließen Sie diese Übungsdatei (mit oder ohne zu speichern) und importieren Sie das File mit den Quelldaten wiederum in den Power Query-Editor. Und gleich zu Beginn sollten, nein müssen Sie eine Entscheidung treffen, wie sie mit dem Thema „Schaltjahre” umgehen wollen. Denn wenn jemand am 29. Februar Geburtstag hat und das aktuelle Jahr kein Schaltjahr ist, dann kann das am Tag nach dem 28. Februar zu Irritationen kommen. Yannick Schlosser (Tabellenblatt Zeile 173) ist solch ein „Kandidat”. Grundsätzlich bieten sich 2 Möglichkeiten:
- Der Geburtstag ist, also das neue Lebensjahr beginnt am letzten Tag des Monats oder
- in Nicht-Schaltjahren beginnt das neue Lebensjahr am 1. März, wie es auch in Plain Excel automatisch gehandhabt wird. Ich bevorzuge (auch in Power Query) die zweitgenannte Möglichkeit.
Okay, öffnen Sie noch einmal die 1000_Namen_mit_Geburtstagen.xlsx, die dann „jungfräulich” und als einzige Abfrage in den PQ-Editor importiert werden kann. Und weil mich das Datenformat in Geburtstag immer noch „nervt”, ändere ich dieses auf Datum (ich kann’s nicht lassen 😉 ). In jedem Fall muss ich nun eine Spalte erzeugen, wo das zu verwendende (eventuell korrigierte) Geburtsdatum drinnen steht. Also bei Yannik Schlosser soll es in diesem Jahr (2022) der 01.03.2000, in 2024 jedoch korrekterweise der 29.02.2000 sein. Sie könnten zwar eine zusätzliche Hilfsspalte anlegen wo ein Wahrheitswert ausgegeben wird, ob das aktuelle Jahr ein Schaltjahr ist oder nicht, aber das sorgt aus meiner Sicht nicht für wirklich mehr Transparenz. Also gleich eine neue Spalte mit dem Spaltennamen Geburtstag (berechnet) und dieser etwas komplexeren Formel anlegen:
if Date.IsLeapYear(DateTime.LocalNow()) then [Geburtstag] else if Date.ToText([Geburtstag], "dd.MM.")="29.02." then Date.AddDays([Geburtstag],1) else [Geburtstag]
Dass die Groß- Kleinschreibung exakt so sein muss, wissen Sie? Und eine kleine Erklärung bin ich Ihnen vielleicht doch schuldig, was die Formel betrifft. „Übersetzt” heißt das prinzipiell:
wenn das aktuelle Jahr ein Schaltjahr ist dann das Feld Geburtstag übernehmen, denn es gibt ja den 29. Februar ansonsten wenn der in Text konvertierte Geburtstag der 29.02. ist dann addiere zu Geburtstag 1 Tag ansonsten übernehme den Wert aus Geburtstag
Das Ergebnis sieht erst einmal recht gut aus. Und in Zeile 172 steht auch tatsächlich der 1. März als Datum. Oder…? Wirklich als Datentyp Datum? Nein, die gesamte Spalte ist vom Datentyp Beliebig. Und da im nächsten Schritt das Alter abgeglichen werden soll, passen Sie den Datentyp der Spalte auch auf Datum/Zeit an.
Noch einmal die Ursprungsfrage: Ist die jeweilige Person heute jünger als 30 Jahre? Dass das nicht mit der Funktionalität Datum | Alter geht, haben Sie ja bereits festgestellt. Aber Power Query bietet auch hier eine gute Möglichkeit, in einer Benutzerdefinierten Spalte das korrekte Ergebnis darzustellen. Als Spaltenüberschrift nehme ich Jünger 30 Jahre und die Formel ist hier recht übersichtlich:
Date.AddYears(DateTime.LocalNow(), -30) < [#"Geburtstag (kalkuliert)"]
Das Ergebnis ist naturgemäß TRUE oder FALSE und wenn Sie dann diese Spalte nach TRUE filtern, können Sie die beiden letzten Spalten (Geburtstag (kalkuliert) und Jünger 30 Jahre?) gerne löschen; es werden nur die Namen mit den realen Geburtstagen der unter 30-jährigen angezeigt. Die Aufgabe ist gelöst.
Rückmeldungen / Feedback gerne per Mail an mich (G.Mumme@Excel-ist-sexy.de)
Hat Ihnen der Beitrag gefallen?
Erleichtert dieser Beitrag Ihre Arbeit?
Dann würde ich mich über einen Beitrag Ihrerseits z.B. 2,50 € freuen … (← Klick mich!)