Lagerartikel austragen - Neues Problem

  • Excel

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Lagerartikel austragen - Neues Problem

    Hallo, ich habe erneut ein Problem, welches für euch wahrscheinlich garkeins ist.

    Und zwar habe ich ein Programm geschrieben welches beim klicken auf einen Button, eine SAP Nummer im Feld über dem Button, kopiert in eine Liste und die Anzahl der entnommenen Artikel um 1 erhöhen soll. Bevor man zu dieser UserForm kommt habe ich eine UserForm in der man seinen Namen und die Maschine, für die die Teile benötigt werden, einträgt. Dies stehen dann im Blatt "ID_Speicher" in der Zelle G2 und H2.

    Mein Problem ist nun, das die Liste beim ersten Benutzer der etwas auf der Liste einträgt (Name z.B. Thomas) die Liste schön um 1 erhöht..
    Beispiel:

    Thomas scannt für Maschine1:

    123456
    123456
    123456
    111111
    222222
    222222

    nun sieht die Liste wie folgt aus:

    SAP Nummer
    Anzahl entnommen (gescannt)Name
    Maschine
    123456
    3
    Thomas
    Maschine1
    111111
    1
    Thomas
    Maschine1
    222222
    2
    Thomas
    Maschine1

    soweit so gut. Beendet man nun Excel und startet es neu (um einen neuen Name / Maschine) einzugeben und startet es neu und beginnt wieder einzutragen,

    Beispiel Fortsetzung:

    David scannt für Maschine2

    123456
    123456
    111111
    111111
    333333

    dann sollte die Liste so aussehen:

    SAP Nummer
    Anzahl entnommene (gescannte)
    Name
    Maschine
    123456
    3
    Thomas
    Maschine1
    111111
    1
    ThomasMaschine1
    222222
    2
    Thomas
    Maschine1
    123456
    2
    David
    Maschine2
    111111
    2
    David
    Maschine2
    333333
    1
    DavidMaschine2

    nun kann das Programm wieder beendet werden und der nächste kann wieder Scannen, scannt Thomas jetzt wieder 123456 für Maschine 2 soll dies auch wiederum 1 mal in eine nächste Zeile eingetragen werden, scannt er allerdings 123456 für MAschine 1 soll es oben um eins erhöht werden.

    Hier mein Code für den Buttonklick:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. 'Offsets:
    3. 'Cell Offset 0,0 = SAP Nummer
    4. 'Cell Offset 0,1 = Entnommene Anzahl
    5. 'Cell Offset 0,2 = Beschreibung
    6. 'Cell Offset 0,3 = Lieferanten Artikelnummer
    7. 'Cell Offset 0,4 = LG-Ort
    8. 'Cell Offset 0,5 = LPlatz
    9. 'Cell Offset 0,6 = Name
    10. 'Cell Offset 0,7 = Maschine
    11. If TextBox1.Text = "" Then
    12. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    13. Else
    14. 'Sucht nach SAP-Nummer
    15. Set Cell = Worksheets("Ausgetragen").Range("A:A").Find(TextBox1.Text)
    16. 'Wenn SAP Nummer nicht vorhanden dann
    17. If Cell Is Nothing Then
    18. 'Füge in der Zelle unter der letzten SAP Nummer (...)
    19. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    20. '(...) die neue SAP Nummer ein
    21. Cell.Value = TextBox1.Text
    22. 'Setze die Entnommene Anzahl auf 0
    23. Cell.Offset(0, 1).Value = 0
    24. 'Setze den Namen auf den aktuellen Nutzer
    25. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    26. 'Setze die Maschine auf die aktuelle Maschine
    27. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    28. 'Sonst, Wenn SAP Nummer schon vorhanden dann
    29. Else
    30. 'Vorausgesetzt der Name in der Namenszelle ist gleich der aktuelle Benutzer dann (...)
    31. If Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value Then
    32. '(...) Erhöhe die entnommen Anzahl um 1
    33. Cell.Offset(0, 1).Value = Cell.Offset(0, 1).Value + 1
    34. 'Falls der Name nicht gleich der aktuelle Nutzer ist dann(...)
    35. Else
    36. 'Füge in der Zelle unter der letzten SAP Nummer (...)
    37. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    38. '(...) die neue SAP Nummer ein
    39. Cell.Value = TextBox1.Text
    40. 'Setze die Entnommene Anzahl auf 0
    41. Cell.Offset(0, 1).Value = 0
    42. 'Setze den Namen auf den aktuellen Nutzer
    43. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    44. 'Setze die Maschine auf die aktuelle Maschine
    45. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    46. End If
    47. End If
    48. TextBox1.Text = ""
    49. TextBox1.SetFocus
    50. End If
    51. End Sub


    Ich hoffe ihr versteht mein Problem wenigstens ein bisschen.

    Danke für eure Antworten!

    Gruß David!
    Erzeuge dir (meinetwegen in einer gesonderten Spalte) einen Schlüssel aus den Feldern, die für einen eindeutigen Update notwendig sind.
    Wird der Schlüssel gefunden, wird hochgezählt, wird er nicht gefunden, wird ein neuer Eintrag erzeugt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke für die schnelle Antwort,

    du meinst das ich in einer Spalte neben den Zellen eine Kombination aus SAP Nummer, Name, Maschine usw zusammenstelle? Zum Beispiel:

    SAP NrAnzahlNameMaschineKombi
    1234563DavidTest1123456_David_Test1

    oder wie? (Sorry, wie gesagt, bin absoluter Anfänger in VBA)
    also so:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. If TextBox1.Text = "" Then
    3. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    4. Else
    5. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text) & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text
    6. If Cell Is Nothing Then
    7. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    8. Cell.Value = TextBox1.Text
    9. Cell.Offset(0, 1).Value = 0
    10. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    11. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    12. End If
    13. Cell.Offset(0, 1).Value = Cell.Offset(0, 1).Value + 1
    14. TextBox1.Text = ""
    15. TextBox1.SetFocus
    16. End If
    17. End Sub


    dann bekomme ich einen Laufzeitfehler 91 "Objektvariable oder with-Blockvariable nicht festgelegt" in folgender Zeile:

    Visual Basic-Quellcode

    1. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text) & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text
    Danke, hätte ich auch selbst drauf kommen können.

    Fehlermeldung ist weg, aber er trägt trotzdem noch alles Untereinander ein (Menge 1)

    SAPNrAnzahlNameMaschineSchlüssel
    1234561ChrisTest1123456_Chris_Test1
    1234561ChrisTest1123456_Chris_Test1

    Hier nochmal der Code:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. If TextBox1.Text = "" Then
    3. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    4. Else
    5. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text)
    6. If Cell Is Nothing Then
    7. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    8. Cell.Value = TextBox1.Text
    9. Cell.Offset(0, 1).Value = 0
    10. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    11. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    12. End If
    13. Cell.Offset(0, 1).Value = Cell.Offset(0, 1).Value + 1
    14. TextBox1.Text = ""
    15. TextBox1.SetFocus
    16. End If
    17. End Sub
    Dann musst du mit dem Debugger durch und schauen warum nach dem .Find Cell Nothing ist.
    Evtl. musst du beim Find noch LookIn:=xlValues und LookAt:=xlWhole angeben.
    Aber das dürfte bei dem von dir geschilderten Effekt eigentlich nicht die Ursache sein.
    Ich denke eher, dass der FindString nicht richtig zusammengebaut wird.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. If TextBox1.Text = "" Then
    3. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    4. Else
    5. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text, LookIn:=xlValues)
    6. If Cell Is Nothing Then
    7. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    8. Cell.Value = TextBox1.Text
    9. Cell.Offset(0, 1).Value = 0
    10. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    11. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    12. End If
    13. Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1
    14. TextBox1.Text = ""
    15. TextBox1.SetFocus
    16. End If
    17. End Sub


    So funktionierts jetzt, bereits vorhandene werden um 1 erhöht,
    aber bei neuen bringt er einen "Anwendungs oder objektorienterten Fehler" in der Zeile

    Visual Basic-Quellcode

    1. Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1


    erstellt jedoch trotzdem eine neue Zeile, aber mit Anzahl 0 statt 1..
    Klar.
    Wenn Cell gefunden wird, zeigt sie auf Spalte 9.
    Wenn sie nicht gefunden wird, suchst du die letzte Zelle in Spalte 1.
    Damit stimmen deine Offsets nicht mehr.

    Entweder du verwendest ​Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 9).End(xlUp).Offset(1) und passt die Offsets im If-Zweig an.
    Oder du verwendest einen Else-Zweig für den "gefunden"-Fall und setzt den Wert von Spalte 2 im If-Zweig auf 1.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    d4vidh4ll3r schrieb:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. If TextBox1.Text = "" Then
    3. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    4. Else
    5. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text, LookIn:=xlValues)
    6. If Cell Is Nothing Then
    7. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    8. Cell.Value = TextBox1.Text
    9. Cell.Offset(0, 1).Value = 0
    10. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    11. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    12. End If
    13. Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1
    14. TextBox1.Text = ""
    15. TextBox1.SetFocus
    16. End If
    17. End Sub


    So funktionierts jetzt, bereits vorhandene werden um 1 erhöht,
    aber bei neuen bringt er einen "Anwendungs oder objektorienterten Fehler" in der Zeile

    Visual Basic-Quellcode

    1. Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1


    erstellt jedoch trotzdem eine neue Zeile, aber mit Anzahl 0 statt 1..


    d4vidh4ll3r schrieb:

    If Cell Is Nothing Then

    Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)

    Cell.Value = TextBox1.Text

    Cell.Offset(0, 1).Value = 0

    Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value

    Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value

    End If

    Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1


    d4vidh4ll3r schrieb:

    So funktionierts jetzt, bereits vorhandene werden um 1 erhöht,


    wenn cell = nothing, dann kann man sich schwerlich auf cell beziehen, der Offset geht ins Leere

    ausserdem wird Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1 immer ausgeführt,
    ob cell = (nothing or (not nothing))

    das scheint eine neuartige Logik zu sein ...
    denn das hat einen fehler zur folge, wenn cell nicht bestimmt ist

    im übrigen würde ich auch mal versuchen, "cell" als irgendwas zu deklarieren, vielleicht als range
    und das pattern kann man auch in eine variant-variable setzen und nicht so in die suchzeile klatschen

    ausserdem habe ich etwas zweifel, ob deine Beschreibung dessen, was da zuletzt vorgehen soll, dasjenige korrekt widerspiegelt, was durch deinen zuletzt geposteten code repräsentiert ist

    Visual Basic-Quellcode

    1. If Cell Is Nothing Then
    2. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 9).End(xlUp).Offset(1)
    3. Cell.Value = TextBox1.Text
    4. Cell.Offset(0, -7).Value = 0
    5. Cell.Offset(0, -2).Value = Worksheets("ID_Speicher").Range("F2").Value
    6. Cell.Offset(0, -1).Value = Worksheets("ID_Speicher").Range("G2").Value
    7. Cell.Formula = Cell.Offset(-1).Formula
    8. End If
    9. Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1


    rx13 schrieb:

    im übrigen würde ich auch mal versuchen, "cell" als irgendwas zu deklarieren, vielleicht als range
    Im Original war Cell meines Wissens als Range deklariert.
    Das ist aber nicht das Problem, da .Find automatisch einen Range zurückgibt.

    rx13 schrieb:


    und das pattern kann man auch in eine variant-variable setzen und nicht so in die suchzeile klatschen
    Einverstanden, aber dann bitte nicht als Variant, sondern als String.
    Aber wie ich das sehe, ist der TE damit noch überfordert.
    Diese Art von Unschönheiten ziehen sich durchs ganze Programm.

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Richtig, ich bin damit überfordert, wie gesagt --> Anfänger.

    Aber ich wills trotzdem ein wenig verstehen. Hier der Code wie ich ihn aktuell geändert habe, jedoch geschieht jetzt gar nichts mehr.. weder Fehlermeldung noch wird die TextBox wieder geleert, oder übertragen.

    Wahrscheinlich hast du mir da wieder absichtlich nen Fehler rein gebaut, mal sehn ob ich ihn finde, wenn nicht darfst du mir gerne weiterhelfen.

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. If TextBox1.Text = "" Then
    3. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    4. Else
    5. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text, LookIn:=xlValues)
    6. If Cell Is Nothing Then
    7. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 9).End(xlUp).Offset(1)
    8. Cell.Value = TextBox1.Text
    9. Cell.Offset(0, -7).Value = 0
    10. Cell.Offset(0, -2).Value = Worksheets("ID_Speicher").Range("F2").Value
    11. Cell.Offset(0, -1).Value = Worksheets("ID_Speicher").Range("G2").Value
    12. Cell.Formula = Cell.Offset(-1).Formula
    13. End If
    14. Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1
    15. End If
    16. End Sub


    ausserdem wird Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1 immer ausgeführt, ob cell = (nothing or (not nothing))


    Stimmt doch auch, egal ob der Schlüssel nicht gefunden wurde, oder gefunden wurde, soll VBA beim Ergebnis (wenn nicht gefunden in der nächsten Zeile eben) die entnommene Anzahl um +1 erhöhen.

    Also ist dies keine neuartige Logik, sondern einfach richtig.

    Egal was bei der Suche rauskommt, immer beim Ergebnis +1 - Kann aber auch sein das ich dich gerade falsch verstehe.

    Edit:

    So konnte ich den Fehler beheben, das die SAP Nummer nicht ausgetragen wird:

    Visual Basic-Quellcode

    1. Cell.Offset(0, -8) = TextBox1.Text
    2. Cell.Offset(0, -7).Value = 0
    3. Cell.Offset(0, -2).Value = Worksheets("ID_Speicher").Range("F2").Value
    4. Cell.Offset(0, -1).Value = Worksheets("ID_Speicher").Range("G2").Value
    5. Cell.Formula = Cell.Offset(-1).Formula


    Jedoch schreibt er die Liste nicht von oben weiter, sondern ab da, wo ich keine Formel für den Schlüssel hinterlegt hab.

    Edit 2:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. If TextBox1.Text = "" Then
    3. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    4. Else
    5. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text, LookIn:=xlValues)
    6. If Cell Is Nothing Then
    7. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    8. Cell.Value = TextBox1.Text
    9. Cell.Offset(0, 1).Value = 0
    10. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    11. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    12. Cell.Formula = Cell.Offset(-1).Formula
    13. End If
    14. Cell.Value = TextBox1.Text
    15. Cell.Offset(0, -7).Value = Cell.Offset(0, -7).Value + 1
    16. End If
    17. TextBox1.Text = ""
    18. End Sub


    So funktioniert es jetzt, außer das er bei bereits vorhandenen also Wenn Cell = Not Nothing, immer die Spalte 9 überschreibt, nicht Spalte 2 um 1 erhöht..

    Wie bestimme ich jetzt das das Offset von Spalte 1 aus gezählt wird?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „d4vidh4ll3r“ ()

    Das Problem ist, dass du hier mit Zelladressen und Textbox-Inhalten arbeitest, von denen ich nur ahnen kann, was sich dahinter verbirgt.
    Da kann man schon mal den Überblick verlieren, wenn man sich das Ganze im Kopf abbilden muss.
    Wie schon angedeutet, wären da sprechende Variablennamen ein echter Segen.

    Aber im Gegensatz zu mir hast du ein Excel zur Verfügung, hast die Funktionalität und kannst alles Schritt für Schritt im Debugger durchsteppen.
    Da müsste sich ganz doch schnell rausstellen, wo etwas nicht so tut wie von dir erwartet.

    d4vidh4ll3r schrieb:

    Jedoch schreibt er die Liste nicht von oben weiter, sondern ab da, wo ich keine Formel für den Schlüssel hinterlegt hab.
    Das ist mir heute morgen noch zu hoch, vielleicht magst du erklären, was du mit diesem Satz meinst?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich kann dir am besten vielleicht einfach mal die Excel Datei schicken? Irgendwie? Dann hast dus vor Augen...

    Ich hab den Code jetzt genau so:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. If TextBox1.Text = "" Then
    3. MsgBox "Bitte SAP-Nummer eintragen!", vbInformation, "Hinweis"
    4. Else
    5. Set Cell = Worksheets("Ausgetragen").Range("I:I").Find(TextBox1.Text & "_" & Worksheets("ID_Speicher").Range("F2").Text & "_" & Worksheets("ID_Speicher").Range("G2").Text, LookIn:=xlValues)
    6. If Cell Is Nothing Then
    7. Set Cell = Worksheets("Ausgetragen").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    8. Cell.Value = TextBox1.Text
    9. Cell.Offset(0, 1).Value = 0
    10. Cell.Offset(0, 6).Value = Worksheets("ID_Speicher").Range("F2").Value
    11. Cell.Offset(0, 7).Value = Worksheets("ID_Speicher").Range("G2").Value
    12. Cell.Formula = Cell.Offset(8).Formula
    13. End If
    14. Cell.Offset(0, -8).Value = Cell.Offset(0, -8).Value + 1
    15. End If
    16. TextBox1.Text = ""
    17. End Sub


    Jetzt bekomme ich ständig irgendwelche Fehlermeldungen, ich glaub jetzt hab ichs zerstört 8| ..

    Vielleicht ist es echt das beste, wenn ich dir die Datei schicke..

    d4vidh4ll3r schrieb:

    Vielleicht ist es echt das beste, wenn ich dir die Datei schicke..
    Kannst du machen, hänge sie einfach an einen Post an.
    Ich bin allerdings derzeit unterwegs und habe kein Excel zur Verfügung.
    Ich kann höchstens am Wochenende mal reinschauen und eine elegante Lösung einbauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --