Wie teile ich mit Excel eine Zeile in mehrere Zeilen auf?

9

Ich habe eine Produktdatenbank in Excel mit mehreren hundert Einträgen, von denen jeder 1 bis 3 "Preisstufen" aufweist: Standard, Deluxe und Premium. Jede Stufe hat ihre eigene SKU (A, B oder C am Ende der Basis-SKU) und einen eigenen Preis. Meine Daten sind wie folgt:

Name, Description, Price A, Price B, Price C, SKU A, SKU B, SKU C
name1,      desc1,   14.95,   19.95,        , sku1A, sku1B, 
name2,      desc2,    4.95,    9.95,   12.95, sku2A, sku2B, sku2C
name3,      desc3,   49.95,        ,        , sku3A,      ,

Wie würde ich vorgehen, damit die Daten so aussehen:

Name, Description,   SKU, Price
name1,      desc1, sku1A, 14.95
name1,      desc1, sku1B, 19.95
name2,      desc2, sku2A,  4.95
name2,      desc2, sku2B,  9.95
name2,      desc2, sku2C, 12.95
name3,      desc3, sku3A, 49.95

Wenn es hilft, werde ich diese Produkte in eine Magento-Installation importieren.

Danke im Voraus.

GreysonD
quelle
Gibt es eine Möglichkeit, dass es mehrere ähnliche Namen und Beschreibungen gibt? ZB haben zwei Zeilen name1und desc1aber mit unterschiedlichen Preisen für Preis A, Preis B, Preis C usw.
Jerry
In den Originaldaten? Nein, ich bin sicher, dass sie einzigartig sind. Aber in den neuen Daten wird es definitiv Wiederholungen geben.
GreysonD
Okay, ich hatte etwas im Sinn, aber es stellte sich heraus, dass es nicht funktionieren wird, wenn nicht mehr Manipulationen dahinter stehen, um einige Ergebnisse zu korrigieren. Wenn Sie neugierig sind, habe ich eine konsolidierte PivotTable ausprobiert, aber das Feld Beschreibung und die SKU-Felder müssten separat mit index / match / vlookup abgerufen werden, was es am Ende ziemlich lang macht.
Jerry

Antworten:

8

Diese Aufgaben sind mit VBA normalerweise schneller. Tatsächlich habe ich ~ 10 Minuten gebraucht, um es einzurichten.
Ich gehe davon aus, dass sich Ihre Daten in Spalte A bis Spalte H befinden.

Gehen Sie zu Excel » Developer » Visual Basic»Öffnen Sie sheet1(oder) im linken Bereich das Blatt, in dem sich Ihre Daten befinden.» Fügen Sie den Code im rechten Fenster ein. »Führen Sie den Code aus

VBA-Code

1 |Sub NewLayout()
2 |    For i = 2 To Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
3 |        For j = 0 To 2
4 |        If Cells(i, 3 + j) <> vbNullString Then
5 |            intCount = intCount + 1
6 |            Cells(i, 1).Copy Destination:=Cells(intCount, 10)
7 |            Cells(i, 2).Copy Destination:=Cells(intCount, 11)
8 |            Cells(i, 3 + j).Copy Destination:=Cells(intCount, 12)
9 |            Cells(i, 6 + j).Copy Destination:=Cells(intCount, 13)
10|        End If
11|        Next j
12|    Next i
13|End Sub

Erläuterung

Ich wollte den Code so kurz wie möglich halten, um ihn besser zu erklären. Grundsätzlich verwenden wir zwei Schleifen. Die äußere Schleife ( i) ist für die Zeilen und die innere Schleife ( j) für die Preisspalten.

