Xtract: Vervielfältigen einer Liste, fortlaufende Nummerierung nach in Spalten hinterlegten Werten (von..bis). Ähnliche Daten wie in Teil 2
Wissensstand: Level 3 ⇒ Excel GUT!, mindestens Basis-Kenntnisse in Power Query
Alle Power Query-Versionen
Im vorherigen Kapitel dieser Trilogie haben Sie gesehen, wie es mit moderneren Versionen des PQ möglich ist, die Trennung Präfix – Zahl auf recht problemlose Weise auch dann durchzuführen, wenn der vorangestellte alphanumerische Wert aus mehr als 1 Zeichen besteht. In den aktuellen Versionen ab Excel 2019⁄365 gibt es ja die wirklich schicke Möglichkeit, eine Zelle derart zu splitten, dass beim Wechseln von Zeichen zu Ziffer (und natürlich auch vice versa ) automatisch geteilt wird (siehe Teil 2); aber in den früheren Versionen ist es (natürlich) auch möglich, solch eine Trennung mit einigermaßen überschaubarem Aufwand durchzuführen. 💡
Einstieg
Öffnen Sie das etwas abgeänderte Muster-File und importieren Sie die Daten wie gewohnt in den Power Query-Editor. Anschließend Duplizieren Sie die beiden ersten Spalten auf beliebige Weise. So weit ist es ja so ähnlich wie bereits gehabt …
Da jetzt aber doch so einiges anders läuft und gewiss auch deutlich aufwändiger ist als vielleicht gedacht schlage ich vor, die Abfrage bereits an dieser Stelle erst einmal über Schließen & laden in… als Nur Verbindung erstellen zu speichern.
Mühsam, mühsam … 😥
Die Überschrift dieses Abschnitts deutet es ja schon an, dass hier einiges mehr an Aufwand erforderlich ist als in der im zweiten Teil genannten Lösungsmöglichkeit. Aber in den früheren Versionen des Power Query gab es noch nicht die Möglichkeit, per Menübefehl eine Zelle beim Wechsel von Text zu Ziffer zu teilen. Aber es sei Ihnen ein Trost: Dieses hier im Anschluss vorgestellte Procedere ist ja nur ein Mal zu Beginn erforderlich, danach wird ja bei geänderter Datenlage, beim Klick auf Aktualisieren sehr vieles automatisiert ablaufen. Und mein Geheimtipp: Zum Schluss werde ich Sie noch auf einige deutlich „elegantere” Möglichkeiten hinweisen, welche Sie aber (nur) im $$-Bereich dieses Blogs finden werden.
Die Grund-Idee des Ganzen stellt sich so dar: In irgendeiner Form muss ich feststellen, wie viele Ziffern am Ende der Zeichenkette stehen. Dann ist es gut möglich, über eine Funktion welche der RECHTS() – Funktion in Excel gleicht, genau diese Ziffernfolge zu extrahieren, abzuschneiden. Diese Ziffern werden dann in eine „echte” Zahlen umgewandelt, weil PQ für die Listen-Erweiterung nur den Datentyp Zahl verwenden kann.
Soweit die Theorie. Und in der Praxis lässt sich das auch durchaus umsetzen. Selbst wenn Sie im Prinzip nur die alphanumerischen Zeichen löschen wollen wäre der Aufwand unverhältnismäßig groß, jedes denkbare Zeichen durch ""
(also nichts, einen LeerString) zu ersetzen. Auf der anderen Seite gibt es aber nur 10 unterschiedliche Ziffern. Und genau die werden sie nacheinander durch ""
ersetzen.
Markieren Sie also die beiden kopierten Spalten und Transformieren. Ein Klick auf das Symbol Werte ersetzen, geben Sie bei Zu suchender Wert die Ziffer 0 ein und belassen das Feld Ersetzen durch leer. Bestätigen Sie mit OK und in den beiden markierten Spalten sollte jede 0 durch nichts ersetzt, also gelöscht worden sein. Hinweis: Das Textfeld leer lassen, nicht ""
eingeben! Kurze Kontrolle und es stellt sich heraus, dass da irgendetwas anders gelaufen ist als gewollt. In der Spalte Wert bis – Kopie ist in den ersten beiden und der vorletzten Zeile jeweils eine 0 enthalten, aber die Nullen sind nach wie vor sichtbar. 😥
Da stellt sich doch wieder einmal die Frage, warum der Mensch denkt, Power Query aber lenkt. 😉 Im Hinblick darauf, dass PQ doch sehr stringent auf den Datentyp achtet spielt genau das hier eine, nein die entscheidenden Rolle; es liegt kein einheitlicher Datentyp vor und da Zahlen (hier die 10) als Ganzes und nicht als Ziffern 1 und 0 erkannt werden, kann PQ nicht wie gewünscht agieren. In der Zeile 8 ist die Ziffer 0 zwar ganz eindeutig ein Teil eines Textes aber der Datentyp der gesamten Spalte ist Beliebig und auch hier wird aus diesem Grunde keine Ersetzung vorgenommen. Folgerung: Markieren Sie die beiden … Kopie ‑Spalten und weisen Ihnen den Datentyp Text zu, um eine klare Linie zu erschaffen.
Löschen Sie im rechten Seitenfenster den zuvor erstellten Schritt (Ersetzter Wert), noch einmal Werte ersetzen aufrufen und fügen Sie erneut die 0 an entsprechender Position ein. Im Gegensatz zum „Durchgang” eben nicht sofort OK sondern ein auf Klick auf den neu erschienenen Text Erweiterte Optionen und achten Sie darauf, dass bei Gesamten Zellinhalt vergleichen kein Häkchen gesetzt ist. Nun ist der Erfolg gegeben.
Sie werden es ahnen: Diesen Vorgang werden sie auch für die Ziffern l bis 9 durchführen, gerne auch per Rechtsklick und dann im Kontextmenü Werte ersetzen… auswählen; die einzige Ausnahme: Sie brauchen nicht mehr darauf zu achten, dass das Häkchen bei Gesamten Zelleninhalt vergleichen gesetzt ist oder nicht, denn dieser Zustand wird sich nicht von alleine ändern. Nun steht in jeder Zeile dieser beiden Spalten nur noch der reine alphanumerischen Text (das Präfix) oder eben gar nichts, wenn im Quellbereich ausschließlich die Zahl vermerkt war.
Im nächsten Schritt werden Sie berechnen, wie viele Ziffern vom ursprünglichen Text abgeschnitten worden sind. Einfach ausgedrückt: Sie subtrahieren die Länge des gekürzten Textes von der Länge des Originaltextes und das Ergebnis entspricht dem gewünschten Wert der Anzahl von Ziffern. Dazu erstellen Sie über das Menü Spalte hinzufügen eine neue, Benutzerdefinierte Spalte und tragen dort als Überschrift beispielsweise ## von und bei Benutzerdefinierte Spaltenformel diese Formel ein:
= Text.Length(Text.From([Wert von]))
-Text.Length([#"Wert von - Kopie"])
Dass Sie mit Text.Length() die Länge eines Textes berechnen, ist prinzipiell selbsterklärend (sofern Sie der englischen Sprache einigermaßen mächtig sind). Die Funktion Text.From() ist erforderlich, da in der Spalte Wert von ja teilweise Zahlen stehen; diese werden auf diese Weise zum Datentyp Text umgewandelt. – Das gleiche Vorgehen werden Sie nun mit der Spalte Wert bis durchexerzieren, natürlich mit der Überschrift ## bis. Auch hier wird die jeweilige Länge der Ziffern berechnet und als numerischer Wert zuückgegeben.
Die Anzahl der Ziffern in den Spalten Wert von und Wert bis sind ja in den eben berechneten Spalten ## von und ## bis berechnet worden. Auf dieser Basis extrahieren Sie die Zahlen von den verbundenen alphanumerischen Werten der ersten beiden Spalten. Dazu setzen Sie die M-Funktion Text.End() in je einer neu hinzugefügten Benutzerdefinierten Spalte mit den Spaltennamen von und bis folgendermaßen ein:
Text.End(Text.From([Wert von].), #[## von])
bzw.
Text.End(Text.From([Wert bis]), #[## bis])
An der linksbündigen Ausrichtung der Ergebnisse erkennen Sie, dass es sich um einen Text handelt. Darum sollten Sie jeweils eine Umwandlung dieser beiden Ergebnisse in den Datentyp Ganze Zahl vornehmen. – Wenn Sie mögen, können Sie jetzt ja schon einige Spalten löschen, die nicht mehr benötigt werden: Werte bis – Kopie (die ist identisch zu Werte von – Kopie), ## von und ## bis. Das schafft etwas mehr Übersicht. 😉
Die restlichen Schritte erfolgen nach dem gleichen Muster wie in Teil 1 bereits besprochen, darum hier nur die stichwortartige Ausführung:
- Spalte hinzufügen, Benutzerdefinierte Spalte
- Neuer Spaltenname beispielsweise: von-bis
- Benutzerdefinierte Spaltenformel:
{[von].. [bis]}
- Die Spalte von-bis erweitern
- Die Spalten von-bis, Strg Variable 1 und Strg Variable 2 in dieser Reihenfolge markieren.
- Rechtsklick in eine der markierten Überschriften und Spalten zusammenführen wählen
- Trennzeichen: –Keine–, Neuer Spaltenname Wert
- Spalte Wert markieren, Rechtsklick und Andere Spalten entfernen.
Schließen & laden oder Schließen & laden in… und das gewünschte Ziel ist erreicht. Falls Sie meiner Empfehlung gefolgt sind und die Abfrage bereits zu Beginn per Schließen & laden in… als Nur Verbindung gespeichert hatten, dann hilft Ihnen dieser Tipp, die Daten in das Tabellenblatt zu bekommen.
Epilog
Es gibt auch in Power Query noch weitere Lösungswege, auch für die Versionen vor Excel 2016. Auch können Sie die hierüber beschriebenen Vorgehensweises etwas „schlanker” gestalten. Da aber in den meisten Fällen ein derartiges komprimieren dazu führt, dass der erzeugte M-Code an Transparenz leidet, verzichte ich auf deratige Schritte.
Hat Ihnen der Beitrag gefallen?
Erleichtert dieser Beitrag Ihre Arbeit?
Dann würde ich mich über einen Beitrag Ihrerseits z.B. 3,00 € freuen …
Dieses Thema umfasst mehrere Teile:
Teil 1 | Gilt für alle PQ-Versionen. Voraussetzung ist aber, dass ein vorhandenes Präfix maximal 1 Zeichen lang ist. |
Teil 2 | Erfordert Excel >=2019 oder 365. Das Präfix hat eine beliebige Länge und kann recht problemlos separiert werden. |
Teil 3 | Präfix hat beliebige Länge, beliebige PQ-Version. Deutlich aufwendiger als mit den neueren Versionen (siehe Teil 2) aber zielführend. |
$/$$ Außer Konkurrenz |
Gleiche Voraussetzungen wie in Teil 3. Mehrere Möglichkeiten, auf kürzeren Wegen, mit weniger Schritten zum gewünschten Ziel zu gelangen. Viel M-Code. |