1:n, Positionen auf n Zeilen erweitern

Jede Zeile einer Liste/Tabelle vervielfachen

Die Aufgabe

Es existiert eine Auf­stel­lung mit Artikeln des Bek­lei­dung-Bere­ichs. Diese muster­hafte Liste kön­nen Sie hier auf unserem Serv­er herun­ter­laden. Das Ziel ist, mit oder ohne VBA/Makros jede Posi­tion zu vervielfachen, mehrfach aufzulis­ten. Dabei soll jew­eils der Artikel­num­mer eine Größen­beze­ich­nung ‑getren­nt mit einem Binde­strich- ange­fügt wer­den. Die Beze­ich­nun­gen sind: XS, S, M, L, XL, XXL. Prinzip­iell war das eine Anfrage aus einem Excel-Forum (siehe auch der Link bei der Formel-Lösung). Ich habe das Ganze ein wenig „aufge­bohrt” und um eigene Vari­anten ergänzt.

Wenn Sie meine Muster-Datei geöffnet haben wer­den Sie gewiss nachvol­lziehen kön­nen, dass zu jedem der Pro­duk­te die Angabe der Klei­der­größe fehlt. Das Ziel ist es, die Artikel­num­mer jew­eils um die Größen-Beze­ich­nung zu ergänzen, sodass beispiel­sweise 1729-XS für ein Kleid der Größe XS bis hin zu 1729-XXL des gle­ichen Klei­der­mod­ells in der max­i­malen Größe gelis­tet wird. Im End­ef­fekt soll jede ursprüngliche Artikel­num­mer um jegliche Größen­beze­ich­nung ergänzt wer­den.

▲ nach oben …

Formel-Lösung

Wie schon erwäh­nt, ist die ursprüngliche Auf­gabe in einem Forum gepostet wor­den. Und da ich denke, dass mein Namensvet­ter eine sta­bile Formel-Lösung erstellt hat, ver­weise ich hier schlicht und ein­fach auf den entsprechen­den Forums-Thread. Blät­tern Sie bis zum Beitrag #8 und sie erken­nen die Lösung von Gün­ter (Will­Wis­sen). Ich habe sie nicht weit­er geprüft, da aber auch kein Wider­spruch im weit­eren Ver­lauf des Threads erfol­gt ist, wird das seine Richtigkeit haben. Diese Formel bezieht sich naturgemäß auf die Datei, welche dort zur Ver­fü­gung gestellt wor­den ist (hier noch ein­mal die Roh-Form).

▲ nach oben …

VBA-Lösung

Auch wenn im eben erwäh­n­ten Forum bere­its eine VBA-Lösung gepostet wor­den ist, ich habe sie mir wed­er ange­se­hen und entsprechend auch nicht getestet. Für mich ist es wichtig, Lösun­gen abso­lut autonom zu kreieren, dann weiß ich wenig­stens auch noch nach län­ger­er Zeit, was ich bei Bedarf wo ändern kann oder muss. Hier nun der Code, den ich für meine Muster-Datei erstellt, erprobt und für gut befun­den habe:

Option Explicit
Option Base 1  'Array startet mit 1, nicht mit 0

Sub ArtikelGroesseExpandieren()
'Jedem Artikel eine eigene Zeile für die Größe zuweisen
   Dim aArtikel1, aArtikel2, aGroessen
   Dim lRow As Long, Ze As Long, AnzGr As Long, AnzArt As Long, i As Long
   Dim sh As Object, Sh2 As String, Sh2Da As Boolean
   
   'Tabelle Größen
   lRow = Cells(Rows.Count, 6).End(xlUp).Row 'letzte Zeile Größen, Spalte F (6)
   aGroessen = Range(Cells(2, 6), Cells(lRow, 6))  '2. Zeile wegen Überschrift
   AnzGr = lRow - 1
   
   'Tabelle Artikel
   With Sheets("Tabelle1")
      lRow = .Cells(Rows.Count, 1).End(xlUp).Row 'letzte Zeile Artikel, Spalte A (1)
      aArtikel1 = .Range(.Cells(2, 1), .Cells(lRow, 3))
      AnzArt = lRow - 1
      ReDim aArtikel2(AnzArt * AnzGr, 3)
      
      For Ze = 0 To AnzArt - 1
         For i = 1 To AnzGr
            aArtikel2(Ze * AnzGr + i, 1) = CStr(aArtikel1(Ze + 1, 1)) & "-" & aGroessen(i, 1)
            aArtikel2(Ze * AnzGr + i, 2) = aArtikel1(Ze + 1, 2)
            aArtikel2(Ze * AnzGr + i, 3) = aArtikel1(Ze + 1, 3)
         Next i
      Next Ze
      '-------------------------
      'Neues Blatt anlegen
      Sh2 = "Tabelle2"
      For Each sh In ThisWorkbook.Sheets
         If sh.Name = Sh2 Then
            Sh2Da = True
            Exit For
         End If
      Next sh
      
      If Not Sh2Da Then
         Sheets.Add After:=Sheets("Tabelle1")
         ActiveSheet.Name = Sh2
      End If
   End With
   
   With Sheets("Tabelle2")
      .Cells.ClearContents
      .Cells(1, 1) = "ArtNr"
      .Cells(1, 2) = "Bez"
      .Cells(1, 3) = "Preis"
      .Range("A2").Resize(AnzArt * AnzGr, 3) = aArtikel2
      .Range("C2:C" & UBound(aArtikel2) + 1).NumberFormat = "#,##0.00 $"
   End With
