Excel Sheet nach mehreren Kriterien durchsuchen (Combobox)

  • Excel

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

    Excel Sheet nach mehreren Kriterien durchsuchen (Combobox)

    Hallo Community,

    ich bastele gerade an einer kleine Art Lagerführung und habe ein kleines Problem bezüglich der Suche und Zuordnung von den Lagerplätzen.
    In der Anwendung wählt er über Comboxen um welchen Artikel es sich handel. Dabei gibt es 3 Comboboxen die somit eindeutig zum Artikel führen.
    Der Artikel ist momentan auch nur einem Lagerplatz zugeordnet.
    Kriterium 1 steht in Spalte A | Kriterium 2 in Spalte B | Kriterium 3 in Spalte C.
    Nun wählt er die Kriterien aus und an Hand dieser Auswahl muss der exakte Lagerplatz ermittelt werden (also in diesem Fall die Zeile im Excel Sheet wo dieser Artikel sich befindet).
    Die Artikel verteilen sich auf mehreren Tabellenblätter, um da jedes Sheet eine Lagerreihe abbildet. Demnach müsste auch alle Sheets durchsucht werden.

    Im nächsten Schritt kann dann eine Menge hinzu-oder abgebucht werden, aber das bekomme ich glaube hin.
    Mir geht es hier um den Suchbefehl, um durch diese 3 Kriterien die jeweilige Zeile im Sheet zu ermitteln.
    Ich habe schon mehrere verschiedene Ansätze gelesen, aber keiner geht über mehrere Tabellenblätter. Über mehrere IF schleifen wollte ich das nicht lösen,
    da es vermutlich sehr ineffektiv wäre.
    Ich hoffe Ihr könnt mir hier weiterhelfen.
    Vielen Dank

    Den Code für die Suche habe ich schon, aber irgendwie funktioniert er noch nicht 100%
    Für "For i=1 to 5" funktioniert es, aber wenn ich anstatt "to 5" dann "UBound(RanBereich)" eingebe, dann geht es nicht mehr.
    Weiterhin wird hier nur ein Sheet durchsucht. Wie kann man es für mehrere Sheets übertragen und das dann auch das
    richtige Sheet und Zeile ausgegeben wird.

    Visual Basic-Quellcode

    1. Sub Suche_Lager()
    2. Dim t As Single
    3. Dim zelle As Range
    4. Dim ranBereich As Variant
    5. Dim i As Long
    6. Dim ZeileNr As String
    7. t = Timer
    8. Dim Text1 As String
    9. Dim Text2 As String
    10. Dim Gang_A As Worksheet
    11. Dim iRow As Long
    12. With Worksheets("A")
    13. Set ranBereich = .Range("A1", "L" & (.Cells(.Rows.Count, "E").End(xlUp).Row))
    14. End With
    15. For i = 1 To 5
    16. If ranBereich(i, 4) = Me.cboHolzart1.Value Then
    17. If ranBereich(i, 5) = Me.cboProduktart1.Text Then
    18. If ranBereich(i, 6) = Me.cboStaerke1.Text Then
    19. If ranBereich(i, 7) = Me.cboOberflaeche1.Text Then
    20. ZeileNr = i
    21. End If
    22. End If
    23. End If
    24. End If
    25. Next
    26. If ZeileNr <> "" Then
    27. MsgBox ZeileNr, vbCritical + vbOKOnly
    28. Else
    29. MsgBox "Nicht gefunden!"
    30. End If
    31. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TeamBob“ ()

    Der performanteste Weg ist über eine Hilfsspalte, in der du die vier Such-Spalten verkettest.
    In dieser Spalte kannst du mit VBA Find oder auch innerhalb Excel mit den Lookup-Funktionen einfach suchen.

    Über mehrere Sheets hinweg erzeugst du am einfachsten ein zentrales IndexSheet, indem du in der Hilfsspalte auch noch den Sheetnamen unterbringst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vielen Dank für den Hinweis.
    Habe das mal soweit umgesetzt, jedoch komme ich noch nicht genau weiter.

    Die Suchfunktion funktioniert soweit, jedoch wie kann ich alle Sheets durchsuchen lassen?
    Wird die Performance stark verschlechtert wenn ich .UsedRange nutze oder sollte ich den Bereich eingerenzen?

    Visual Basic-Quellcode

    1. Sub Suche_Lager()
    2. Dim Holzart1 As String
    3. Dim Produktart1 As String
    4. Dim Oberflaeche1 As String
    5. Dim Staerk1 As String
    6. Dim Gesamt1 As String
    7. Dim rngFound As Range
    8. Dim Zeile As Long
    9. With Worksheets("A").UsedRange
    10. Holzart1 = Me.cboHolzart1.Text
    11. Produktart1 = Me.cboProduktart1.Text
    12. Oberflaeche1 = Me.cboOberflaeche1.Text
    13. Staerk1 = Me.cboStaerke1
    14. Gesamt1 = Holzart1 + "_" + Produktart1 + "_" + Oberflaeche1 + "_" + Staerk1
    15. Set rngFound = .Find(Gesamt1, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False)
    16. If rngFound Is Nothing Then
    17. MsgBox "Ein Lagerplatz existiert nicht"
    18. Else
    19. Zeile = rngFound.Row
    20. MsgBox Zeile
    21. End If
    22. End With
    23. End Sub
    Mein Vorschlag wäre, eine Funktion daraus zu machen, die dir die Zelle des gefundenen Schlüssels zurückgibt.

    TeamBob schrieb:

    Wird die Performance stark verschlechtert wenn ich .UsedRange nutze oder sollte ich den Bereich eingerenzen?
    Ich würde auf jeden Fall auf die Suchspalte begrenzen.

    Visual Basic-Quellcode

    1. ​Function LagerPlatz(ByVal Holzart As String, ByVal ProduktArt As String, ByVal Oberflaeche As String, ByVal Staerke As String) As Range
    2. Const SheetList = "Tabelle1,Tabelle2,Tabelle3" 'zu durchsuchende Sheets
    3. Dim ws As Worksheet, Sheetname as Variant, SearchRange As Range, SearchString As String
    4. SearchString = Holzart + "_" + Produktart + "_" + Oberflaeche + "_" + Staerke
    5. For Each SheetName in Split(SheetList, ",")
    6. Set ws = Worksheets(SheetName)
    7. Set SearchRange = Intersect(ws.UsedRange,ws.Range("H:H")) 'Suchspalte
    8. Set LagerPlatz = SearchRange.Find(SearchString) 'Rückgabewert setzen
    9. If Not Lagerplatz Is Nothing Then Exit Function 'gefunden -> Suche abbrechen
    10. Next
    11. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok vielen Dank für die Hinweise und den Quellcode.
    Ich muss ehrlich sagen, dass ich da noch nicht 100% durchsteige.
    Du sagst als Function schreiben und nur auf die Suchspalte begrenzen.

    Was genau muss ich denn bei deinen Quelltext noch anpassen?
    Also die Bezeichnung der Tabelle1,... ist klar.
    Dann muss ich doch noch definieren, woher er die Werte von "holzart", Produktart usw. bekommt.
    Kann ich hier einfach schreiben:

    VB.NET-Quellcode

    1. Holzart=cboHolzart.value


    Wie genau rufe ich denn diese Function auf, da ich nie viel mit function arbeite?

    Visual Basic-Quellcode

    1. LagerPlatz(Holzart,ProduktArt, Oberflaeche, Staerke)
    ???

    Vielen Dank für die Hilfe

    TeamBob schrieb:

    Was genau muss ich denn bei deinen Quelltext noch anpassen?
    Die Tabellen und ggf. die Suchspalte in Zeile 7

    TeamBob schrieb:

    Wie genau rufe ich denn diese Function auf

    Visual Basic-Quellcode

    1. Dim FoundRange as Range
    2. Set FoundRange = Lagerplatz(cboHolzart1.Text, cboProduktart1.Text, cboOberflaeche1.Text, cboStaerke1)
    3. If Not FoundRange Is Nothing Then
    4. MsgBox FoundRange.WorkSheet.Name & " " & FoundRange.Address & " " & FoundRange.Offset(0,-1).Value
    5. End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Irgendwie kommt bei mir keine Fehlermeldung, aber auch kein Ergebnis.
    Woran liegt es?

    Habe hier deine Function angepasst auf ein Sheet und die entsprechende Spalte

    Visual Basic-Quellcode

    1. Function LagerPlatz(ByVal Holzart As String, ByVal Produktart As String, ByVal Oberflaeche As String, ByVal Staerke As String) As Range
    2. Const SheetList = "Liste" 'zu durchsuchende Sheets
    3. Dim ws As Worksheet, Sheetname As Variant, SearchRange As Range, SearchString As String
    4. SearchString = Holzart + "_" + Produktart + "_" + Oberflaeche + "_" + Staerke
    5. For Each Sheetname In Split(SheetList, ",")
    6. Set ws = Worksheets(Sheetname)
    7. Set SearchRange = Intersect(ws.UsedRange, ws.Range("J:J")) 'Suchspalte
    8. Set LagerPlatz = SearchRange.Find(SearchString) 'Rückgabewert setzen
    9. If Not LagerPlatz Is Nothing Then Exit Function 'gefunden -> Suche abbrechen
    10. Next
    11. End Function


    Nun habe ich einen Button mit dem ich die Function aufrufe, nachdem ich in der Anwendung
    durch die Comboboxen die Werte eingeben habe. Jedoch passiert nicht.

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. Dim FoundRange As Range
    3. Set FoundRange = LagerPlatz(cboHolzart1.Text, cboProduktart1.Text, cboOberflaeche1.Text, cboStaerke1)
    4. If Not FoundRange Is Nothing Then
    5. MsgBox FoundRange.Worksheet.Name & " " & FoundRange.Address & " " & FoundRange.Offset(0, -1).Value
    6. End If
    7. End Sub


    *EDIT*: Habe jetzt den Fehler gefunden.
    Das Problem ist, dass ich in Excel einfach die Begriffe per Befehl zusammengefügt habe:
    =WENN(B417="";"";VERKETTEN(B417;"_";C417;"_";E417;"_";D417))
    Das hat natürlich zur Folge, dass in der Zelle prinzipiell nicht der Suchbegriff drin steht, sondern der Befehl.
    Wie kann man das am besten Lösen?

    Habe jetzt versucht eine Anwendung zu basteln die mir die 4 Spalten zusammenfügt.
    Das Funktioniert auch soweit, jedoch gibt es hier einen Fall zu beachten, wo ich nicht weis, wie ich diesen einbinde.
    Im Normalfall müssen 4 Spalten zusammengefügt werden. Es kommt jedoch vor das nicht alle Spalten belegt sind
    und wenn dies der Fall ist, dann darf er nur die 3 Spalten zusammenfügen bzw. nur 2.
    Wie kann ich diese Restriktion einbinden?
    Vielen Dan

    Visual Basic-Quellcode

    1. Private Sub Zusammenführen_Click()
    2. Dim lngCounter As Long 'Spaltenzähler
    3. Dim strText As String 'String zur Aufnahme des Textes
    4. Const clngMAX = 4 'Konstante Anzahl der Spalten
    5. Const cstrSEP As String = "_" 'Konstante für Trennzeichen
    6. Dim ranBereich As Variant
    7. Dim i As Long
    8. With Worksheets("Menue")
    9. ranBereich = .Cells(Rows.Count, 1).End(xlUp).Row
    10. End With
    11. For i = 1 To ranBereich
    12. strText = ""
    13. For lngCounter = 1 To clngMAX - 1
    14. strText = strText & Cells(i, lngCounter).Value & cstrSEP
    15. Next lngCounter
    16. Cells(i, clngMAX + 1).Value = strText & Cells(i, clngMAX).Value
    17. Next i
    18. End Sub


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

    TeamBob schrieb:

    Es kommt jedoch vor das nicht alle Spalten belegt sind
    und wenn dies der Fall ist, dann darf er nur die 3 Spalten zusammenfügen bzw. nur 2.
    Dann sind die halt leer. Wo ist das Problem?


    TeamBob schrieb:

    dass in der Zelle prinzipiell nicht der Suchbegriff drin steht, sondern der Befehl.
    LookIn:=xlValues

    Jetzt musst du halt im Debugger mal durchsteppen und schauen, wo evtl. deine Suchbegriffe nicht stimmen.
    So was lässt sich remote schwer lösen.
    Den prinzipiellen Ansatz hast du ja. das sollte jetzt kein Hexenwerk mehr sein.

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok Funktioniert super mit der Erweiterung

    Visual Basic-Quellcode

    1. LookIn:=xlValues


    Weiterhin habe ich ja das Problem, dass wenn nicht alle 4 Spalten ausgefüllt sind und es nur 3 Begriffe sind,
    die Function oben ja immer nach genau den 4 Begriffen sucht und nicht den Fall abdeckt, wenn nach 3 Begriffen Schluss ist.
    Wie müsste man denn das erweitern?

    Man könnte den gleichen Befehl für 3 nochmal anlegen und mit einer IF Abfrage natürlich schauen, wenn in der zu betrachtenden
    Zeile 4 Spalten belegt, dann nehm "Lagerplatz4" wenn nur 3 belegt nehm "Lagerplatz3". Aber da gibt es bestimmt bessere Lösungen
    Vielen Dank für die Hilfe


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TeamBob“ ()

    Hallo
    Ich habe jetzt ein anderes Problem bezüglich der Verwendung des Suchergebnisses für die Bestandsbuchung.
    Die Suchfunktion soll ja nach bestimmten Kriterien den Lagerplatz ausfindig machen und gibt eine Zeile wieder.
    Diese soll nun verwendet werden, um Artikel ein oder auszubuchen. Hier wählt der Nutzer ob er Ein-oder Ausbuchen will
    und um welchen Artikel es sich handelt. Dann wird geprüft ob er eine Eingabe getätigt wird und dann entsprechend gebucht.
    Jedoch bekomme ich hier immer einen "Überlauf". Ist es zu umstädig / schlecht programmiert?
    Hier mal ein Ausschnitt der relevanten Funktionen. (Der Nutzer kann immer 4 Abrufe gleichzeit eingeben, daher 1-4)
    Vielen Dank für eure Hilfe

    Suchfunktion

    Visual Basic-Quellcode

    1. Function Lagerplatz(ByVal Holzart As String, ByVal Produktart As String, ByVal Oberflaeche As String, ByVal Staerke As String) As Range
    2. Const SheetList = "Liste" 'zu durchsuchende Sheets
    3. Dim ws As Worksheet, Sheetname As Variant, SearchRange As Range, SearchString As String
    4. SearchString = Holzart + "_" + Produktart + "_" + Oberflaeche + "_" + Staerke
    5. For Each Sheetname In Split(SheetList, ",")
    6. Set ws = Worksheets(Sheetname)
    7. Set SearchRange = Intersect(ws.UsedRange, ws.Range("I:I")) 'Suchspalte
    8. Set Lagerplatz = SearchRange.Find(SearchString, LookIn:=xlValues) 'Rückgabewert setzen
    9. If Not Lagerplatz Is Nothing Then Exit Function 'gefunden -> Suche abbrechen
    10. Next
    11. End Function



    Suchfunktion anstoßen und jeweilige Reihe abfragen und zuweisen.

    Visual Basic-Quellcode

    1. Private Sub SearchLagerplatz()
    2. Dim Lagerplatz1 As Range
    3. Dim Lagerplatz2 As Range
    4. Dim Lagerplatz3 As Range
    5. Dim Lagerplatz4 As Range
    6. Lagerplatz1_Reihe = 0
    7. Lagerplatz2_Reihe = 0
    8. Lagerplatz3_Reihe = 0
    9. Lagerplatz4_Reihe = 0
    10. Set Lagerplatz1 = Lagerplatz(cboHolzart1.Text, cboProduktart1.Text, cboOberflaeche1.Text, cboStaerke1)
    11. Set Lagerplatz2 = Lagerplatz(cboHolzart2.Text, cboProduktart2.Text, cboOberflaeche2.Text, cboStaerke2)
    12. Set Lagerplatz3 = Lagerplatz(cboHolzart3.Text, cboProduktart3.Text, cboOberflaeche3.Text, cboStaerke3)
    13. Set Lagerplatz4 = Lagerplatz(cboHolzart4.Text, cboProduktart4.Text, cboOberflaeche4.Text, cboStaerke4)
    14. If Not Lagerplatz1 Is Nothing Then
    15. Lagerplatz1_Reihe = Lagerplatz1.Row
    16. End If
    17. If Not Lagerplatz2 Is Nothing Then
    18. Lagerplatz2_Reihe = Lagerplatz2.Row
    19. End If
    20. If Not Lagerplatz3 Is Nothing Then
    21. Lagerplatz3_Reihe = Lagerplatz3.Row
    22. End If
    23. If Not Lagerplatz4 Is Nothing Then
    24. Lagerplatz4_Reihe = Lagerplatz4.Row
    25. End If
    26. End Sub


    Hier wird geschaut, nach ob alle Comboboxen je nach Artikel ausgefüllt wurden und dann jeweils die Suchabfrage gestartet wenn
    alles korrekt ausgewählt wurde.

    Visual Basic-Quellcode

    1. Private Sub Bestandsabfrage()
    2. Dim Lagerplatz1 As Range
    3. Dim intTxtID As Integer
    4. Dim LagerplatzID(1 To 4) As Integer
    5. For intTxtID = 1 To 4
    6. .......
    7. If Me.Controls("cboProduktart" & intTxtID).Value = "test50" Or Me.Controls("cboProduktart" & intTxtID).Value = "test200" Or Me.Controls("cboProduktart" & intTxtID).Value = "test360" Then
    8. If Me.Controls("cboHolzart" & intTxtID).ListIndex >= 0 And Me.Controls("cboOberflaeche" & intTxtID).ListIndex >= 0 And Me.Controls("cboStaerke" & intTxtID).ListIndex >= 0 Then
    9. SearchLagerplatz
    10. LagerplatzID(1) = Lagerplatz1_Reihe
    11. LagerplatzID(2) = Lagerplatz2_Reihe
    12. LagerplatzID(3) = Lagerplatz3_Reihe
    13. LagerplatzID(4) = Lagerplatz4_Reihe
    14. If LagerplatzID(intTxtID) = "0" Then
    15. GoTo NextStep
    16. Else
    17. If Me.optStaerkenpaket.Value = True Then
    18. Me.Controls("txtBestand" & intTxtID) = Sheets("Liste").Cells(LagerplatzID(intTxtID), 1)
    19. Else
    20. Me.Controls("txtBestand" & intTxtID) = Sheets("Liste").Cells(LagerplatzID(intTxtID), 6)
    21. End If
    22. End If
    23. End If
    24. End If
    25. NextStep:
    26. Next
    27. End Sub



    Hier wird der Bestand letztendlich gebucht. Die Ergebniss der Suchanfragen zugeordnet und abgefragt welche Art
    Buchung durchgeführt werden soll. Hier kommt dann der Überlauf Fehler

    Visual Basic-Quellcode

    1. Private Sub BestandBuchen()
    2. Dim intTxtID As Integer
    3. Dim LagerplatzID(1 To 4) As Integer
    4. Dim Mengenaenderung As Integer
    5. Bestandsabfrage
    6. LagerplatzID(1) = Lagerplatz1_Reihe
    7. LagerplatzID(2) = Lagerplatz2_Reihe
    8. LagerplatzID(3) = Lagerplatz3_Reihe
    9. LagerplatzID(4) = Lagerplatz4_Reihe
    10. For intTxtID = 1 To 4
    11. 'Eingangsbuchung (Addition)
    12. If Me.optEingang.Value = True Then
    13. If Me.optStaerkenpaket.Value = True Then 'Stärkenpaket
    14. If Me.Controls("txtMenge" & intTxtID) = vbNullString Then 'Prüfung ob Menge eingegeben
    15. GoTo NextStep
    16. Else
    17. If Me.Controls("txtBestand" & intTxtID) = vbNullString Then
    18. GoTo NextStep
    19. Else
    20. Mengenaenderung = Me.Controls("txtMenge" & intTxtID) + Sheets("Liste").Cells(LagerplatzID(intTxtID), 1)
    21. Sheets("Liste").Cells(LagerplatzID(intTxtID), 1) = Mengenaenderung 'Me.Controls("txtMenge" & intTxtID)
    22. End If
    23. End If
    24. End If
    25. End If
    26. NextStep:
    27. Next
    28. End Sub

    TeamBob schrieb:

    Jedoch bekomme ich hier immer einen "Überlauf"
    In welcher Zeile kommt der Fehler?
    Schau dir die Variablen dort an.

    TeamBob schrieb:

    Ist es zu umstädig / schlecht programmiert?

    Es ist vor allem sehr unstrukturiert programmiert.

    Visual Basic-Quellcode

    1. For intTxtID = 1 To 4
    2. If Me.optEingang.Value Then
    3. If Me.optStaerkenpaket.Value Then
    4. If Me.Controls("txtMenge" & intTxtID) <> vbNullString Then
    5. If Me.Controls("txtBestand" & intTxtID) <> vbNullString Then
    6. Mengenaenderung = Me.Controls("txtMenge" & intTxtID) + Sheets("Liste").Cells(LagerplatzID(intTxtID), 1)
    7. Sheets("Liste").Cells(LagerplatzID(intTxtID), 1) = Mengenaenderung 'Me.Controls("txtMenge" & intTxtID)
    8. End If
    9. End If
    10. End If
    11. End If
    12. Next
    Das ist jetzt nur eine Korrektur der Struktur, ohne den Sinn hinter der Programmierung zu erfragen.

    Mit dem Umstand, dass du unkontrolliert Textbox-Inhalt zur Addition von Zahlen heranziehst, befasse ich mich lieber erst gar nicht.
    Trag mal als Menge eins in die Textbox ein. ;)

    Dein Überlauf wird vermutlich bei Mengenaenderung auftreten.
    Mach das mal Long.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke erstmal für deine Antwort.
    Du verwendest bei deiner Schreibweise gar kein "else" , sondern nur "if" und "end if".
    Macht das einen großen unterschied wenn ich mit "GoTo" arbeite bei "else" oder ansich "else" verwende?

    Desweiteren schreibst du

    Visual Basic-Quellcode

    1. If Me.Controls("txtMenge" & intTxtID) <> vbNullString Then

    bedeutet das soviel, dass wenn das Feld nicht leer ist, dann....

    Habe den Überlauf behoben und es lag an

    Quellcode

    1. Mengenaenderung
    .
    Habe hier nicht mit Textboxen gearbeitet sonder das dann wie folgt gemacht:

    Visual Basic-Quellcode

    1. Dim Mengenerhoehung As Integer
    2. Dim Buchungsmenge As Integer
    3. Dim Bestand As Integer
    4. ...
    5. Buchungsmenge = Me.Controls("txtMenge" & intTxtID)
    6. Bestand = Sheets("Liste").Cells(LagerplatzID(intTxtID), 1)
    7. Mengenerhoehung = Buchungsmenge + Bestand
    8. Sheets("Liste").Cells(LagerplatzID(intTxtID), 1) = Mengenerhoehung

    funktioniert das so oder gibt es da noch bessere Methoden?
    Vielen Dank

    TeamBob schrieb:

    Du verwendest bei deiner Schreibweise gar kein "else"
    Ich habe bei dir keine Statements gefunden, die in einen Else-Zweig gehören würden.

    TeamBob schrieb:

    Macht das einen großen unterschied wenn ich mit "GoTo" arbeite bei "else" oder ansich "else" verwende
    Technisch nicht, aber wilde Sprünge erschweren das Lesen.

    TeamBob schrieb:

    Buchungsmenge = Me.Controls("txtMenge" & intTxtID)
    Das ist dasselbe in grün.
    Wenn in deiner Textbox Schrott drin steht, fällst du auf die Schnauze.

    TeamBob schrieb:

    Dim Buchungsmenge As Integer
    Möchtest du hier den nächsten Überlauf produzieren?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok das ist also eindeutig noch luft nach oben :)

    Also die Anwendung läuft natürlich erstmal unter den gegeben Vorraussetzung, aber ich will natürlich
    die Fehler gerne vermeiden, daher die Frage was genau ich beachten muss und wie?

    Du sagtest, dass ich das definieren sollte, dass er bei Buchungen mit Zahlen rechnet. Wie genau definiere ich das?

    Visual Basic-Quellcode

    1. Dim Buchungsmenge as Double
    2. Mengenerhoehung= (CDbl(Me.Controls("txtMenge" & intTxtID)) + (CDbl(Sheets("Liste").Cells(LagerplatzID(intTxtID), 1))



    Ich wollte zusätzlich auch nicht die Eingabe in den Textfeld beschränken, aber hier bekomme ich immer die Fehlermeldung,
    dass die Methode nicht unterstützt wird. Wo ist hier der Fehler
    Modul1

    Visual Basic-Quellcode

    1. Option Explicit
    2. '-----------------------------------------------------------------
    3. ' Beschränkung der Eingabe auf bestimmte Zeichen je nach Textfeld
    4. '-----------------------------------------------------------------
    5. Public Function fktKeyPressNumeric(ByVal KeyAscii As MSForms.ReturnInteger, intMaxLength As Integer, ByRef myTextBox As Object)
    6. If KeyAscii >= Asc("0") And KeyAscii <= Asc("9") And Len(myTextBox.Text) <= intMaxLength Then
    7. fktKeyPressNumeric = KeyAscii
    8. Else
    9. fktKeyPressNumeric = 0
    10. End If
    11. End Function
    12. Public Function fktKeyPressNumericDecimal(ByVal KeyAscii As MSForms.ReturnInteger, intMaxLength As Integer, ByRef myTextBox As Object)
    13. ' WENN Zeichen = Ziffer UND Länge(des bisher vorhandenen Textes) <= maxLength
    14. ' ODER Zeichen = "," UND bisher kein Komma vorhanden UND nicht das erste Zeichen UND Länge <= maxLength
    15. If (KeyAscii >= Asc("0") And KeyAscii <= Asc("9")) And Len(myTextBox.Text) <= intMaxLength _
    16. Or KeyAscii = Asc(",") And (InStr(myTextBox.Text, ",") = 0) And Len(myTextBox.Text) > 0 And Len(myTextBox.Text) <= intMaxLength Then
    17. fktKeyPressNumericDecimal = KeyAscii
    18. Else
    19. fktKeyPressNumericDecimal = 0
    20. End If
    21. End Function


    Userform für z.B. TxtMenge 1

    Visual Basic-Quellcode

    1. 'Private Sub txtMenge1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    2. ' ' Übergabe von Zeichen, max. Länge, Textbox
    3. ' KeyAscii = fktKeyPressNumeric(KeyAscii, 8, Me.ActiveControl.Object)
    4. 'End Sub
    Warum nimmst du nicht ein NumericUpDown-Control?

    Benötigst du Dezimalstellen oder reichen Ganzzahlen?
    Du solltest in dem Fall für alle Variablen konsistent Double oder Long verwenden.
    Überlege dir, welche Variablen und Controls welche Wertebereiche verwenden müssen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --