Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1928to1932
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zeilen auf ihre VPE überprüfen + trennen

Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 08:54:43
Lars

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


Userbild

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

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 09:31:17
Matthias
Moin!
Das Problem ist deine Schleife durch alle Zahlen. Habe hier grad kein Excel, deshalb mal aus dem Kopf geschrieben.
Wenn du deine Ausgangszeilen manipulierst (in dem du bspw. Zeilen einfügst) , musst du dievZeilen von unten nach oben durchgehen. LetzteZeile ist ja fest. Durch das Einfügen von Zeilen rutscht dann alles runter. Das witd dann nicht mehr bearbeitet, da es hinter dem Zellwert von letztezeile liegt
Ändere den Schleifenkopf mal so
for i =letztezeile to 11 step -1

VG


AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 10:16:42
Lars
Moin,

danke für deinen Tipp - habe ich direkt umgesetzt. Allerdings ist nun das Problem das die leeren Zeilen welche von unten an bis zur ersten ausgefüllten Zeile ebenfalls geprüft werden und dementsprechend immer folgende Fehlermeldung:

Userbild

Dies hängt ja mit dem folgenden Skript-Bestandteil zusammen:
 '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
Was muss ich umsetzen bzw. ändern das zwar von unten nach oben mit der Schleife begonnen wird allerdings erst in der Zeile welche auch ausgefüllt ist?

Danke vorab und viele Grüße,

Lars


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 11:05:37
UweD
Hallo

versuch es mal so

    Dim letzteZeile As Long
    Dim artikelnummer As Variant
    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
    With wb.Worksheets("Data")
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).Row
    
        'Schleife durch alle Zeilen mit Daten
        For i = letzteZeile To 11 Step -1
            'Die Artikelnummer auslesen
            artikelnummer = .Cells(i, 2).Value
            If artikelnummer > "" Then
                '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 = .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 .Cells(i + 1, 2).Value > artikelnummer Or .Cells(i + 1, 4).Value > "Anbruch" Then
                        neueZeile = i + 1
                        .Rows(neueZeile).Insert Shift:=xlDown
                        
                        'Die Werte für die neue Zeile eintragen
                        .Cells(neueZeile, 1).Value = i - 10 + 1
                        .Cells(neueZeile, 2).Value = artikelnummer
                        .Cells(neueZeile, 3).Value = anbruch
                        .Cells(neueZeile, 4).Value = "Anbruch"
                        .Cells(neueZeile, 5).Value = ""
                    Else 'Ansonsten Anbruchwert in bestehende Anbruchzeile eintragen
                        .Cells(i + 1, 3).Value = anbruch
                    End If
                    
                    'Die Menge in der ursprünglichen Zeile aktualisieren
                    .Cells(i, 3).Value = voll * VPE
                End If
            End If
        Next i
    End With
End Sub
LG UweD


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 11:21:25
Lars
Hey Uwe,

danke für deinen Input, allerdings erscheint mit deiner Lösung die gleiche Checkbox wie mit der Lösung davor obwohl in dem Tabellenblatt "Daten" worauf sich der zuvor ausgeführte S-Verweis bezieht zu den jeweils hinterlegten Artikelnummern eine VPE hinterlegt ist.

Kann es sein das der S-Verweis hier das Problem ist - weil dort wird ja beschrieben das wenn dieser nicht funktioniert bzw. er kein Ergebnis ermittelt er die Menge "0" anzeigen soll.

Und wenn die VPE = "0" ist wird ja die MSG-Box angezeigt.

    'Die Verpackungseinheit aus dem Tabellenblatt "Daten" ermitteln
                VPE = 0
           On Error Resume Next
           VPE = Application.WorksheetFunction.VLookup(artikelnummer, wb.Worksheets("Daten").Range("B2:H6000"), 7, 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
... wäre echt super wenn das klappen würde - Danke euch schonmal für euren Input! :)


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 11:42:04
UweD
Hallo

Evtl. solltest du mal eine Musterdatei hochladen, wo man das Problem nachvollziehen kann

Ja es liegt am Sverweis. Was genau soll denn geschehen?