End Sub

▲ nach oben …

Power Query-Lösung (1)

Obwohl ich diesen Weg erst im zweit­en Anlauf gefun­den habe, möchte ich Ihnen diese Lösung an erster Stelle vorstellen. Wie so oft im Leben fall­en auch mir die besseren Möglichkeit­en mitunter erst im Nach­hinein ein. 😉 Das will aber nicht heißen, dass die im kom­menden Abschnitt aufge­führte Lösung schlechter ist. Ganz im Gegen­teil, sie bietet für andere Fälle ein deut­lich höheres Poten­zial.

Begin­nen Sie damit, die Zelle A1 zu markieren und per StrgL oder StrgT aus den Pro­dukt-Dat­en eine For­matierte Tabelle zu erstellen. Ich gebe dieser Tabelle dann auch einen sinnhaften und vielle­icht etwas leg­eren Namen: Klam­ot­ten. 🙂 Natür­lich kön­nen Sie einen beliebi­gen, anderen Namen ver­wen­den …

Für die Auflis­tung der Größen ver­fahren Sie gle­icher­maßen. Acht­en Sie aber darauf, dass hier das Häkchen bei Tabelle hat Über­schriften geset­zt sein muss. Dieser Tabelle gebe ich dann den Namen Größen.

Ich importiere nacheinan­der diese bei­den Tabellen in den Pow­er Query Edi­tor. Anschließend, direkt nach dem Import jed­er der bei­den Tabellen Reg­is­ter Datei | Schließen & laden in… | Nur Verbindung erstellen. Damit erre­iche ich, dass später keine über­flüs­si­gen Tabellen in neu erstellte Arbeits­blät­ter geschrieben wer­den.

Öff­nen Sie nun auf beliebige Weise die Abfrage Klam­ot­ten. Bei mir war es so, dass in der Spalte Preis  (aus nicht ersichtlichen Grün­den) keine Cent-Beträge erfasst wor­den sind; es waren nur „glat­te” Beträge:

Die Abfrage direkt nach dem Import, hier ohne Cent-Beträge

Die Abfrage direkt nach dem Import, ohne Cent-Beträge

Im recht­en Seit­en­fen­ster erken­nen sie bei Angewen­dete Schritte, dass die 2. Posi­tion Geän­dert­er Typ ist. Sie kön­nten zwar diese Zeile durch einen Klick auf das rote löschen, ich empfehle ihn aber, die Über­schrift Preis zu markieren und den Daten­typ auf Dez­i­malzahl zu ändern.

Klick­en Sie nun im linken Seit­en­fen­ster auf den Text Abfra­gen oder das > – Sym­bol und wählen Sie dort durch einen Mausklick die Abfrage Größen. In den Zeilen 1–6 ste­hen die unter­schiedlichen Größen­beze­ich­nun­gen in logis­ch­er Rei­hen­folge untere­inan­der. Wech­seln Sie zum Reg­is­ter Trans­formieren und Klick­en Sie in der Gruppe Tabelle auf das Sym­bol Ver­tauschen. Das ist jen­er Vor­gang, den sie in Excel unter Transponieren ken­nen. Aus 6 Zeilen wurde nun 1 Zeile und die ursprüngliche Über­schrift wurde durch eigene, jew­eils einzi­gar­tige Über­schriften erset­zt:

Die transponierte, ehemals 6-zeilige Tabelle

Die transponierte, ehe­mals 6‑zeilige Tabelle

