- 正文
- 点这评论:
-
有时在用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
来源:M先生的博客(QQ号:417284054),转载请保留出处!