EXCEL VBA正则表达式解决限制单元格输入正负数字小数点问题

2020-05-23 15:01  作者: M先生  点击数:

有时在用VBA开发录入打印格式时,往往会要求单元格只能输入正确有数字(例如:要求只能输入123,12.3,-123,-12.3这类数据),以准确计算结果。如果输入了其他非数字的内容时,则作出提示和录入限制。


VBA本身也有数字的判断函数isnumeric(),但在实际使用中,往往会有一些意想不到的情况出现。

先来看看isnumeric()的使用方法:


语法IsNumeric(expression)

必要的expression 参数是一个Variant,包含数值表达式或字符串表达式。

如果整个 expression 的运算结果为数字,则 IsNumeric 返回 True;否则返回 False。

如果 expression 是日期表达式,则 IsNumeric 返回 False。


是的,没看错,以上说明应该是能准确的判断是否为数值的。

再来看看一些例子:

① | "456" (纯数字)

② | "-123" (带负号)

③ | "12.3" (带一个小数点)

④ | "11,,,,23.4,,,33.3" (此处是英文的逗号)

⑤ | "134,,,1.22,,,3" (注意,此处是中文的逗号)

⑥ | "135e+9" (中间位置带有e和+号)

⑦ | "189d-9" (中间位置带有d和-号


然后,我们用IsNumeric()来判断,以上例子通通都是True。

如果不信,可以自行在VBA中测试。


这是怎么回事?


很显然,第四种以后的类型,都不符合我们的录入要求。但如果不小心录入了第四个以后的例数,在运算的时候,岂不是乱套了?


因此, 特意找了一些方法,其中最好用的,莫过于用正则表达式来判断录入是否符合要求,并限制录入的数据,以达到最好结果。


在网上找了一个例子,挺符合我的要求的。

表达式是:^\d+$|^\d*\.\d+$

理解为:以数字开头,或者中间有且只有一个小数点(非必要),并以数字结尾的字符串,符合的就为TRUE


但在后来的运用中,发现有时需要录入负数,例如退货,退款录入时,没有专门的退货退款的,直接需要在原单上用负数表示退回。但这个表达式,只认识纯数字和一个小数点的值,所以,负数也被限制录入了。


经过一番测试,改进了表达式,可以正确识别正负号的情况。

表达式:^(\-|\+?)\d+$|^(\-|\+?)\d*\.\d+$

理解为:以正(+)或负(-)开头,这个正负号可有可无,跟着必须是数字,且必须是以数字结尾的一串字符。或者中间有且只有一个小数点(非必要)。


具体应用,我们可以把这个表达式做成一个判断函数,在使用时直接调用判断,返回TRUE,表示录入正确,返回False则表示出错了。。


Function pd(s)

''''判断s是否为正负号,数字,小数点组成的一串数字,如果是,返回pd=true

    pd = False    ''''先默认返回值为false

    With CreateObject("VBSCRIPT.REGEXP")

        .Global = True

        .Pattern = "^(\-|\+?)\d+$|^(\-|\+?)\d*\.\d+$"    ''''表达式

        If .test(s) Then pd = True    ''''如果符合表达式,则返回pd的值true

    End With

End Function


在实际中调用:


s= "123.56.6"

if pd(s)=false then 

    msgbox"输入的数据不符合要求,请重新输入"。

    ......

    exit sub

end if


来源:(QQ号:417284054),转载请保留出处!

  • PingL
  • 打赏