留个记号 方便学习
8楼x.f.zhao的公式
=SUMPRODUCT(--TEXT(MID(TEXT(MID(SUBSTITUTE(B2,"元",REPT(" ",15)),ROW($1:$99),15),),2,15),"0;;;!0"))
25楼山版的解释
向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结束。
QUOTE:
公式中,省略了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()正确求和提供了保证。
相信大家能很好领会这个函数的作用。
如果以金额开头,这个金额将会被忽略,道理你一定明白。如果问题不会有这种情况,可以不考虑它。这是题外话。 |