Markieren Sie nun (vorzugsweise mit Shift) alle Spal­ten, und immer noch im Reg­is­ter Trans­formieren wählen Sie in der Gruppe Textspalte den Menüpunkt Spal­ten zusam­men­führen. Als Trennze­ichen wählen Sie das Semi­kolon, als Spal­tenname schreibe ich in das 2. Textfeld des Dialogs Größen.

Die 6 Spal­ten sind nun zu ein­er Spalte zusam­menge­fasst wor­den. Nun wech­sle ich zum Reg­is­ter Spalte hinzufü­gen und klicke hier auf das Sym­bol Benutzerdefinierte Spalte. Im Dia­log gebe ich bei Neuer Spal­tenname das Wort Index ein und im großen Textfeld (Benutzerdefinierte Spal­tenformel) schreibe ich nur eine 1:

Der Dialog für die (neue) Benutzerdefinierte Spalte

Der Dia­log für die (neue) Benutzerdefinierte Spalte

Danach schließe ich den Dia­log per OK. Nun wech­sle ich zur Abfrage Klam­ot­ten und füge auch hier eine Benutzerdefinierte Spalte ein. Sie kön­nten als Über­schrift auch Index ver­wen­den, ich ver­wende der Klarheit wegen den Namen Pseu­do-Index, da es ja kein fort­laufend­er Index ist. Hin­weis: Wenn Sie es genau nehmen, hätte ich auch diesen Namen in der Abfrage Größen ver­wen­den sollen. 😉

Aktivieren Sie das Reg­is­ter Start und Klick­en Sie auf das Sym­bol Kom­binieren. Im Drop­Down erweit­ern Sie den Punkt Abfra­gen zusam­men­führen und wählen dort die Möglichkeit Abfra­gen als neue Abfrage zusam­men­führen. In der oberen Hälfte des Dialogs erken­nen sie die Ein­träge der Abfrage Klam­ot­ten. In der unteren Hälfte wählen Sie die Abfrage Größen. Klick­en Sie im oberen Bere­ich in ein beliebiges Feld der Spalte Pseu­do-Index sowie auch in Index, was sich anschließend so darstellt:

In diesem Dialog führen Sie die beiden Abfragen zusammen

In diesem Dia­log führen Sie die bei­den Abfra­gen zusam­men

Nichts weit­er ändern und mit OK bestäti­gen. Ihre Tabelle wird nun so ausse­hen:

Die Daten beider Tabellen, erster Schritt der Zusammenführung

Die Dat­en bei­der Tabellen, erster Schritt der Zusam­men­führung

Erweit­ern Sie nun die Spalte Größe durch einen Klick auf den Dop­pelpfeil Doppelpfeil und ent­fer­nen Sie im Dia­log nur das Häkchen bei Ursprünglichen Spal­tenna­men als Prä­fix ver­wen­den. Schließen Sie das Fen­ster und ihre Tabelle wird nun so ausse­hen:

Das Zusammenführen ist nun abgeschlossen

Das Zusam­men­führen ist nun abgeschlossen

  • Löschen Sie nun die Spal­ten Pseu­do-Index sowie Index, sie wer­den nicht mehr gebraucht.
  • Klick­en Sie jet­zt in die Überschrift(en) Art­Nr, Strg und Größe.1, damit diese bei­den Spal­ten markiert sind.
  • Acht­en Sie dabei auf die Rei­hen­folge der Markierung.
  • Das Reg­is­ter Start ist aktiviert, die Spalte Größe.1 ist markiert.
  • In der Gruppe Trans­formieren ein Klick auf Spalte teilen | Nach Trennze­ichen.
  • Die Vor­gabe Semi­kolon ist kor­rekt. Belassen Sie es bei der Auswahl Bei jedem Vorkom­men des Trennze­ichens.
  • Klick­en Sie auf Erweit­erte Optio­nen und markieren Sie hier den Option-But­ton Zeilen:
Hier markieren Sie den Radio-Button "Zeilen" (statt "Spalten")

Hier markieren Sie den Radio-But­ton „Zeilen” (statt „Spal­ten”)

Nach einem Klick auf OK sind aus den 5 Zeilen wie durch Geis­ter­hand 5 × 6 (also 30) Zeilen gewor­den. Das Kleid mit der Artikel­num­mer 1729 ist 6 Mal aufge­führt, jew­eils mit ein­er anderen Größen­beze­ich­nung. Gle­ich­es gilt für die Hose und die weit­eren Artikel.

