向x.f.zhao学习,写出这么好的公式。 公式中的15是为了适应15位长度的数字,为了解释的方便,现将它改小一点,本问题中,假如罚金不超过千元,含小数最大为6位数: B2:18日未关挡车门处罚30.05元,20日爬车处罚123元, C2=SUMPRODUCT(--TEXT(MID(TEXT(MID(SUBSTITUTE(B2,"元",REPT(" ",5)),ROW($1:$40),7),),2,6),"0.00;;;!0")) 1、把“元”替换成足够长度的空格,使后续步骤中能够从文本中截取出纯数字字符串。 在编辑栏中,按如下所示选取文本,按F9,可得到处理后的结果: =SUMPRODUCT(--TEXT(MID(TEXT(MID(SUBSTITUTE(B2,"元",REPT(" ",5)),ROW($1:$40),7),),2,6),"0.00;;;!0")) 结果为:"18日未关挡车门处罚30.05 ,20日爬车处罚123 ," 2、从文本的每一位开始,向后截取7位字符 B列中最长文本为29,替换空格后,不超过40,所以,公式中使用参数ROW($1:$40)。实际使用中,可设置一个足够大的数字,如99或200等。 MID(SUBSTITUTE(B2,"元",REPT(" ",5)),ROW($1:$40),7)得到的结果是: "18日未关挡车"; "8日未关挡车门"; "日未关挡车门处"; …… …… "处罚30.05"; "罚30.05 "; "30.05 "; "0.05 "; ".05 "; "05 "; "5 ,"; " ,2"; " ,20"; " ,20日"; " ,20日爬"; " ,20日爬车"; ",20日爬车处"; "20日爬车处罚"; …… …… 3、忽略数字,保留文本 这一步是本公式最为精彩的部分,我们一定要慢慢品味。 请跟我一起动手操作: 选择E1:E40,输入公式: =MID(SUBSTITUTE(B2,"元",REPT(" ",5)),ROW($1:$40),7) 按Ctrl+Shift+Enter结束。 选择F1:F40,输入公式: =TEXT(MID(SUBSTITUTE(B2,"元",REPT(" ",5)),ROW($1:$40),7),) 同样按Ctrl+Shift+Enter结束。 公式中,省略了TEXT()的第二个参数: =TEXT(MID(SUBSTITUTE(B2,"元",REPT(" ",5)),ROW($1:$40),7),";") 结果如下所示: 18日未关挡车 | 18日未关挡车 | …… …… | …… …… | 处罚30.05 | 处罚30.05 | 罚30.05 | 罚30.05 | 30.05 | | 0.05 | | .05 | | 05 | | 5 , | 5 , | ,2 | ,2 | …… …… | …… …… |
为什么这样做?下一步才是豁然开朗。 这么好的办法,我是想不出来的。 4、让鱼浮出水面 注意观察一下,以上结果中,第二位开始是数字的,仅有两个:“罚30.05 ”和“罚123 ”,抓住了这两个数,几乎接近最后目标了。用Mid()将40个文本处理一下,从第2位开始,取6位。 可在工作表中按以上办法演示一遍。 G1:G40=MID(TEXT(MID(SUBSTITUTE(B2,"元",REPT(" ",5)),ROW($1:$40),7),),2,6) 5、去粗取精,结尾仍是精彩的构成部分 外层的TEXT(),保留数值,把文本以0替换,为SUMPRODUCT()正确求和提供了保证。 相信大家能很好领会这个函数的作用。 如果以金额开头,这个金额将会被忽略,道理你一定明白。如果问题不会有这种情况,可以不考虑它。这是题外话。 |