Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 限制文本框中逗号后的位数_Excel_Vba_Textbox - Fatal编程技术网

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

Excel 限制文本框中逗号后的位数,excel,vba,textbox,Excel,Vba,Textbox,我在userform中有一个文本框,它将只填充数字、逗号或点。我知道如何限制只使用那些字符。我的问题是,是否可以将填充值限制为昏迷/点后的2位数字 所以当我输入像:1023456这样的值时,它不允许我在没有任何操作的情况下键入6 编辑: 我不能得到这个。。。我尝试测试这里给出的代码:但是它匹配的东西太多了。当我在逗号后键入超过2位数字时,它仍然匹配为良好字符串。例如,我使用了: \d{0,2}(\,\d{1,2})? [0-9]?[0-9]?(\,[0-9][0-9]?)? 我做错了什么 Pri

我在userform中有一个文本框,它将只填充数字、逗号或点。我知道如何限制只使用那些字符。我的问题是,是否可以将填充值限制为昏迷/点后的2位数字

所以当我输入像:
1023456
这样的值时,它不允许我在没有任何操作的情况下键入
6

编辑:
我不能得到这个。。。我尝试测试这里给出的代码:但是它匹配的东西太多了。当我在逗号后键入超过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,
结尾带有逗号\dot,但后面没有任何内容。

怎么办?

文本框控件(至少有两个:ActiveX和UserForm)具有可用于验证数据的事件

在用户窗体上:

    Private Sub TextBox1_Change()
        ' QA text here
    End Sub

还有其他一些事件,比如KeyDown()和Exit(),可能工作得更好。

这假设在用户完成对文本框的输入后,您有事件代码来捕获。该代码应该调用以下函数。如果字符串是好的,函数将返回True,如果字符串是坏的,函数将返回False。您的代码必须决定如何处理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
注:


这段代码不依赖于正则表达式,我花了一些时间思考,并就如何处理这一问题提出了不同的想法

首先,我使用了
KeyPress
event来防止输入任何不同于0-9、逗号和点的字符。为了使我的代码按我所希望的那样工作,我将代码添加到
Change
事件中<代码>如果句子检查我的文本框输入中是否有逗号或点。如果是,则限制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

张贴您用于处理文本框值的代码。在您的应用程序中,逗号是否表示千位分隔符或小数点,或者两者都不表示?@rajah9这是小数点。所以,这是一个不可能增加更多数字的例子——特别是偶然的。@Gary的学生到目前为止,我还没有想到任何方法来实现它。我甚至不确定这是否可能。VBA可以使用正则表达式。看见如果您更改.pattern,使其有一个“、dd”,那么它将只接受逗号后的2位数字。尝试一下,并用您的代码创建一个新线程。说明您使用的文本框类型和位置:工作表上的控件,UserForm。实际上,不是
之后的
,而是
更改时的
。这就是为什么逗号/点后的第三位数字不能输入或可以输入,但必须立即删除。感谢您的努力!如果你有一个想法,测试它会很好。