ich habe mit dem folgenden Code ein Problem.
Er ist dafür da um den Lagerbestand auf zwei Tabellenblättern zu vergleichen.
Als Kriterium wird die Artikelnummer aus der jeweils ersten Spalte herangezogen.
Die Auswertung erfolgt auf einem dritten Blatt.
Dabei wird berücksichtigt das ein Artikel auf dem ersten Blatt auch in mehereren Zeilen vorkommen kann. (Lagerortbedingt)
Wenn ein Artikel auf einem der beiden Blätter komplett fehlt wird er mit entsprechender Differenz ausgegeben. (nix, also 0 zu Bestand auf dem anderen Blatt)
Anschließend wird die Differenz farbig hinterlegt.
Bevor sich der Code ausführt löscht er die Ausgabeseite. (Bis auf die Überschriften natürlich)
Jetzt das Problem. Bei manchen Artikeln funktioniert das nicht. Allerdings sporadisch und ohne erkennbares System. Es werden manchmal Artikel gleichzeitig mit Fehl- als auch Überbestand ausgegeben. Manchmal wird ein zweiter Lagerort auf dem ersten Blatt nicht berücksichtigt.
Hier der Code:
Sub LagerbestandVergleich()
Dim Blatt1 As Worksheet, Blatt2 As Worksheet, AusgabeBlatt As Worksheet
Dim Zeile1 As Long, Zeile2 As Long, AusgabeZeile As Long
Dim Artikel As String
Dim BestandAufBlatt1 As Double
Dim BestandAufBlatt2 As Double
Dim Differenz As Double
Dim ArtikelAufBlatt2 As Boolean
Dim AggregierteArtikel As Object ' Verwenden Sie ein Dictionary
Set AggregierteArtikel = CreateObject("Scripting.Dictionary")
' Definition der Arbeitsblätter (Blatt 1 und Blatt 2 sind die zu vergleichenden Blätter, AusgabeBlatt ist das dritte Blatt)
Set Blatt1 = ThisWorkbook.Sheets("Inventur FG")
Set Blatt2 = ThisWorkbook.Sheets("SGRE SAP")
Set AusgabeBlatt = ThisWorkbook.Sheets("Inventurabgleich")
' Inhalt des Ausgabeblatts löschen (außer Überschriften)
AusgabeBlatt.Rows("2:" & AusgabeBlatt.Rows.Count).Clear
' Anfangszeilen für die zu vergleichenden Blätter und das Ausgabeblatt
Zeile1 = 2 ' Ändere dies entsprechend deiner Blattstruktur
Zeile2 = 2 ' Ändere dies entsprechend deiner Blattstruktur
AusgabeZeile = 2 ' Ändere dies entsprechend deiner Blattstruktur
' Variablen
Artikel = ""
BestandAufBlatt1 = 0
BestandAufBlatt2 = 0
ArtikelAufBlatt2 = False
' Aggregiere die Artikelbestände Zeile für Zeile von Blatt1
Do While Blatt1.Cells(Zeile1, 1).Value > ""
Artikel = Blatt1.Cells(Zeile1, 1).Value
BestandAufBlatt1 = 0
ArtikelAufBlatt2 = False
' Überprüfung ob der Artikel bereits im Dictionary vorhanden ist
If AggregierteArtikel.Exists(Artikel) Then
BestandAufBlatt1 = AggregierteArtikel(Artikel)
End If
' Aggregiere den Bestand für den Artikel auf Blatt1
Do
BestandAufBlatt1 = BestandAufBlatt1 + Blatt1.Cells(Zeile1, 6).Value
Zeile1 = Zeile1 + 1
Loop While Blatt1.Cells(Zeile1, 1).Value = Artikel
AggregierteArtikel(Artikel) = BestandAufBlatt1
' Artikelsuche auf Blatt2
ArtikelAufBlatt2 = False
BestandAufBlatt2 = 0 ' Zurücksetzen des Bestands auf Blatt2
For Zeile2 = 2 To Blatt2.Cells(Rows.Count, 1).End(xlUp).Row
If Blatt2.Cells(Zeile2, 1).Value = Artikel Then
ArtikelAufBlatt2 = True
BestandAufBlatt2 = Blatt2.Cells(Zeile2, 2).Value
Exit For
End If
Next Zeile2
' Berechnung der Differenz, Daten ins Ausgabeblatt schreiben
Differenz = BestandAufBlatt1 - BestandAufBlatt2
' Berechnung der Differenz, Daten ins Ausgabeblatt schreiben
If Differenz > 0 Then
' Überprüfung ob der Artikel bereits in der Ausgabe existiert
If Not ArtikelExistiertInAusgabe(AusgabeBlatt, Artikel, Differenz) Then
AusgabeBlatt.Cells(AusgabeZeile, 1).Value = Artikel
AusgabeBlatt.Cells(AusgabeZeile, 2).Value = Blatt1.Cells(Zeile1, 2).Value
AusgabeBlatt.Cells(AusgabeZeile, 3).Value = BestandAufBlatt1
AusgabeBlatt.Cells(AusgabeZeile, 4).Value = BestandAufBlatt2
AusgabeBlatt.Cells(AusgabeZeile, 5).Value = Differenz
' Formatierung basierend auf der Differenz
If Differenz 0 Then
AusgabeBlatt.Cells(AusgabeZeile, 5).Interior.Color = RGB(255, 192, 192) ' Hellrot
ElseIf Differenz > 0 Then
AusgabeBlatt.Cells(AusgabeZeile, 5).Interior.Color = RGB(192, 255, 192) ' Hellgrün
End If
AusgabeZeile = AusgabeZeile + 1
End If
End If
' Wenn der Artikel auf Blatt1 nicht auf Blatt2 gefunden wurde, zeige dies als Fehlbestand an
If Not ArtikelAufBlatt2 Then
' Überprüfung ob der Artikel bereits in der Ausgabe existiert
If Not ArtikelExistiertInAusgabe(AusgabeBlatt, Artikel, Differenz) Then
AusgabeBlatt.Cells(AusgabeZeile, 1).Value = Artikel
AusgabeBlatt.Cells(AusgabeZeile, 2).Value = Blatt1.Cells(Zeile1, 2).Value
AusgabeBlatt.Cells(AusgabeZeile, 3).Value = BestandAufBlatt1
AusgabeBlatt.Cells(AusgabeZeile, 4).Value = ""
AusgabeBlatt.Cells(AusgabeZeile, 5).Value = Differenz
' Zeile markieren wenn Unterschied
AusgabeBlatt.Cells(AusgabeZeile, 5).Interior.Color = RGB(255, 192, 192) ' Hellrot
AusgabeZeile = AusgabeZeile + 1
End If
End If
Loop
' Überprüfung ob es noch Artikel auf Blatt2 gibt, die nicht auf Blatt1 gefunden wurden
For Zeile2 = 2 To Blatt2.Cells(Rows.Count, 1).End(xlUp).Row
Artikel = Blatt2.Cells(Zeile2, 1).Value
BestandAufBlatt2 = Blatt2.Cells(Zeile2, 2).Value
' Suche den Artikel in den aggregierten Artikeln auf Blatt1
If Not AggregierteArtikel.Exists(Artikel) Then
' Überprüfung ob der Artikel bereits in der Ausgabe existiert
If Not ArtikelExistiertInAusgabe(AusgabeBlatt, Artikel, Differenz) Then
AusgabeBlatt.Cells(AusgabeZeile, 1).Value = Artikel
AusgabeBlatt.Cells(AusgabeZeile, 2).Value = ""
AusgabeBlatt.Cells(AusgabeZeile, 3).Value = 0
AusgabeBlatt.Cells(AusgabeZeile, 4).Value = BestandAufBlatt2
AusgabeBlatt.Cells(AusgabeZeile, 5).Value = -BestandAufBlatt2
' Zeile markieren wenn Unterschied
AusgabeBlatt.Cells(AusgabeZeile, 5).Interior.Color = RGB(255, 192, 192) ' Hellrot
AusgabeZeile = AusgabeZeile + 1
End If
End If
Next Zeile2
End Sub
Function ArtikelExistiertInAusgabe(AusgabeBlatt As Worksheet, Artikel As String, Differenz As Double) As Boolean
Dim Zeile As Long
ArtikelExistiertInAusgabe = False
For Zeile = 2 To AusgabeBlatt.Cells(Rows.Count, 1).End(xlUp).Row
If AusgabeBlatt.Cells(Zeile, 1).Value = Artikel Then
' Der Artikel existiert bereits in der Ausgabe
ArtikelExistiertInAusgabe = True
' Aktualisierung vom Ausgabetext und Formatierung
AusgabeBlatt.Cells(Zeile, 5).Value = Differenz
If Differenz 0 Then
AusgabeBlatt.Cells(Zeile, 5).Interior.Color = RGB(255, 192, 192) ' Hellrot
ElseIf Differenz > 0 Then
AusgabeBlatt.Cells(Zeile, 5).Interior.Color = RGB(192, 255, 192) ' Hellgrün
End If
Exit Function
End If
Next Zeile
End Function
Ich hoffe ihr könnt mir helfen. Es kann gut sein das ich den Wald vor lauter Bäumen nicht mehr sehe.
Gruß