限制文本框中逗号后的位数

时间:2014-03-17 12:54:31

标签: excel-vba textbox limit digits restrict

我在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,的字符串,最后是逗号\点,但之后没有任何内容。

怎么办?

3 个答案:

答案 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