Vaterartikel aus EAN Listen generieren

Nicht voll- aber automatisch

Vaterartikel aus EAN Listen automatisch generieren

von Okt 23, 2017JTL Shop 40 Kommentare

Wer häufig EAN Listen der Lieferanten bearbeiten muss, wird – wie ich – sicher irgendwann daran verzweifeln, dass Vaterartikel händisch angelegt werden müssen. Zusätzlich müssen die Artikel mit der Vaterartikel ID versehen, der Artikelname durch Größe und/oder Farbe ergänzt und die Artikelnummer intelligent gewählt werden. Nicht schlimm bei Listen, die dann für einige Jahre unverändert laufen, aber ein Albtraum bei zB Mode, wo die Kollektionen teilweise halbjährlich erscheinen und 5.000+ Artikel enthalten.

Ich habe versucht, die Lösung dafür auf Stack Overflow zu finden (https://stackoverflow.com/questions/45729617/conditionally-duplicating-rows-in-excel), die Frage war nur zu vage formuliert, um wirklich gute Resultate zu generieren. Da ich selber zwar firm in PHP bin, von VBA aber exakt gar keine Ahnung habe, ist meine „Weiterentwicklung“ des Codes wohl das schlimmste Progrämmchen, was ich je geschrieben habe 😉 Egal, bis auf Kleinigkeiten funktioniert es, wenn man entsprechende Vorarbeit leistet.

Folgende Spalten MUSS die Tabelle in genau dieser Reihenfolge haben:
| HAN/MPN | Artikelname | Variation (zB Größe) | Leer | EAN/UPC |

Spalten hinter EAN (zB HEK, UVP, Gewicht o.ä.) werden so wie vom Lieferanten bereitgestellt mitkopiert. Der Vaterartikel hat keine EAN, keine VaterID und keine Variation, diese werden durch das Script entsprechend gelöscht. Die Artikelnummern werden in der Form 1234 (Vater) und 1234.Varwert (Kind) angelegt, Kinder erhalten die 1234 als VaterID.

Das Resultat sieht von den Spalten her so aus:
| Variation SortNr | HAN/MPN | | HAN/MPN | Hilfsspalte | Variationswert | Artikelnummer | VaterID | Artikelname | EAN/UPC |
… allerdings ohne Header, diese müssen manuell eingetragen oder in der Ameise gemappt werden.

Sub ConditionallyDuplicateRows()

'MPN | Name | Size | None | EAN

Dim lRw As Long
Dim artNr As Long
Dim artOffset As Long
Dim artPrefix As String
Dim varPrefix As String
Dim year As String

Application.ScreenUpdating = False

'Set ID Offset
artOffset = 104700
artNr = artOffset
artPrefix = "ART"
varPrefix = " Größe "
year = ""

Range("B1").EntireColumn.Insert
Range("A1").EntireColumn.Insert
Range("F1").EntireColumn.Insert
Range("G1").EntireColumn.Insert

lRw = Range("B" & Rows.Count).End(xlUp).Row - 1

For i = lRw To 1 Step -1
    If Range("B" & i).Value <> Range("B" & i + 1).Value Then
    
       'PARENT
    
       'Copy Last Rows Data Into New Parent Row
       Rows(i + 1).Copy
       Range("A" & i + 1).Insert Shift:=xlDown
       
       'Highlight Parent Row
       Cells(i + 1, 1).EntireRow.Interior.Color = vbYellow
       
       'Set ID and Parent ID
       artNr = artNr + 1
       Range("F" & i).Value = artPrefix & artNr & "." & Range("E" & i).Value 'ID
       Range("F" & i + 1).Value = artPrefix & artNr - 1 'ID Field for Parent
       Range("G" & i).Value = artPrefix & artNr 'Parent ID
       Range("H" & i + 1).Value = Range("B" & i + 2).Offset(, 2).Value & year
       Range("H" & i).Value = Range("D" & i).Value & year & varPrefix & Range("E" & i)
       'Use as VarSort
       Range("A" & i).Value = i
       
       'Delete VarSort, Parent ID, Variation and EAN
       Range("A" & i + 1).Value = "" 'VarSort
       Range("E" & i + 1).Value = "" 'Variation
       Range("G" & i + 1).Value = "" 'Parent ID
       Range("I" & i + 1).Value = "" 'EAN
       
       'DONT Delete Old Code!
       Range("B" & i).Offset(1, 1).Value = Range("B" & i + 2).Value
       Range("B" & i).Offset(1, 2).Value = Range("B" & i + 2).Offset(, 2).Value
       Range("B" & i).Offset(2, 1).Value = Range("B" & i).Offset(2).Value
       
    Else
        
        'CHILD
        
        Range("F" & i).Value = artPrefix & artNr & "." & Range("E" & i).Value 'ID
        Range("G" & i).Value = artPrefix & artNr 'Parent ID
        Range("H" & i).Value = Range("D" & i).Value & year & varPrefix & Range("E" & i) 'Childs Name
        
        Range("A" & i).Value = i
        
        'DONT Delete Old Code!
        Range("B" & i).Offset(1, 1).Value = Range("B" & i + 1).Value
        
    End If
Next i

Application.CutCopyMode = False
Application.ScreenUpdating = True

End Sub

Bekannte Fehler:

  1. die letzte Zeile wird nicht vernünftig befüllt, muss händisch gemacht werden
  2. Das Script vergleicht nur HAN, keine Artikelnamen. Daher werden Artikel, die zwei Variationen (zB Größe und Farbe) haben, nicht korrekt kopiert. Lösung: je nach Präferenz HAN und zB Farbe verketten (6789-rot).
  3. Und ich bekomme den alten Code nicht weg, ohne das Script zu töten 😉

Auf jeden Fall wäre das hier ein erster Ansatz, ein solches VBA Script zu benutzen. Mir hilft es schon sehr gut, aber Potential nach oben wäre da 😀

Verbesserungsvorschläge gerne am Ende des Beitrags als Kommentar posten! Vielleicht findet sich hier ja ein begnadeter VBA Programmierer 🙂