Hallo Forum,
ich arbeite aktuell an einer Excel-Datei welche genutzt wird um Aufträge in das ERP-System einzupflegen. Hierbei soll nun vor Upload die bestellte Menge in VPE und dem dazugehörigen Anbruch getrennt werden. Dies wollte ich über ein VBA-Skript lösen, da die VPEs ja bekannt sind und dementsprechend anhand dieser angepasst werden sollte.
Hierfür habe ich, aufgrund meiner bescheidenen VBA-Kenntnisse, versucht dies über ChatGPT zu lösen und dieses hat mir auch bereits einen für mich annehmbares Skript generiert.
Sub Artikelnummern_prüfen()
Dim letzteZeile As Long
Dim artikelnummer As String
Dim VPE As Integer
Dim menge As Double
Dim voll As Integer
Dim anbruch As Double
Dim i As Long
Dim neueZeile As Long
Dim wb As Workbook
Set wb = ThisWorkbook
'Letzte Zeile mit Daten in Spalte B ermitteln
letzteZeile = wb.Worksheets("Data").Cells(Rows.Count, 2).End(xlUp).row
'Schleife durch alle Zeilen mit Daten
For i = 11 To letzteZeile
'Die Artikelnummer auslesen
artikelnummer = wb.Worksheets("Data").Cells(i, 2).Value
'Die Verpackungseinheit aus dem Tabellenblatt "Daten" ermitteln
VPE = 0
On Error Resume Next
VPE = Application.WorksheetFunction.VLookup(artikelnummer, wb.Worksheets("Daten").Range("B:H"), 6, False)
On Error GoTo 0
'Prüfen, ob VPE erfolgreich ermittelt wurde
If VPE = 0 Then
MsgBox "Die Verpackungseinheit für Artikelnummer " & artikelnummer & " konnte nicht gefunden werden."
Exit Sub
End If
'Die Menge auslesen
menge = wb.Worksheets("Data").Cells(i, 3).Value
'Wenn die Menge nicht durch die Verpackungseinheit teilbar ist, Zeilen einfügen
If menge Mod VPE > 0 Then
'Die Anzahl der vollen Verpackungseinheiten berechnen
voll = Int(menge / VPE)
'Die Anzahl der Anbrüche berechnen
anbruch = menge - voll * VPE
'Neue Zeile einfügen, falls noch keine Zeile für Anbruch existiert
If wb.Worksheets("Data").Cells(i + 1, 2).Value > artikelnummer Or wb.Worksheets("Data").Cells(i + 1, 4).Value > "Anbruch" Then
neueZeile = i + 1
Rows(neueZeile).Insert Shift:=xlDown
'Die Werte für die neue Zeile eintragen
wb.Worksheets("Data").Cells(neueZeile, 1).Value = i - 10 + 1
wb.Worksheets("Data").Cells(neueZeile, 2).Value = artikelnummer
wb.Worksheets("Data").Cells(neueZeile, 3).Value = anbruch
wb.Worksheets("Data").Cells(neueZeile, 4).Value = "Anbruch"
wb.Worksheets("Data").Cells(neueZeile, 5).Value = ""
Else 'Ansonsten Anbruchwert in bestehende Anbruchzeile eintragen
wb.Worksheets("Data").Cells(i + 1, 3).Value = anbruch
End If
'Die Menge in der ursprünglichen Zeile aktualisieren
wb.Worksheets("Data").Cells(i, 3).Value = voll * VPE
End If
Next i
End Sub
Hierdurch wird mir die Zeile zwar in volle VPEs und Anbruch getrennt, allerdings generiert es mir immer mehrere Zeilen mit der Menge "0" zwischen der aufgespalteten vollen VPE und der Anbruch VPE. (siehe Bild)
Zusätzlich werden die nachfolgenden Artikelnummern innerhalb der Liste nicht bearbeitet obwohl diese ebenfalls keine vollen VPEs darstellen und dementsprechend Anbruch generiert werden würde.
Artikel 2003215 = VPE 480
Artikel 2003144 = VPE 480
Artikel 2004211 = VPE 960
Die Daten für die jeweiligen VPEs befinden sich in einem separaten Tabellenblatt namens "Daten" in welchem die Artikelnummern in der Spalte "B" und die VPEs in der Spalte "H" eingepflegt sind. Hierauf bezieht sich auch die VLookup-Funktion bzw. der S-Verweis.
Könnt ihr mir helfen wie ich das VBA-Skript verändern muss, das alle Artikel innerhalb der Liste auf ihre VPE geprüft und ggf. in mehrere Zeilen aufgeteilt werden?
Hierbei soll immer die Menge welche durch die VPE teilbar ist und eine Ganzzahl ergibt in der eingetragenen und bereits vorhanden Zeile stehen bleiben, die Restmenge bzw. der Anbruch soll in einer neuen Zeile direkt unter der Ganzzahl dargestellt werden.
Ich hoffe ihr versteht mein Anliegen und danke vorab für eure Unterstützung.
Viele Grüße,
Lars