PQQ: Jahreskalender mit Power Query erstellen (2)

Power Query Quickies: Einen Jahreskalender automatisch erstellen lassen

Auch in Pow­er Query gibt es mehrere Wege, einen Jahreskalen­der automa­tisch erstellen zu lassen. In jedem Falle wer­den Sie dazu Funk­tio­nen der Abfrage­sprache M ein­set­zen. Und den­noch brauchen Sie keine Pro­gram­mi­er-Erfahrung, wenn die hier dargelegten Schritte exakt nachvol­lziehen. Ein grundle­gen­der Hin­weis vor­weg: Acht­en Sie unbe­d­ingt darauf, die Groß- Klein­schrei­bung genau so zu schreiben, wie hier im Beitrag dargestellt.

(2) Die Funktion List.Range()

Zugegeben, das ist in den meis­ten Fällen nur die zweite Wahl für diesen Zweck. Der haupt­säch­liche Grund, warum diese Möglichkeit so gut wie nie genutzt wird: Sie arbeit­en nicht mit dem Daten­typ Datum son­dern mit dem Daten­typ Ganze Zahl, also mit dem seriellen Wert des Datums. Wenn Sie mehr zum The­ma serielle Zahl/Datum wis­sen möcht­en, schauen Sie gerne hier nach. Trotz dieses schein­baren Hand­i­caps hat diese Funk­tion dur­chaus ihre Berech­ti­gung; angenom­men Sie wollen beispiel­sweise jew­eils 7 Tage vor und nach dem Beginn des Kalen­der- oder Geschäft­s­jahres in die zu erstel­lende Tabelle ein­fü­gen, dann kann diese Funk­tion ganz prak­tisch sein. Aber auch wenn Sie ‑aus welchen Grün­den auch immer- in den Roh-Dat­en oder den Import-Dat­en im Edi­tor schon die seriellen Zahlen statt eines „typ­is­chen” Datums ste­hen haben.

Sagt Ihnen die Zahl 43101 etwas? Sie wer­den sich nach diesem Vorge­plänkel vielle­icht, ja sog­ar wahrschein­lich denken kön­nen, dass es sich um die serielle Zahl eines Datums han­delt. Und so ist es auch. Dieser Wert entspricht dem 1. Jan­u­ar 2018. Ich stelle Ihnen hier ganz ein­fach ein­mal die List.Range() Formel vor, welche Sie für einen „nor­malen” Jahreskalen­der per Pow­er Query nutzen wür­den:
List.Range({43101..43101 + 364}, 0)
… und sie wer­den gewiss erst ein­mal etwas irri­tiert sein. Die Syn­tax, die Schreib­weise ist doch etwas anders, als typ­isch für eine Excel-Anwen­dung. Ich zitiere hier erst ein­mal aus der (englis­chen) Online­hil­fe zu dieser Funk­tion:
List.Range(list as list, off­set as num­ber, option­al count as num­ber) as list

Wie bere­its erwäh­nt, gewöh­nungs­bedürftig … 😉 Der Funk­tion­sname List.Range gefol­gt von der öff­nen­den run­den Klam­mer sollte vom Prinzip her klar sein. Das näch­ste Argu­ment ist list as list, also die Liste im For­mat ein­er PQ-Liste.

Aha … 🙄

Dazu ist es wichtig zu wis­sen, dass eine Pow­er Query-Liste in den Formeln und Funk­tio­nen der Sprache M stets von geschweiften Klam­mern einge­fasst eingegeben wird. Und wenn Sie jet­zt die aufgezeigte Beispiel-Formel als Ver­gle­ich her­anziehen wer­den Sie fest­stellen, dass dort als Liste ste­ht: {43101..43101+364} was über­set­zt heißt: Die Liste startet mit dem Wert 43101 und endet mit dem Wert 43101 +364. Die bei­den Punk­te zwis­chen dem Anfangs-und Endw­ert wer­den genau­so eingegeben und sind das verbindende Ele­ment. Und die geschweiften Klam­mern geben Sie über Alt­Gr7 und Alt­Gr0 ein. Als zweites Argu­ment nach dem Kom­ma fol­gt in der Formel eine 0, was in der Syn­tax als Off­set beschrieben ist. Das bedeutet, dass am Start 0 (keine) Werte über­sprun­gen wer­den. Und vielle­icht denken Sie nun, dass ich in der Formel beim zweit­en Teil der Liste einen Schreibfehler drin habe, näm­lich statt 365 den Wert 364 geschrieben habe.