- Ich sehe das so, dass die Spalte B im Blatt "Data" (nun von unten nach oben) durchlaufen wird
- Ist die Artikelnummer > "" also nicht leer, dann wird der Sverweis ausgeführt
- Der Sverweis sucht die Artikelnummer im Blatt "Daten" in Spalte B und gibt den Wert (jetzt Spalte um 7 versetzt / vorher 6) zurück
- also aus Spalte H
- wenn nun eine Artikelnummer zwar in B gefunden wird, aber kein Eintrag in H dazu vorhanden ist, dann bleibt VPE auf Null und die MSGBOX kommt.

Hast du dort mal nachgesehen?

( Den "on Error " brauchst du nicht )

LG UweD


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 13:01:41
Lars
Hallo,

die Testdatei habe ich dir hochgeladen :) gute Idee!

https://www.herber.de/bbs/user/158880.xlsm

Der S-Verweis soll die Artikelnummern welche im Tabellenblatt "Data" eingetragen wurden (Spalte B) und die dazugehörige Menge (Spalte C) mit den im Tabellenblatt "Daten" hinterlegten Informationen abgleichen. Dort sind wie in der Testdatei verdeutlicht in Spalte B die Materialnummern und in Spalte H die zugehörigen VPEs hinterlegt.

Ich habe hierbei darauf geachtet, dass die Artikel welche ich für den Test benutze, auch eine VPE im Tabellenblatt "Daten" zugeordnet haben.

Danke schonmal für eure Unterstützung und viele Grüße,

Lars


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 13:53:27
UweD
Hallo

Die Fehlerursache:

Die Produktnummern in Data liegen als Zahl bzw. als Text vor.
Auf Blatt Daten als Zahl
Der Sverweis sucht nun den Text, findet den aber nicht (liegt nur als Zahl vor) und meldet den Fehler

durch CLng wird ein möglicher Text erst in eine Zahl umgewandelt und dann klappt es.

Noch ein Tipp
Durch das Reinschreiben in die Zellen von Data wird jedesmal das Change Event ausgelöst.
Also vorher abschalten und später wieder einschalten
Damit es in Irgendeinem Fehlerfall auf jeden Fall wieder eingeschaltet wird, die Fehlerbehandlung drumherum bauen

Sub Artikelnummern_prüfen()
    Dim letzteZeile As Long
    Dim artikelnummer As Variant
    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
    
    On Error GoTo Fehler
    Const APPNAME = "Artikelnummern_prüfen"

    'Letzte Zeile mit Daten in Spalte B ermitteln
    With wb.Worksheets("Data")
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
    
        'Schleife durch alle Zeilen mit Daten
        For i = letzteZeile To 11 Step -1
            'Die Artikelnummer auslesen
            artikelnummer = .Cells(i, 2).Value
            If artikelnummer > "" Then
                'Die Verpackungseinheit aus dem Tabellenblatt "Daten" ermitteln
                VPE = 0
                
                VPE = Application.WorksheetFunction.VLookup(CLng(artikelnummer), wb.Worksheets("Daten").Range("B2:H6000"), 7, False)
                
                '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 = .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
                    Application.EnableEvents = False
                    If .Cells(i + 1, 2).Value > artikelnummer Or .Cells(i + 1, 4).Value > "Anbruch" Then
                        neueZeile = i + 1
                        .Rows(neueZeile).Insert Shift:=xlDown
                        
                        'Die Werte für die neue Zeile eintragen
                        .Cells(neueZeile, 1).Value = i - 10 + 1
                        .Cells(neueZeile, 2).Value = artikelnummer
                        .Cells(neueZeile, 3).Value = anbruch
                        .Cells(neueZeile, 4).Value = "Anbruch"
                        .Cells(neueZeile, 5).Value = ""
                    Else 'Ansonsten Anbruchwert in bestehende Anbruchzeile eintragen
                        .Cells(i + 1, 3).Value = anbruch
                    End If
                    Application.EnableEvents = True
                        
                    'Die Menge in der ursprünglichen Zeile aktualisieren
                    .Cells(i, 3).Value = voll * VPE
                End If
            End If
        Next i
    End With
    '*** Fehlerbehandlung
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number > 0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
        & "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
LG UweD


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
25.04.2023 16:32:26
Lars
Hallo Uwe,

danke für deinen Aufwand - wirklich klasse! :) Ich habe das Skript 1:1 kopiert und in meine Excel eingefügt. Allerdings erscheint jetzt der folgende Fehler.