Wir verwenden häufig cells(rowNumber,columnNumber)zum Lesen / Schreiben von Zellen.

  • Zeile 2 | Starten Sie eine Schleife von Zeile 2 bis zu Ihrer letzten Zeile. Wir durchlaufen jede verwendete Zeile

  • Zeile 3 | Starten Sie eine zweite Schleife von 0 bis 2 (das sind tatsächlich 3 Schleifen, eine für jede Preisspalte).

  • Zeile 4 | Wir verwenden diese innere Schleife, um nach Werten in unserer aktuellen Zeile und Spalte Preis A, dann Preis B und in der letzten Schleife Preis C zu suchen. Wenn wir einen Wert in einer Preisspalte finden, fahren wir fort und kopieren Zellen. Wenn kein Preis eingefügt wird, tun wir nichts und fahren mit der nächsten Preisspalte fort

  • Zeile 5 | Zählen Sie einen Zähler hoch, um zu wissen, wie viele Zeilen wir bereits kopiert haben,
    damit wir wissen, nach welcher Zeile wir unsere aktuelle Zeile kopieren können

  • Zeile 6 | Kopieren Sie die Namensspalte

  • Zeile 7 | Kopieren Sie die Beschreibungsspalte

  • Zeile 8 | Kopieren Sie die Spalte Preis A oder B oder C, je nachdem, um welche innere Schleife es sich derzeit handelt

  • Zeile 9 | Kopieren Sie die Spalte SKU A oder B oder C, je nachdem, um welche innere Schleife es sich derzeit handelt

Ergebnis Screenshot

Geben Sie hier die Bildbeschreibung ein

Nixda
quelle
1
Das ist fantastisch! Genau das, was ich brauche. Meine Daten sind tatsächlich etwas komplexer als mein Beispiel, und ich bin neu in VBA, daher hilft Ihre Erklärung enorm. Vielen Dank!
GreysonD
2

Hier ist eine Arbeitsblattfunktionslösung. Die Formeln sind etwas dicht, seien Sie also gewarnt, aber dies wird geben, was Sie wollen.

Schritte:

  1. Geben Sie in der ersten Zeile Ihrer neuen Tabelle unter Nameeinen direkten Verweis auf die erste Namein Ihren Daten ein. In Ihrem Beispiel würden Sie eingeben, =A2wobei A2 der in Ihren Daten aufgeführte Vorname ist. In dem Beispiel-Screenshot, den ich unten bereitgestellt habe, geht diese Formel ein A8. Alle folgenden Formeln folgen dem im Screenshot verwendeten Layout. Sie müssen natürlich alle Bereichsreferenzen aktualisieren, um sie an Ihre Blätter anzupassen.
  2. Geben Sie in die Zelle darunter die folgende Formel ein:
    = IF (COUNTIF ($ A $ 9: A9, A9) = COUNTA (OFFSET ($ C $ 1: $ E $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0)), INDEX ($ A $ 2 : $ A $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0) +1), A9)
    
    Dadurch wird im Wesentlichen überprüft, wie viele Zeilen für den oben aufgeführten Namen (in A9) vorhanden sein sollen. Wenn die Anzahl der Zeilen in Ihrer neuen Tabelle mit dieser übereinstimmt, wird mit dem nächsten Namen fortgefahren. Wenn nicht, wird eine weitere Zeile für den obigen Namen hinzugefügt.
    Füllen Sie diese Formel so weit wie nötig aus (bis eine 0 anstelle eines Namens zurückgegeben wird).
  3. Geben Sie in der ersten Zeile unter Descriptiondie folgende Formel ein und füllen Sie sie aus.
    = INDEX ($ B $ 2: $ B $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0))
  4. Fügen Sie in der ersten Zeile SKUunten die folgende Formel in die Formelleiste ein und drücken Sie Ctrl+ Shift+ Enter.
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0), SMALL (IF (OFFSET ($ F $ 1: $ H $ 1, MATCH (A9, $))) A $ 2: $ A $ 5,0), 0) <> "", SPALTE ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Dies ist eine Array-Formel. Bei korrekter Eingabe wird die Formel in der Formelleiste in geschweiften Klammern angezeigt. Füllen Sie diese Formel in Ihre Tabelle ein (jede Instanz sollte ebenfalls in geschweiften Klammern stehen).
  5. Fügen Sie in der ersten Zeile Priceunten die folgende Formel in die Formelleiste ein und geben Sie sie als Array-Formel ein (durch Drücken von Ctrl+ Shift+ Enter).
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH ($ A9, $ A $ 2: $ A $ 5,0), 0), SMALL (IF (OFFSET ($ C $ 1: $ E $ 1, MATCH ($ A9))) , $ A $ 2: $ A $ 5,0), 0) <> "", SPALTE ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Füllen Sie aus, und dies sollte Ihre Tabelle vervollständigen.

Screenshot der Tabelle

Excellll
quelle
Beeindruckende Formeln! Zwischen dieser und der VBA-Antwort bin ich auf so ziemlich alles eingestellt. Vielen Dank!
GreysonD