Nein, das ist kein Tippfehler! Für reine Excel-Anwen­der ist das gewiss irri­tierend. Wenn Sie aber schon mit Pro­gram­mier­sprachen außer­halb VBA gear­beit­et haben, dann wird Ihnen geläu­fig sein, dass ein Index, die Zäh­lung stets mit 0 begin­nt. Und so ist es auch hier.

Nach diesem ganzen Vorge­plänkel nun „Ran an den Speck”! Ich gehe ein­fach ein­mal davon aus, dass Sie auss­chließlich diese Kalen­der-Tabelle erstellen wollen und zeige Ihnen darum den direk­ten Weg auf. Prinzip­iell kön­nten Sie diese angewen­dete Formel auch inner­halb ein­er bere­its existieren­den Abfrage ver­wen­den.

  • Begin­nen sie mit ein­er neuen, leeren Mappe.
  • Reg­is­ter Dat­en | Neue Abfrage | Aus anderen Quellen | Leere Abfrage.
  • Geben Sie direkt in die Eingabezeile die bere­its oben aufge­führte Formel exakt so ein, die geschweiften Klam­mern {} geben Sie eben­falls direkt über die Tas­tatur ein:
    = List.Range({43101..43101+364},0)

    (es ist also keine Array-Formel wie in Excel).
  • Bestäti­gen Sie mit Enter.

Das Ganze stellt sich nun so dar:

Auf den ersten Blick ein etwas irritierendes Ergebnis …

Auf den ersten Blick ein etwas irri­tieren­des Ergeb­nis …

Die Über­schrift dieser Spalte sagt es schon: Es han­delt sich um eine Liste im Sinne des Pow­er Query, nicht um eine Tabelle. Wenn Sie in diesem Sta­di­um näm­lich ver­suchen, den Daten­typ in Datum zu ändern, wird Ihnen das nicht gelin­gen. Darum wer­den sie im näch­sten Schritt auf das Sym­bol Zu Tabelle Klick­en und die Vor­gaben im Dia­log so wie sie sind per OK bestäti­gen.

Sin­nvoller­weise wurde die Über­schrift der Spalte auch geän­dert, denn es ist jet­zt ja die erste Spalte ein­er ganz nor­malen Abfrage-Tabelle. Ich ändere die Über­schrift jet­zt schon im Vor­wege auf den eigentlichen Inhalt: Datum. Anschließend in der Gruppe Trans­formieren ein Klick auf Daten­typ: Beliebig und sie wählen sin­nvoller­weise Datum als Typ aus. Bin­go! Das sieht schon ein­mal sehr gut aus. Aber nach dem Mot­to „Ver­trauen ist gut, Kon­trolle ist bess­er” über­prüfen Sie als erstes die Sta­tuszeile (unten) und sie erken­nen, dass es 365 Zeilen sind; und obwohl sich ein Com­put­er so gut wie nie irrt, scrollen Sie nach unten und über­prüfen Sie, ob der let­zte Wert auch tat­säch­lich der 31. Dezem­ber 2018 ist. Übri­gens: Meis­tens funk­tion­iert auch StrgEnde, um zur let­zten Zeile der Abfrage zu gelan­gen.

Ich hat­te ja bere­its erwäh­nt, dass dank der rein numerischen Angaben auch ein erweit­ert­er Kalen­der dargestellt wer­den kann. Angenom­men sie wollen den Zeit­bere­ich 5 Tage vor Beginn und 14 Tage nach dem Jahre­sende bzw. dem Ende des Fiskal­jahres in der Tabelle darstellen, dann sähe die Formel so aus:
= List.Range({43101-5..43101+364+14},0)
und mit einem Schlag wäre das gewün­schte Ergeb­nis als Liste und nach der Kon­vertierung auch als Abfrage vorhan­den. Dieses ist eine der Stärken dieser Funk­tion.

Das 3. List.Range – Argument nutzen

Sie erin­nern sich vielle­icht, dass in der Syn­tax auch ein optionales drittes Argu­ment gegeben ist. Das haben sie bis­lang nicht genutzt, schließlich habe ich es Ihnen ja auch „unter­schla­gen”. 😳 Dabei kann das sehr nüt­zlich sein, die Formel etwas flex­i­bler, vielle­icht auch trans­par­enter zu gestal­ten. Ich bleibe ein­fach ein­mal bei dem Jahreskalen­der 2018 und würde unter Ver­wen­dung des 3. Para­me­ters fol­gende Formel nutzen:
= List.Range({43101..99999}, 0, 365)