Userbild

Woran kann es nun liegen?

Danke dir!
LG
Lars


AW: Zeilen auf ihre VPE überprüfen + trennen
26.04.2023 10:58:44
UweD
Hallo

das liegt an den Artikelnummern in Daten
die liegen gemischt vor.

1000001 ist eine Zahl
die beiden Anderen sehen nur so aus, sind aber Text

in Data ggf auch.

Ich hab nun die NORMIERUNG mit eingebaut.

Option Explicit
Sub Artikelnummern_prüfen()
    Dim letzteZeile As Long
    Dim Z1 As Integer
    Dim artikelnummer As Variant
    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
    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = wb.Worksheets("Data")
    Set ws2 = wb.Worksheets("Daten")
    
    On Error GoTo Fehler
    Const APPNAME = "Artikelnummern_prüfen"

    
    'Formate angleichen (Textzahlen zu Zahlen)
     With ws2
        Z1 = 2 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
    End With
    
    With ws1
        Z1 = 11 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
        
        'Schleife durch alle Zeilen mit Daten
        For i = letzteZeile To Z1 Step -1
            'Die Artikelnummer auslesen
            artikelnummer = .Cells(i, 2).Value
            If artikelnummer > "" Then
                'Die Verpackungseinheit aus dem Tabellenblatt "Daten" ermitteln
                VPE = 0
                
                VPE = Application.WorksheetFunction.VLookup(artikelnummer, ws2.Range("B2:H6000"), 7, False)
                
                '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 = .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
                    Application.EnableEvents = False
                    If .Cells(i + 1, 2).Value > artikelnummer Or .Cells(i + 1, 4).Value > "Anbruch" Then
                        neueZeile = i + 1
                        .Rows(neueZeile).Insert Shift:=xlDown
                        
                        'Die Werte für die neue Zeile eintragen
                        .Cells(neueZeile, 1).Value = i - 10 + 1
                        .Cells(neueZeile, 2).Value = artikelnummer
                        .Cells(neueZeile, 3).Value = anbruch
                        .Cells(neueZeile, 4).Value = "Anbruch"
                        .Cells(neueZeile, 5).Value = ""
                    Else 'Ansonsten Anbruchwert in bestehende Anbruchzeile eintragen
                        .Cells(i + 1, 3).Value = anbruch
                    End If
                    Application.EnableEvents = True
                        
                    'Die Menge in der ursprünglichen Zeile aktualisieren
                    .Cells(i, 3).Value = voll * VPE
                End If
            End If
        Next i
    End With
    '*** Fehlerbehandlung
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number > 0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
        & "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
LG uweD


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
27.04.2023 13:18:09
Lars
Guten Morgen Uwe,

es funktioniert nun - ich bin begeistert :) Ich habe das Skript in die "Live" Version eingebaut und dort ausgiebig getestet. Klappt alles - vielen Dank!
Eins ist mir noch aufgefallen - und zwar in der Spalte A11 (A12,A13,A14 usw.) soll jede Zeile mit 10ner Schritten addiert werden. Sodass Spalte A11 = 10, A12 = 20, A13 = 30 usw.
Nun wird mir nach dem Einfügen der neuen Spalte immer eine 2 oder 3 oder 4 dort ausgegeben: (siehe Bild.)

Userbild

Um es weniger kompliziert zu halten wollte ich am Ende des bereits vorhandenen Skriptes eine Schleife einbauen welche die Nummerierung dort nochmals überarbeitet. Dies habe ich wie folgt gelöst:

'Zehnerschritte in Spalte A ab A11 nummerieren
Dim nummer As Long
nummer = 10
For i = 11 To 192 Step 10
    ws2.Cells(i, 1).Value = nummer
    nummer = nummer + 10
Next i
Wenn ich das einfüge passiert leider nichts - gibt es hierfür ein allgemeines Vorgehen?

Danke vorab und erneut viele Grüße,

Lars


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
27.04.2023 14:05:36
UweD
Hallo nochmal

die Nummerierung kommt aus deiner Vorgabe
.Cells(neueZeile, 1).Value = i - 10 + 1


Wenn du es nachher neu zuweisen willst...
Das ganze geschieht ja auf Ws1 und nicht wie bei dir angegeben auf ws2

