Ich habe auf einer Form ein Textfeld (Text1), dessen Inhalt bei Änderung mit IsNumeric() überprüft wird: Es sind nur ganze Zahlen zulässig.
Nicht numerische Zeichen werden entfernt, der Cursor behält seine Position bei. Dezimalpunkte und Dezimalkomma sind nicht zulässig und werden enfternt. Soweit die Theorie.
In der Praxis funktioniert das auch ganz toll, bis auf 2 Umstände:
Wenn man eine Zahl eingibt, kann man zwischen:
der vorletzten und letzten Ziffer
und
zwischen der drittletzten und vorletzten Ziffer
die Buchstaben „d“, „D“, „e“ und „E“ einfügen.
Konstrukte wie „1234e5“, „123e45“ sind also möglich.
„123e4e5“ wird witzigerweise wieder angemeckert (=entfernt), wie „1234ee5“ auch. Alle anderen Buchstaben werden ordnungsgemäß (sofort) entfernt!!!
Dieses verhalten wundert mich schon etwas. - Doch wo liegt der Fehler?
Im Einzelschritt werden die ‚wundersamen Zahlen‘ als numerisch anerkannt; es wird also nicht in den Ja-Pfad verzweigt.
Nun mein Code
Private Sub Text1\_Change()
Dim i As Integer 'Zähler
Dim intAktPos As Integer 'Aktuelle Cursorposition im Textfeld
Text1.Text = Replace(Text1.Text, ",", "")
Text1.Text = Replace(Text1.Text, ".", "")
If Not IsNumeric(Text1.Text) Then
intAktPos = Text1.SelStart
For i = 1 To Len(Text1.Text)
If Not IsNumeric(Mid(Text1.Text, i, 1)) Then
Text1.Text = Replace(Text1.Text, Mid(Text1.Text, i, 1), "")
End If
Next i
Text1.SelStart = intAktPos - 1
End If
End Sub
zwischen der drittletzten und vorletzten Ziffer
die Buchstaben „d“, „D“, „e“ und „E“ einfügen.
Konstrukte wie „1234e5“, „123e45“ sind also möglich.
Dieses verhalten wundert mich schon etwas. - Doch wo liegt der
Fehler?
Das Konstrukt mit „e“ gibt an, dass eine Zahl mit 10er-Potenzen dargestellt ist.
4e3 ist also 4000, da 4*10³
Wenn du das so nicht haben möchtest, füge doch ein
deineZahl=Replace(lcase(DeineZahl),"e","")
ein.
Gruß.Timo
Im Einzelschritt werden die ‚wundersamen Zahlen‘ als numerisch
anerkannt; es wird also nicht in den Ja-Pfad verzweigt.
Nun mein Code
Private Sub Text1_Change()
Dim i As Integer 'Zähler
Dim intAktPos As Integer 'Aktuelle Cursorposition im
Textfeld
Text1.Text = Replace(Text1.Text, „,“, „“)
Text1.Text = Replace(Text1.Text, „.“, „“)
If Not IsNumeric(Text1.Text) Then
intAktPos = Text1.SelStart
For i = 1 To Len(Text1.Text)
If Not IsNumeric(Mid(Text1.Text, i, 1)) Then
Text1.Text = Replace(Text1.Text,
Mid(Text1.Text, i, 1), „“)
End If
Next i
Text1.SelStart = intAktPos - 1
End If
End Sub
Das Konstrukt mit „e“ gibt an, dass eine Zahl mit
10er-Potenzen dargestellt ist.
4e3 ist also 4000, da 4*10³
Wenn du das so nicht haben möchtest, füge doch ein
deineZahl=Replace(lcase(DeineZahl),„e“,"")
ein.
Daran habe ich garnicht gedacht *rotwerd*
Gut, dann komme ich um die beiden Zeilen (‚d‘ geht ja auch durch) nicht herum.
Sei Dir meines Dankes sicher!
Aber lasse mich bitte nicht dumm sterben und verrate mir die Bedeutung von „d“, was ja auch durchgeht.
Es gäbe noch die Möglichkeit, Tastatureingaben direkt im KeyPress-Ereignis der Textbox zu verhindern.
Ich schreibe einfach mal das Prinzip:
Private Sub Text1\_KeyPress(KeyAscii As Integer)
With Text1
Select Case KeyAscii
Case 8, 48 To 57 'Backspace, Null bis Neun
Exit Sub
Case Else 'Jede andere Taste
KeyAscii = 0 'Löscht die Tastatureingabe
Beep 'Macht den Ton
End Select
End With
End Sub
Wie gesagt, es ist nur das Prinzip. Das Ganze kann dann natürlich noch individuell angepasst werden.
Vielleicht hilft Dir das ja.