Auf jeden Fall ist diese Formel „schlanker”. Das 2. Argu­ment inner­halb der geschweiften Klam­mern (der Wert nach den bei­den Punk­ten) ist der­art hoch ange­set­zt, dass der darzustel­lende Zeitraum auf jeden Fall reichen wird. Off­set bleibt bei 0, denn es soll ja keinen Ver­satz in Sachen Beginn geben. Und das 3. Argu­ment sollte selb­sterk­lärend sein; die Mehrzahl der Jahre hat ja 365 Tage. Und natür­lich kön­nen Sie hier auch bei den numerischen Tages-Werten händisch Sub­trak­tio­nen (beim Start-Tag) oder Addi­tio­nen (bei der Anzahl der Tage, nach dem Off­set) eingeben. – Ich denke, dass sie sich mit dieser Form eher anfre­un­den wer­den als mit der im vorheri­gen Beitrag zu diesem The­ma dargestell­ten Möglichkeit. 💡 

▲ nach oben …

Wochentag in eine extra Spalte

Beim lesen der Über­schrift wer­den Sie vielle­icht gedacht haben: „In Excel kein Prob­lem! Bezug auf die Spalte mit dem Datum und in einem gewün­scht­en Zahlen­for­mat darstellen.” Stimmt. Aber Sie sind hier ja nur indi­rekt in Excel zugange, es geht um Pow­er Query.

Egal, in welch­er Abfrage Sie sich ger­ade befind­en, Sie enthält ja min­destens 365 unter­schiedliche kalen­darische Dat­en in ein­er lis­te­nar­ti­gen Auf­stel­lung bzw. Tabelle. Markieren Sie die Spalte Datum, auf welch­es sich ja die neue Spalte mit den Wochen­tag beziehen soll. Reg­is­ter Spalte hinzufü­gen Gruppe Aus Datum & Uhrzeit und ein Klick auf das Sym­bol Datum. Im aufgeklappten Menü Tag | Name des Tags. Und wie gewohnt erscheint blitzschnell das Ergeb­nis, der (aus­geschriebene) Wochen­tag des entsprechen­den Datums.

Möcht­en Sie nur die Kurz­form des Wochen­t­ages darstellen, dann bieten sich grund­sät­zlich zwei Möglichkeit­en an. Die erste und wohl ein­fach­ste wäre: Markieren Sie die Über­schrift Name des Tages,  Reg­is­ter Start, Spalte teilen | Nach Anzahl von Zeich­nen und im Kon­textmenü bei Anzahl von Zeichen eine 2 einzugeben und Ein­mal, Soweit links wie möglich auszuwählen. Die erste Spalte enthält dann den gewün­scht­en Wert, und die zweite Spalte wer­den Sie löschen. Sin­nvoller­weise wer­den Sie die Über­schrift auch noch anpassen, indem sie die let­zten bei­den Zeichen (.1) löschen.

Der zweite gle­icher­maßen sin­nvolle Weg geht nicht über Spalte teilen son­dern Sie wer­den eine kleine Formel schreiben. Ver­wech­seln Sie zum Reg­is­ter Spalte hinzufü­gen, Benutzerdefinierte Spalte und geben bei Neuer Spal­tenname beispiel­sweise Wochen­tag ein. In dem Feld Benutzerdefinierte Spal­tenformel: geben Sie in exakt dieser Groß- Klein­schrei­bung diese Formel ein:
= Date.ToText(/Datum/, "ddd"))
… und nach einem OK erken­nen Sie die Kurz­form des Wochen­t­ages in der Spalte. Bei der Gele­gen­heit ist es dur­chaus erfreulich zu erken­nen, dass automa­tisch die Win­dows- Lan­des Ein­stel­lun­gen ver­wen­det wor­den sind. – Das funk­tion­iert mit den Monat­sna­men übri­gens genau so, nur wer­den Sie dort dann "MMM" in Großbuch­staben eingeben.

Schaltjahr

Hier gestal­tet sich die Ein- bzw. Umstel­lung auf ein Schalt­jahr gewiss genau so ein­fach wie im ersten Beitrag dieses The­mas. Ihre Formel lautet dann eben:
= List.Range({43101..99999}, 0, 366)

… und im Fol­ge­jahr dann natür­lich wieder mit 1 Tag weniger.

▲ nach oben …

 

 

Dieser Beitrag wurde unter Datum & Zeit, Power Query, PQ-Quickies abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.