以下是引用lukelu在2007-4-26 8:39:07的发言:在《精粹》291页, 技巧170-3, 文本和数字的分离, 其中公式: c2=right(a2,sum(len(a2)-len(substitute(a2,{0,1,2,3,4,5,6,7,8,9},)))) 进而返回:len({5,7,7,6,6,6,7,7,7,7}) len(a2)-len({5,7,7,6,6,6,7,7,7,7}) = len({2,0,0,1,1,1,0,0,0,0}) 其实这个问题这样可能好理解一些,试想假设请问“JD00345”中几个0? 1、我们首先可能会想到Find函数,来查找0是否存在?但用Find只能定位到第1个0,不能确定有几个;同样,如果使用COUNTIF的模糊查找也只能确定是否有0,也不能确定有几个。 2、既然查找函数无法知道具体的个数,那么可能会想到使用替换函数来将0替换掉,替换为空,因此就有了Substitute的用法,使用原字符长度减去替换掉0后的长度,就是具体包含有0的个数。于是得出了Len(A1)-Len(Substitute(A1,0,))的解法。 3、有这个思路,所以才会想,要想得到所有数字个数,是否只需要将0-9的个数计算出来,就可以了。于是就有了: =Len(A1)-Len(Substitute(A1,0,))+Len(A1)-Len(Substitute(A1,1,))+Len(A1)-Len(Substitute(A1,2,))+Len(A1)-Len(Substitute(A1,3,))...+Len(A1)-Len(Substitute(A1,9,)) 4、但这样书写是否很繁杂,公式很冗长?所以才将0-9的数字写成常量数组作为参数,这样就有了: =len(a2)-len(substitute(a2,{0,1,2,3,4,5,6,7,8,9},)),但由于参数是数组,结果只能得到各个数字的个数的数组,所以必须使用SUM函数来汇总,才能得出具体的数字总数,最后再用Right来取得连续的数字字符串。 5、通过上面的思路汇总,才产生了最后的公式:=right(a2,sum(len(a2)-len(substitute(a2,{0,1,2,3,4,5,6,7,8,9},)))) 因此,这样的设计思路并非一步到位的,也是经过层层的将复杂问题分解成若干个小问题,通过逐个小问题的解决,最后汇集成最终思路,通过分解过程学习到解题的思路,逐步对函数的应用进行掌握,以后才能举一反三的运用。 当然,解决这个问题的方法有多种,例如下面的公式: 1、{=Right(A1,COUNT(--MID(A1,row(indirect("1:"&Len(A1))),1)))} 2、{=Right(A1,Match(1,0*Right(A1,row(indirect("1:"&Len(A1))))))} 3、=Mid(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),Len(A1))
[此贴子已经被作者于2007-4-26 21:58:10编辑过] |