Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

nachträgliches Komma nur an drittletzter Stelle


Betrifft: nachträgliches Komma nur an drittletzter Stelle von: Frank
Geschrieben am: 27.01.2019 14:15:12

Hallo,
ich benutze folgende Code für die Eingabe von Textfeldern.
Es werden nur Zahlen, zwei Nachkommastellen, ein Komma und ein Minus an erster Stelle erlaubt.
Jedoch kann ich das Komma löschen und an falscher Stelle wieder einsetzten und möchte gerne diesen Bug unterbinden und weiß nicht so recht, wie ich das Abfangen kann??

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'nur Zahlen, ein Komma und nur 2 Stellen nach dem Komma
Select Case KeyAscii
Case Asc("0") To Asc("9")
If InStr(TextBox1, ",") <> 0 Then
If Len(TextBox1) - InStr(TextBox1, ",") > 1 Then KeyAscii = 0
End If
Case Asc("."), Asc(",")
If InStr(TextBox1, ",") <> 0 Then
KeyAscii = 0
Else
KeyAscii = Asc(",")
End If
Case Asc(vbBack)
'Eingabe von Minus
Case Asc("-")
Case Else
KeyAscii = 0
End Select
End Sub

Private Sub Textbox1_Change()
'Eingabe von Minus auch nachträglich
Dim BoWert As Boolean
If InStr(TextBox1, "-") >= 1 And Left(TextBox1, 1) <> "-" Then
TextBox1 = Replace(TextBox1, "-", "")
BoWert = True
ElseIf InStr(TextBox1, "-") = 1 And InStr(2, TextBox1, "-") >= 1 Then
BoWert = True
If Left(TextBox1, 1) = "-" Then
TextBox1 = "-" + Replace(TextBox1, "-", "")
Else
TextBox1 = Replace(TextBox1, "-", "")
End If
End If
'nachträgliche Eingabe von Komma nur an drittletzter Stelle
'
'
'
'
'
'bei Eingabe von "," oder "-," wird eine Null vor dem Komma eingesetzt
If Left$(TextBox1.Text, 1) = "," Then
TextBox1.Text = Application.WorksheetFunction.Substitute(TextBox1.Text, ",", "0,")
ElseIf Left$(TextBox1.Text, 2) = "-," Then
TextBox1.Text = Application.WorksheetFunction.Substitute(TextBox1.Text, "-,", "-0,")
End If
End Sub

  

Betrifft: AW: nachträgliches Komma von: Frank
Geschrieben am: 27.01.2019 15:05:41

Denkfehler: ich meinte das Komma nachträglich an letzter, vorletzter und vor-vorletzter Stelle.
Ich möchte es festlegen, dass das Komma nur an diesen drei Positionen gesetzt werden kann...


  

Betrifft: AW: nachträgliches Komma von: Daniel
Geschrieben am: 27.01.2019 15:30:15

Hi

du kannst mit SelPos abfragen, an welcher Position sich der Cursor befindet und darüber entscheiden, ob das Komma an dieser Stelle eingefügt werden darf oder nicht.
Gruß Daniel


  

Betrifft: AW: nachträgliches Komma von: Frank
Geschrieben am: 27.01.2019 16:43:20

Vielen Dank, das wäre aber Neuland für mich...
Wie schaut so etwas aus?


  

Betrifft: AW: nachträgliches Komma von: Daniel
Geschrieben am: 27.01.2019 17:00:52

sorry die Eigenschaft heitß nicht SelPos, sondern SelStart.

wie das aussieht?
naja du fragst mit

If Textbox1.SelPos >= Len(TextBox1.Text) - 3
ab, ob sich der Cursor an den letzen Positionen des textes befindest und entscheidest dann, ob der Anwender das Komma einfügen darf oder nicht.

aber generell würde ich solche Prüfungen während der Eingabe nicht durchführen, das wird wie du sieht zu aufwendig wenn man es wirklich vollständig machen will.
checke lieber am Ende der Eingabe oder vor dem nächsten Schritt (z.B. im OK-Button, sofern du einen hast), ob die Eingabe korrekt ist.

Gruß Daniel


  

Betrifft: AW: nachträgliches Komma von: Frank
Geschrieben am: 27.01.2019 17:13:08

folgend umgebauter und funktionierender Code:

If TextBox1.SelStart <= Len(TextBox1.Text) - 3 Then
TextBox1 = Replace(TextBox1, ",", "")
End If
Vielen Dank!


  

Betrifft: AW: nachträgliches Komma von: Frank
Geschrieben am: 27.01.2019 17:23:33

Hier der gesamte Code:

Private Sub Textbox1_Change()
'Eingabe von Minus auch nachträglich
Dim BoWert As Boolean
If InStr(TextBox1, "-") >= 1 And Left(TextBox1, 1) <> "-" Then
TextBox1 = Replace(TextBox1, "-", "")
BoWert = True
ElseIf InStr(TextBox1, "-") = 1 And InStr(2, TextBox1, "-") >= 1 Then
BoWert = True
If Left(TextBox1, 1) = "-" Then
TextBox1 = "-" + Replace(TextBox1, "-", "")
Else
TextBox1 = Replace(TextBox1, "-", "")
End If
End If
'nachträgliche Eingabe von Komma nur an drei letzten Stellen
If TextBox1.SelStart <= Len(TextBox1.Text) - 3 Then
TextBox1 = Replace(TextBox1, ",", "")
End If
'bei Eingabe von "," oder "-," wird eine Null vor dem Komma eingesetzt
If Left(TextBox1, 1) = "," Then
TextBox1 = Replace(TextBox1, ",", "0,")
ElseIf Left(TextBox1, 2) = "-," Then
TextBox1 = Replace(TextBox1, "-,", "-0,")
End If
End Sub
wenn ich aber nun ein nachträgliches Minus eingebe, wird das Komma gelöscht.
Wo liegt mein Denkfehler?


  

Betrifft: AW: nachträgliches Komma von: Frank
Geschrieben am: 27.01.2019 17:28:27

auch beim Löschen von Minus...


  

Betrifft: AW: nachträgliches Komma von: Daniel
Geschrieben am: 27.01.2019 18:00:31

keine Ahnung, ist mir zu kompliziert.
ich würde, wie ich schon schrieb die Eingabe gar nicht überwachen, sondern erst vor dem nächsten Schritt ober nach Abschluss der der Eingabe überprüfen, ob ein korrekter Wert in der Textbox steht.
Gruß Daniel


  

Betrifft: AW: nachträgliches Komma von: Frank
Geschrieben am: 27.01.2019 18:41:31

Eleganter wäre es, das Endergebnis schon vor der Übernahme in der TextBox zu sehen...


  

Betrifft: AW: nachträgliches Komma von: Daniel
Geschrieben am: 27.01.2019 20:36:43

wenn du bestimmte Eingaben verhindern willst, solltest du das KeyPress oder noch besser das KeyDown-Event verwenden.
Damit greifst du ein, bevor die jeweilige Eingabe in die Textbox gemacht wird und kannst sie so verhindern (die KeyAscii/KeyCode-Variable auf 0 setzen).
das ist effektiver, als Hinterher wieder was rauslöschen.

Gruß Daniel


Beiträge aus dem Excel-Forum zum Thema "nachträgliches Komma nur an drittletzter Stelle"