Anzahl Zeichen in Textbox begrenzen

  • Excel

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Anzahl Zeichen in Textbox begrenzen

    Hallo, ich habe eine textbox in die werden durch komma", "getrennte Werte eingegeben, es darf maximal 15 Werte geben, also 14 Kommata. Jeder der 15 Werte hat 1 oder 2 Stellen. Ich würde die textbox gerne so begrenzen das es maximal 15 Werte geben darf, aber mir fehlt grade die Idee wie.

    Change Ereignis auf anzahl der Kommata? Oder wie würdet ihr es lösen?

    Danke
    Du kannst im TextChanged-Ereignis alles reinschreiben was du brauchst zum Splitten und prüfen, du kannst weiter in der Liste / Array auch dann wieder jedes Item auf Länge und erlaubte Zeinen prüfen, die z.B. shiften (ToUpper) oder eleminieren, what ever.
    zu, Schluß noch den Cursor ans Ende setzen mit txtbox.Select(txtbox.Text.Length, 0)


    Sorry @VaporiZed hatte recht, nee mit Excel-VBA weiß ich das nicht. Tut mir leid *schäm*

    *Alten Post wiederhergestellt, da sich darauf bezogen wird*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich habe das Gefühl, dass @Dksksm gedanklich in VB.NET ist, obwohl es hier um Excel-VBA geht …
    Er meint damit UCase(DeinText)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Damit meinte Dksksm, dass Du in Deinem TextFeld_Change-EventHandler alles machen kannst, was Du brauchst. Damit ist Deine Idee also so umsetzbar, wie Du dachtest. Wenn Du also die Kommata begrenzen willst, dann eben z.B. If UBound(Split(TextBox1.Text, ",")) = 15 Then TextBox1.Text = Mid(TextBox1.Text, 1, Len(TextBox1.Text) - 1). Allerdings hat diese Methode die Einschränkung, dass nur ein zuviel-Komma am Ende verhindert wird. Der nächste Schritt wäre also eine Art Textzwischenspeicherung. Also bei jeder noch-validen Eingabe den aktuellen Text in einer Variable speichern und sobald die Benutzereingabe ungültig wird, wird der zwischengespeicherte Text in das Textfeld eingesetzt. Das verhindert, dass ein Schelm mitten im Text weitere Kommata platziert. Auch musst Du bei jeder Eingabe prüfen, ob jeder Wert immer noch valide ist. Ansonsten wieder auf das Text-Backup zugreifen.
    Aber dennoch: Nahezu alles findet in dem von Dir selbst vorgeschlagenen EventHandler statt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    UBound gibt nicht die Anzahl, sondern den höchsten Index zurück. Somit müsste es = 14 heißen (statt 15).

    Man müsste noch zusätzlich prüfen (hat aber nichts mit der Eingabeverhinderung zu tun), ob überhaupt Werte mit 1 bis 2 Zeichen drin stehen. Denn sonst könnte man auch 14 Kommas machen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ist jetzt nicht die perfekte Lösung für dein Problem, aber eine Möglichkeit, das zu handeln: Du kannst ja den String splitten an den Kommata. Dann lass deine Schleife einfach solange durchlaufen, bis du beim 15. Wert im Array angekommen bist im Eventhandler und danach brichst du die Schleife einfach ab.

    Ansonsten, wenn du tatsächlich deine Box begrenzen musst, musst du tatsächlich die Vorkommen in deinem Text durchforsten und danach bei einem TextChanged-Event jede Eingabe eines weiteren Kommata verhindern.

    Marcus Gräfe schrieb:

    UBound gibt nicht die Anzahl, sondern den höchsten Index zurück. Somit müsste es = 14 heißen (statt 15).

    Man müsste noch zusätzlich prüfen (hat aber nichts mit der Eingabeverhinderung zu tun), ob überhaupt Werte mit 1 bis 2 Zeichen drin stehen. Denn sonst könnte man auch 14 Kommas machen.

    Hi, ich musste hier doch 15 nehmen, da ansonsten ein Komma zu wenig akzeptiert wurde, es sind max. 15 Zahlen die durch Komma (also 14 Komma) getrennt werden.
    Das ganze sieht also jetzt wie von @VaporiZed vorgeschlagen so aus.

    Quellcode

    1. If UBound(Split(txtWoche.Text, ",")) = 15 Then txtWoche.Text = Mid(txtWoche.Text, 1, Len(txtWoche.Text) - 1)

    Ich muss aber auch nochmal Fragen was die einzelnen Code Befehle machen, bzw. wofür die benötigt werden, ich verstehe es soweit:
    • UBound legt die höchst mögliche Anzahl fest, welche aus dem Split der Textbox am Komma erlaubt ist, also 14 Kommata, soweit hoffentlich noch richtig
    • Aber wofür Mid und Len? Mid gibt doch dann wenn ich es richtig interpretiere ab dem ersten Zeichen alles zurück was in der Textbox steht und was macht Len?
    Also ich hab ein bisschen damit rum gespielt und ja es funktioniert nicht ohne, aber so richtig verstehen wieso das so ist tu ich noch nicht.
    Vielleicht kann mich da einer ein bisschen aufklären, Danke.

    Da es auch so für mich jetzt erstmal klappt und auch eher nice to have ist, passt das so, aber ihr habt natürlich recht, wenn es richtig sein soll müssten noch mehr Punkte geprüft werden und da ich noch etwas lernen möchte würde mich interessieren wie ihr das besser machen würdet, wie gesagt es geht in diesem Fall um max.15 Zahlen die in die Textbox eingetragen werden können, genau genommen um 15 Kalenderwochen, so das jede dieser Zahle eine sein kann zwischen 1 und 53, getrennt werden sollen Sie dann durch Kommata.

    Danke

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

    Len = Rückgabe, wieviele Zeichen ein Text hat

    Tina schrieb:

    UBound legt die höchst mögliche Anzahl fest
    Nein, der Befehl gibt nur den höchsten Index eines Feldes wieder, legt aber nix fest.
    Mid(txtWoche.Text, 1, Len(txtWoche.Text) - 1) = gibt den Teiltext von txtWoche.Text wieder, beginnend beim 1. Zeichen, und Länge eben txtWoche.Text-Länge - 1, also wird der komplette Text bis auf das letzte Zeichen wiedergegeben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    als 1. ist es wichtig für dich fest zu legen was und wie man alles begrenzen möchte, und sich dabei auch alle möglichen "Falscheingaben" überlegt, so gut es eben geht.

    Ich könnte mir auch vorstellen, eine reine Prüfung auf korrekte Werte während der Eingabe zu machen, aber noch keine Eingabe zu verhindern.
    Wenn die die Prüfung ergibt dass zu viele Komas eingegeben wurde oder Werte größer 53, dann könnte man die Hintergrundfarbe der Textbox auf hellrot setzten.
    Falls noch Werte Fehlen könnte man es ja weiß lassen und bei korrekter Eingabe hellgrün.

    Beim Verlassen der Textbox könnte man im Exit-Ereignis dann auch noch reagieren.

    Hintergrund des "nur Prüfen", wenn jemand die "Regeln" kennt, aber kurz eine Zahl mehr eingeben und danach erst die falsche löschen möchte, schränkt das schon ein.


    Eine andere Möglichkeit, um zu verhindern dass ab 14 Kommas ein weiteres von Hand eingegeben wird, ist im KeyPress-Ereignis zu prüfen ob die 14 oder mehr Kommas schon erreicht sind
    und über den Parameter KeyAscii zu prüfen ob ein Komma eingegeben werden soll.
    Fall ja KeyAscii=0 setzten.
    Somit werden ab 14 Komas keine neuen mehr über die Tastatur zugelassen, reinkopiern kann man sich aber immer noch alles mögliche.

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

    Hallo zusammen,
    und vielen Dank für eure Hilfe und erklärungen, ich hab jetzt noch ein zweites Ereignis angelegt (KeyPress) womit ich sicherstelle das nur Komma und Zahlen eingegeben werden dürfen, heißt ich habe für die Textbox nun folgende zwei Prozeduren

    Quellcode

    1. ​Private Sub txtA_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    2. Select Case KeyAscii
    3. Case 48 To 57 ' 0 - 9
    4. Case 44 ' Komma
    5. Case Else
    6. KeyAscii = 0
    7. MsgBox "Hier dürfen nur Zahlen und Kommata eingegeben werden. ", vbInformation, "Info"
    8. End Select
    9. End Sub

    Quellcode

    1. ​Private Sub txtA_Change()
    2. If UBound(Split(txtA.Text, ",")) = 15 Then txtA.Text = Mid(txtA.Text, 1, Len(txtA.Text) - 1)
    3. End Sub


    Das scheint auch soweit zu funktionieren, was mir jetzt noch aufgefallen ist, ist das ich zwar auf die Komma Beschränke damit, es aber am schluss möglich ist weitere Zahlen einzugeben, also nach dem letzten Komma kann nicht nur 1-53 eingegeben werden, sondern z.b. auch 154124434 usw. wie kann ich das abfangen und damit allgemein wäre es ja besser wenn zwischen jedem Komma maximal 1-53 vorkommen dürfte, aber da fehlt mir die idee wie ich das einschränken könnte.

    Ansonsten würden mir keine weiteren möglichen falscheingaben einfallen!?

    Danke
    Steppe nach jeder gültigen Eingabe die einzelnen Zahlen durch, indem Du am Komma splittest und die eingegebenen Teiltexte mit CInt() in Zahlen umwandelst. Dann kannst Du prüfen, ob die Zahlen zwischen 1 und 53 liegen. Wenn nicht, dann stelle den zuvor validen Text wieder her, den Du nach jeder korrekten Eingabe in einer "globalen" Variable speicherst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das müsste grob so gehen (ungetestet):

    Visual Basic-Quellcode

    1. Private Sub txtA_Change()
    2. dim values() as string
    3. dim i as integer
    4. values() = Split(txtA.Text, ",")
    5. If UBound(values) = 15 Then
    6. txtA.Text = Mid(txtA.Text, 1, Len(txtA.Text) - 1)
    7. else
    8. for i=0 to ubound(values())
    9. if cint(values(i) < 1 or cint(values(i) > 53 then
    10. ' irgendwas tun, z. B. Meldung ausgeben
    11. exit for
    12. end if
    13. next i
    14. end if
    15. End Sub

    Mittlerweile ist mir übrigens auch klar, warum meine obige Aussage, dass es "14" statt "15" beim "UBound" heißen muss, Quatsch ist. Denn du möchtest ja ab 15 (=16 Einträge) die nächste Eingabe eliminieren.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Marcus Gräfe schrieb:

    Das müsste grob so gehen (ungetestet):


    Erstmal Danke für das Beispiel, wenn ich es richtig verstehe, fehlen zwei schließende

    Quellcode

    1. if cint(values(i) < 1 or cint(values(i) > 53
    , so das es dann so aussehen würde

    Quellcode

    1. if cint(values(i) < 1) or cint(values(i) > 53) then
    .

    Allerdings klappt es dann trotzdem nicht, ich bekomme dann bei der eingabe des ersten Komma "," , also z.b. wenn ich "1," eingebe ,ein "Typen unverträglich" an dieser stelle angezeigt

    Quellcode

    1. If CInt(values(i) < 1) Or CInt(values(i) > 53) Then

    Wenn ich mir das im lokalfenster angucke, dürfte es an der leeren Zeichenfolge im zweiten Element liegen oder?
    Bilder
    • Bild_2022-04-21_054351794.png

      1,72 kB, 256×71, 590 mal angesehen
    Ja gut, dann einfach noch eine Prüfung wie If values(i) <> "" Then vorschieben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Tina schrieb:

    If CInt(values(i) < 1) Or CInt(values(i) > 53) Then


    Mache da mal dies draus:

    Visual Basic-Quellcode

    1. ​If CInt(values(i)) < 1 Or CInt(values(i)) > 53 Then


    Du willst doch prüfen, ob der Wert von values(i) kleiner als 1 oder größer als 53 ist?
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Ja, da habe ich tatsächlich zwei schließende Klammern vergessen. Die müssen dann so gesetzt werden wie @INOPIAE es geschrieben hat.

    Statt CInt kannst du auch Val nehmen, weil dann auch ein Leerstring zur Zahl wird (ohne Fehlermeldung).
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Wahrscheinlich stell ich mich nur blöd an, aber so richtig klappen tuts nicht...

    Mit euren Tips, gibt es zwar jetzt keinen Fehler mehr, aber ich hab jetzt mal als "then" Anweisung einfach eine Messagebox gemacht, und dann bekomme ich bei jeder Komma eingabe diese Msgbox angezeigt.. Schöner wäre es wenn einfach alle Werte die kleiner 1 und größer 53 sind gelöscht würden bzw. nicht akzeptiert würden.

    Quellcode

    1. ​Dim values() As String
    2. Dim i As Integer
    3. values() = Split(txtA.Text, ",")
    4. If UBound(values) = 15 Then
    5. txtA.Text = Mid(txtA.Text, 1, Len(txtA.Text) - 1)
    6. Else
    7. For i = 0 To UBound(values())
    8. If Val(values(i)) < 1 Or Val(values(i)) > 53 Then
    9. MsgBox "Wert falsch"
    10. Exit For
    11. End If
    12. Next i
    13. End If
    Neueingaben sind mit diesem Code per se falsch, da ja quasi nach einem neuen Komma dank Val() implizit eine 0 steht. Die Prüfung auf Val() = 0 sollte daher nach Verlassen der TextBox oder Drücken eines Bestätigungsbuttons erfolgen. Und wenn ein ungültiger Wert gefunden würde, sollte wohl einfach die TextBox wieder selektiert werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.