, dann geht aber auch ohne Schleife schneller
        'Zehnerschritte in Spalte A ab A11 nummerieren
        letzteZeile = .Cells(.Rows.Count, 1).End(xlUp).row
        With .Cells(Z1, 1).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .FormulaR1C1 = "=ROW(R[-10]C)*" & nummer
            .Value = .Value
        End With
hab's mit eingebaut

Option Explicit
Sub Artikelnummern_prüfen()
    On Error GoTo Fehler
    
    Const APPNAME = "Artikelnummern_prüfen"
    
    Dim letzteZeile As Long
    Dim Z1 As Integer
    Dim artikelnummer As Variant
    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
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim nummer As Long
    
    Set wb = ThisWorkbook
    Set ws1 = wb.Worksheets("Data")
    Set ws2 = wb.Worksheets("Daten")
        
    nummer = 10

    'Formate angleichen (Textzahlen zu Zahlen)
     With ws2
        Z1 = 2 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
    End With
    
    With ws1
        Z1 = 11 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
        
        'Schleife durch alle Zeilen mit Daten
        For i = letzteZeile To Z1 Step -1
            'Die Artikelnummer auslesen
            artikelnummer = .Cells(i, 2).Value
            If artikelnummer > "" Then
                'Die Verpackungseinheit aus dem Tabellenblatt "Daten" ermitteln
                VPE = 0
                
                VPE = Application.WorksheetFunction.VLookup(artikelnummer, ws2.Range("B2:H6000"), 7, False)
                
                '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 = .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
                    Application.EnableEvents = False
                    If .Cells(i + 1, 2).Value > artikelnummer Or .Cells(i + 1, 4).Value > "Anbruch" Then
                        neueZeile = i + 1
                        .Rows(neueZeile).Insert Shift:=xlDown
                        
                        'Die Werte für die neue Zeile eintragen
                        '.Cells(neueZeile, 1).Value = i - 10 + 1 'brauchst du nicht mehr
                        .Cells(neueZeile, 2).Value = artikelnummer
                        .Cells(neueZeile, 3).Value = anbruch
                        .Cells(neueZeile, 4).Value = "Anbruch"
                        .Cells(neueZeile, 5).Value = ""
                    Else 'Ansonsten Anbruchwert in bestehende Anbruchzeile eintragen
                        .Cells(i + 1, 3).Value = anbruch
                    End If
                    Application.EnableEvents = True
                        
                    'Die Menge in der ursprünglichen Zeile aktualisieren
                    .Cells(i, 3).Value = voll * VPE
                End If
            End If
        Next i
        
        'Zehnerschritte in Spalte A ab A11 nummerieren
        letzteZeile = .Cells(.Rows.Count, 1).End(xlUp).row
        With .Cells(Z1, 1).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .FormulaR1C1 = "=ROW(R[-10]C)*" & nummer
            .Value = .Value
        End With
    End With
    '*** Fehlerbehandlung
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number > 0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
        & "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
LG UweD


Anzeige
AW: Zeilen auf ihre VPE überprüfen + trennen
27.04.2023 14:33:07
Lars
Hallo Uwe,

vielen lieben Dank! Das funktioniert ebenfalls :)
Ich hätte noch eine letzte Frage. Und zwar ist mir in der Testphase aufgefallen das vereinzelt auch Mengen in dieser Tabelle bearbeitet werden, welche sich unterhalb der definierten VPE befinden.

Dann trennt das Skript allerdings auch die Zeile auf und nullt die Anbruch Position und erstellt eine neue Zeile mit der Anbruchmenge. (siehe Bild.)

Userbild

Artikel 2003144 = VPE 480 Stück

Hierbei soll allerdings die Zeile beibehalten werden, da ja kein Split nötig ist :) ist so etwas auch noch innerhalb dieser VBA-Lösung möglich?


AW: Zeilen auf ihre VPE überprüfen + trennen
27.04.2023 15:33:06
UweD
Hallo

das wir mir jetzt zu aufwändig...

Das kommt ggf vor, wenn die Artikelnummer darunter = Leer ist

bzw.
Du musst noch abfangen, voll=0 und anbruch>0 und D noch leer

Versuch das mal zu verstehen, indem du mit F8 im Einzelschrittmodus durchgehst und die Werte der Variablen im Überwachungsfenster anzeigen lässt

LG UweD


AW: Zeilen auf ihre VPE überprüfen + trennen
27.04.2023 16:04:01
Lars
Hallo Uwe,

das verstehe ich - du hast mir echt geholfen. Ich habe anhand deines Vorschlages mich mit F8 durch das Skript durchgeklickt, allerdings wird mir aufgrund der Schleife der genaue Punkt wo der "Fehler" passiert nicht ersichtlich.

Evtl. hat jemand anderes im Forum ja eine Idee wie man es umsetzen könnte?

Danke vorab und viele Grüße,

Lars


AW: Zeilen auf ihre VPE überprüfen + trennen
03.05.2023 15:22:27
Lars
Hallo Forum,

ich habe das bearbeitete Skript nun ja in meine Original-Datei eingepflegt und dieses auch mit mehr Zeilen ausprobiert. Hier ist das Problem das sobald die 8 Zeile also Zellenbereich "B18" hinzufüge und das Skript ausführe, der folgende Fehler erscheint "Fehler in Sub "Artikelnummer prüfen" Fehlernummer 6 Überlauf".

Hier liegt das Problem nicht an der verwendeten Artikelnummer, ich habe diese in willkürlichen Stichproben durch andere ersetzt und hatte das selbe Problem. Ebenfalls funktionieren diese Artikelnummern im Zellenbereich "B11-B17" problemlos.

Habt ihr eine Idee woran das liegen könnte? Ich bin ratlos, weil ich dachte ich hätte das Thema bereits abgeschlossen ...

Danke für eure Hilfe vorab!
LG
Lars

Option Explicit
Sub Artikelnummern_prüfen_Anbruch_rausfiltern()
    On Error GoTo Fehler
    
    Const APPNAME = "Artikelnummern_prüfen"
    
    Dim letzteZeile As Long
    Dim Z1 As Integer
    Dim artikelnummer As Variant
    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
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim nummer As Long
    
    Set wb = ThisWorkbook
    Set ws1 = wb.Worksheets("Data")
    Set ws2 = wb.Worksheets("Daten")
        
    nummer = 10

    'Formate angleichen (Textzahlen zu Zahlen)
     With ws2
        Z1 = 2 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
    End With
    
    With ws1
        Z1 = 11 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
        
        'Schleife durch alle Zeilen mit Daten
        For i = letzteZeile To Z1 Step -1
            'Die Artikelnummer auslesen
            artikelnummer = .Cells(i, 2).Value
            If artikelnummer > "" Then
                'Die Verpackungseinheit aus dem Tabellenblatt "Daten" ermitteln
                VPE = 0
                
                VPE = Application.WorksheetFunction.VLookup(artikelnummer, ws2.Range("B2:H6000"), 7, False)
                
                '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 = .Cells(i, 3).Value
                'Die Menge ist kleiner als die VPE
                
                
                '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
                    Application.EnableEvents = False
                    If .Cells(i + 1, 2).Value > artikelnummer Or .Cells(i + 1, 4).Value > "Anbruch" Then
                        neueZeile = i + 1
                        .Rows(neueZeile).Insert Shift:=xlDown
                        
                        'Die Werte für die neue Zeile eintragen
                        '.Cells(neueZeile, 1).Value = i - 10 + 1 'brauchst du nicht mehr
                        .Cells(neueZeile, 2).Value = artikelnummer
                        .Cells(neueZeile, 3).Value = anbruch
                        .Cells(neueZeile, 4).Value = "Anbruch"
                        .Cells(neueZeile, 5).Value = ""
                    Else 'Ansonsten Anbruchwert in bestehende Anbruchzeile eintragen
                        .Cells(i + 1, 3).Value = anbruch
                    End If
                    Application.EnableEvents = True
                        
                    'Die Menge in der ursprünglichen Zeile aktualisieren
                    .Cells(i, 3).Value = voll * VPE
                End If
            End If
        Next i
        
        'Zehnerschritte in Spalte A ab A11 nummerieren
        letzteZeile = .Cells(.Rows.Count, 1).End(xlUp).row
        With .Cells(Z1, 1).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .FormulaR1C1 = "=ROW(R[-10]C)*" & nummer
            .Value = .Value
        End With
    End With
    '*** Fehlerbehandlung
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number > 0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
        & "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub




AW: Zeilen auf ihre VPE überprüfen + trennen
03.05.2023 15:36:10
Lars
Hallo liebes Forum,

ich habe den Code nun in meine Original Excel-Datei eingearbeitet und dieser funktioniert auch wie er soll. Allerdings habe ich nun festgestellt, das wenn ich mehrere Zeilen eintrage und hierbei die VPE prüfe und ggf. trenne sich immer im Zellenbereich "B18" der folgende Fehler ereignet --> Fehler in Sub "Artikelnummer_prüfen" Fehlernummer 6 Überlauf.
Die Zeilen davor werden noch wie gewollt bearbeitet - danach leider aufgrund des Fehlers nicht mehr.

Ich bin der Meinung das sich der Fehler Explizit auf die Zeile "B18" bezieht. Die Vermutung beruht darauf, das wenn die Zeile "B18 nicht ausgefüllt ist und z. B. weniger Zeilen in die Maske eingetragen sind, alles ganz normal und wie gewollt funktioniert.

Habt ihr eine Lösung woran das liegen könnte?

Der Code lautet aktuell wie folgt:

Option Explicit
Sub Artikelnummern_prüfen_Anbruch_rausfiltern()
    On Error GoTo Fehler
    
    Const APPNAME = "Artikelnummern_prüfen"
    
    Dim letzteZeile As Long
    Dim Z1 As Integer
    Dim artikelnummer As Variant
    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
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim nummer As Long
    
    Set wb = ThisWorkbook
    Set ws1 = wb.Worksheets("Data")
    Set ws2 = wb.Worksheets("Daten")
        
    nummer = 10

    'Formate angleichen (Textzahlen zu Zahlen)
     With ws2
        Z1 = 2 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
    End With
    
    With ws1
        Z1 = 11 'Erste Datenzeile
        
        'Letzte Zeile mit Daten in Spalte B ermitteln
        letzteZeile = .Cells(.Rows.Count, 2).End(xlUp).row
        
        With .Cells(Z1, 2).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .Value = .Value
            Application.EnableEvents = True
        End With
        
        'Schleife durch alle Zeilen mit Daten
        For i = letzteZeile To Z1 Step -1
            'Die Artikelnummer auslesen
            artikelnummer = .Cells(i, 2).Value
            If artikelnummer > "" Then
                'Die Verpackungseinheit aus dem Tabellenblatt "Daten" ermitteln
                VPE = 0
                
                VPE = Application.WorksheetFunction.VLookup(artikelnummer, ws2.Range("B2:H6000"), 7, False)
                
                '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 = .Cells(i, 3).Value
                'Die Menge ist kleiner als die VPE
                
                
                '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
                    Application.EnableEvents = False
                    If .Cells(i + 1, 2).Value > artikelnummer Or .Cells(i + 1, 4).Value > "Anbruch" Then
                        neueZeile = i + 1
                        .Rows(neueZeile).Insert Shift:=xlDown
                        
                        'Die Werte für die neue Zeile eintragen
                        '.Cells(neueZeile, 1).Value = i - 10 + 1 'brauchst du nicht mehr
                        .Cells(neueZeile, 2).Value = artikelnummer
                        .Cells(neueZeile, 3).Value = anbruch
                        .Cells(neueZeile, 4).Value = "Anbruch"
                        .Cells(neueZeile, 5).Value = ""
                    Else 'Ansonsten Anbruchwert in bestehende Anbruchzeile eintragen
                        .Cells(i + 1, 3).Value = anbruch
                    End If
                    Application.EnableEvents = True
                        
                    'Die Menge in der ursprünglichen Zeile aktualisieren
                    .Cells(i, 3).Value = voll * VPE
                End If
            End If
        Next i
        
        'Zehnerschritte in Spalte A ab A11 nummerieren
        letzteZeile = .Cells(.Rows.Count, 1).End(xlUp).row
        With .Cells(Z1, 1).Resize(letzteZeile - Z1 + 1, 1)
            Application.EnableEvents = False
            .FormulaR1C1 = "=ROW(R[-10]C)*" & nummer
            .Value = .Value
        End With
    End With
    '*** Fehlerbehandlung
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number > 0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
        & "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub



Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige