我在userform中有一个文本框,只会用数字,逗号或点填充。我知道如何限制只使用那些字符。我的问题是可以在填充/点后将填充值限制为2位数
因此,当我输入类似1023,456
的值时,我不会让我在没有任何操作的情况下输入6
。
Editted:
我无法得到这个......我试过测试这里给出的代码:Regex to match 2 digits, optional decimal, two digits然而它匹配的东西太多了。当我在逗号后键入多于2位数时,它仍然匹配为良好的字符串。我用过例如:
\d{0,2}(\,\d{1,2})?
[0-9]?[0-9]?(\,[0-9][0-9]?)?
我做错了什么?
Private Sub netto_Change()
Dim regEx As New VBScript_RegExp_55.RegExp
regEx.Pattern = "\d{0,2}(\,\d{1,2})?"
If regEx.Test(netto.Value) = True Then MsgBox ("It works!")
End Sub
编辑2:
好的,我真的很接近我得到了这个代码:^[0-9]+[\,\.]?[0-9]?[0-9]$
但是缺少一件事。这种模式也应该适用于类似于321,
的字符串,最后是逗号\点,但之后没有任何内容。
怎么办?
答案 0 :(得分:0)
Textbox控件(至少有两个:ActiveX和UserForm)具有可用于QA数据的事件。
在用户窗体上:
Private Sub TextBox1_Change()
' QA text here
End Sub
还有其他事件,比如KeyDown()和Exit()可能会更好。
答案 1 :(得分:0)
这假设您有用于在用户完成对TextBox的输入之后捕获的事件代码。该代码应调用以下函数。如果字符串正常,该函数将返回 True ,如果字符串错误,则返回 False 。您的代码必须决定如何处理错误:
Public Function QualCheck(S As String) As Boolean
Dim L As Long, CH As String, I As Long
QualCheck = False
L = Len(S)
For I = 1 To L
CH = Mid(S, I, 1)
If CH Like "[0-9]" Or CH = "." Or CH = "," Then
Else
MsgBox "bad character " & CH
Exit Function
End If
Next I
If InStr(S, ".") + InStr(S, ",") = 0 Then
QualCheck = True
Exit Function
End If
If InStr(S, ".") > 0 Then
ary = Split(S, ".")
If Len(ary(1)) > 2 Then
MsgBox "too many characters after ."
Else
QualCheck = True
End If
Exit Function
End If
If InStr(S, ",") > 0 Then
ary = Split(S, ",")
If Len(ary(1)) > 2 Then
MsgBox "too many characters after ,"
Else
QualCheck = True
End If
End If
End Function
注:
此代码不依赖于 regEx
答案 2 :(得分:0)
我找到了一些时间思考,我想出了一个不同的想法,如何应对。
首先,我使用KeyPress
事件来防止输入任何不同于0-9,逗号和点的字符。为了让我的代码按照我的意愿工作,我将代码添加到Change
事件中。 If sentence
检查我的texbox输入中是否有逗号或点。如果是,则限制maxlength。
Private Sub netto_Change()
Dim znaki As Byte
znaki = Len(netto.Value)
If InStr(1, netto.Value, ".", vbTextCompare) > 0 Or InStr(1, netto.Value, ",", vbTextCompare) > 0 Then
If netto.MaxLength = znaki + 1 Or netto.MaxLength = znaki Then
Else
netto.MaxLength = znaki + 2
End If
Else
netto.MaxLength = 0
End If
End Sub
Private Sub netto_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case Asc("0") To Asc("9")
Case Asc(",")
Case Asc(".")
Case Else
KeyAscii = 0
End Select
End Sub