Im let­zten Schritt wer­den Sie die Artikel­num­mer und die Größen­beze­ich­nung durch ein - getren­nt zusam­men­führen. Dazu Klick­en Sie in die Über­schrift Art­Nr, Strg und danach in Größe.1. Wech­seln Sie in das Reg­is­ter Trans­formieren | Spal­ten zusam­men­führen und als Trennze­ichen navigieren Sie erst ein­mal zur unter­sten Möglichkeit –Benutzerdefiniert– und tra­gen dann in das neu erschienene Textfeld das - ein. Neuer Spal­tenname (option­al) über­schreiben sie mit Artikel­num­mer.

Ver­schieben Sie nun die neu erstellte Spalte Artikel­num­mer durch ziehen mit der Maus oder Recht­sklick Über­schrift | Ver­schieben | An den Anfang. Bleibt nur noch der Schritt Start | Schließen und laden und in einem neuen Tabel­len­blatt wird eine neue Tabelle mit dem Wun­schergeb­nis erstellt. Ide­al­er­weise wer­den sie die Spalte Preis noch als Währung for­matieren. Meine Lösung kön­nen Sie an dieser Stelle herun­ter­laden.

▲ nach oben …

Power Query-Lösung (2)

Pow­er Query wäre kein Teil des Excel, wenn es nicht an vie­len Stellen mehrere Möglichkeit­en gäbe, zum gewün­scht­en Ziel zu gelan­gen. Ich hat­te schon erwäh­nt, dass mir der hierüber aufge­führte Weg erst einge­fall­en ist, nach­dem ich die im Fol­gen­den geschilderte Vorge­hensweise fer­tiggestellt hat­te. Jede der bei­den Arbeitsweisen hat ihre Vor-als auch Nachteile; in vie­len Fällen wird entschei­dend sein, in welchem Umfeld sie ger­ade arbeit­en und ob Sie Formeln an sich mögen oder nicht (so sehr).

Da in sehr vie­len Punk­ten die Vorge­hensweise mit dem vorher gezeigten Beispiel iden­tisch ist, werde ich mich an den Stellen, wo es sin­nvoll ist, auf eine stich­punk­tar­tige Darstel­lung beschränken. Der Import der Dat­en in den Pow­er Query Edi­tor ist beispiel­sweise abso­lut gle­ich. Es existieren danach 2 Abfra­gen, Artikel (oder Klam­ot­ten) und Größen. Bei­de Abfra­gen spe­ich­ern Sie auch wiederum Nur als Verbindung, um nicht unnötige Daten­blät­ter mit nicht erforder­lichen Tabellen zu erzeu­gen.

Zuerst wer­den sie kon­trol­lieren, ob bei den Klam­ot­ten in der Spalte Preis auch die Nachkom­mas­tellen angezeigt wer­den. Ide­al­er­weise wer­den sie den Daten­typ auf Dez­i­malzahl ändern, falls nicht bere­its durch Pow­er Query geschehen. Wech­seln Sie nun zum Reg­is­ter Spalte hinzufü­gen und in der Gruppe All­ge­mein ein Klick auf Indexs­palte. Um die Spalte später bess­er iden­ti­fizieren zu kön­nen, ändern Sie den Namen der Über­schrift auf beispiel­sweise Index Artikel. Das geht pri­ma über F2 oder per Dop­pelk­lick, wenn Sie sich nicht durch die Menüs „wühlen” wollen. 😉 

Wech­seln Sie zur Abfrage Größen. Fügen Sie auch hier auf die gle­iche Weise einen Index ein. Sie kön­nen die Über­schrift so belassen oder auf Wun­sch auch abän­dern. Sie wer­den im weit­eren Ver­lauf die Anzahl der Posi­tio­nen, genauer gesagt den Max­i­mal-Wert des Index brauchen. Sie kön­nen sich hier die Zahl 5 merken oder aber (option­al) Sie erstellen ein Dup­likat dieser Abfrage, markiere die Spalte Index, aktivieren das Reg­is­ter Trans­formieren und wählen dann in der Gruppe Zahlenspalte beim Sym­bol Sta­tis­tiken den Punkt Max­i­mum. Ide­al­er­weise wer­den Sie diese Abfrage umbe­nen­nen (beispiel­sweise Max Index Größe) und in der einzi­gen Zelle diese Abfrage ste­ht dann der Wert 5.

Hin­weis: Wenn sie später ein­mal etwas „sat­telfester” mit Pow­er Query gewor­den sind, kön­nen Sie das berech­net Max­i­mum der Spalte Größe auch als Liste spe­ich­ern und diesen Wert im gle­ich beschriebe­nen Schritt (Formel-Eingabe) direkt ver­wen­den, ohne die Zahl einzugeben. Bei Bedarf senden Sie ein­fach eine Mail an: 
Frag-den-Spezialisten@Excel-ist-sexy.de.

Wech­seln Sie nun zur Abfrage Klam­ot­ten. Reg­is­ter Spalte hinzufü­gen | Benutzerdefinierte Spalte und belassen Sie gerne den Spal­tenna­men bei Benutzerdefiniert. Im Bere­ich Benutzerdefinierte Spal­tenformel geben Sie diese Formel ein:
List.Range({0..5}, 0)
(acht­en Sie auf die run­den und geschweiften Klam­mern!) und nach einem OK stellt sich ihr Bild­schirm so dar:

Zwischenstand nach dem splitten der Größe-Spalte

Zwis­chen­stand nach dem split­ten der Größe-Spalte

Erweit­ern Sie die Über­schrift Benutzerdefiniert Doppelpfeil und wählen Sie dort die Möglichkeit Auf neue Zeilen ausweit­en. Ihre Tabelle wird sich nun so darstellen:

Jede der 5 einzelnen Positionen/Artikel ist nun erweitert

Jede der 5 einzel­nen Positionen/Artikel ist nun erweit­ert

Sie befind­en sich immer noch in der Abfrage Klam­ot­ten.

  • Wech­seln Sie zum Reg­is­ter Start.
  • Klick­en Sie auf das Sym­bol Kom­binieren und erweit­ern Sie die obere Auswahl Abfra­gen zusam­men­führen , anschließend Klick­en Sie auf Abfra­gen als neue Abfrage zusam­men­führen.
  • Wählen Sie als 2. Abfrage die Abfrage Größen.
  • Um die bei den Queries zu verknüpfen den Spal­ten zu markieren, Klick­en Sie bei Klam­ot­ten in die Spalte Benutzerdefiniert und bei Größen in die Spalte Index Artikel.
  • Bestäti­gen Sie mit OK.

Dass nun auss­chließlich Table in der neuen Spalte ste­ht, das ken­nen Sie. Erweit­ern Sie nun die Spalte Größe Doppelpfeil und ent­fer­nen Sie im Dia­log nur das Häkchen bei Ursprünglichen Spal­tenna­men als Prä­fix ver­wen­den. Die Tabelle stellt sich nun so dar:

Die Abfrage nach dem "entpacken" der Spalte Größe

Die Abfrage nach dem „ent­pack­en” der Spalte Größe

Sie erken­nen, dass die Daten­sätze jet­zt nicht mehr in der ursprünglichen Rei­hen­folge sind. Darum wer­den Sie diese nun in exakt der hier aufgezeigten Rei­hen­folge jew­eils auf­steigend sortieren: Zuerst nach Index Artikel und anschließend nach Index.1. Löschen Sie nun die Spal­ten Index Klam­ot­ten, Benutzerdefiniert und Index Größen.

Die Schritte, um die Artikel­num­mer und die Größen­beze­ich­nung zusam­men zu führen ken­nen Sie bere­its: Art­Nr und Größe.1 markieren, über Reg­is­ter Minusze­ichen Zusam­men­führen und der neu gener­ierten Spalte die Über­schrift Artikel­num­mer geben. Diese Spalte jet­zt noch an den Anfang ver­schieben und es verbleibt prak­tisch nur noch der Punkt Schließen & laden. Der Optik wegen wer­den sie wahrschein­lich nun noch die Spalte mit dem Preis als Währung for­matieren. Und natür­lich gibt es auch diese Lösung, Klick­en Sie ein­fach hier.

Zugegeben, es gibt noch weit­ere Wege zur Erre­ichung dieses Ziels. Aber das über­lasse ich Ihrem Forschergeist oder anderen „Spezies”, die dann ihren eige­nen Lieblings-Weg dar­legen kön­nen. 😎 

▲ nach oben …

Hat Ihnen der Beitrag gefallen?
Erleichtert dieser Beitrag Ihre Arbeit?

Dann würde ich mich über einen Beitrag Ihrer­seits z.B. 3,50  freuen …

Ref­er­ence: FDS-592

Dieser Beitrag wurde unter Daten zusammenführen, Excel-Funktionen, Foren-Q&A, Formatierung, Mit VBA/Makro, Ohne Makro/VBA, Power Query, PQ-Formeln (Sprache M), Tabelle und Zelle, Text-Behandlung, Transponieren, Verschiedenes, Wege nach Rom, {Liste} abgelegt und mit , , , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.