本期总结.
从回复的答案来看,主要有以下3中类型.
第一类是逐步去除法,如FDD:
优化FDD后的:
=SUM(TEXT(REPLACE(0&TEXT(MID(A1&"CC",ROW($1:$100),COLUMN(A:P)),),LEN(0&TEXT(MID(A1&"CC",ROW($1:$100),COLUMN(A:P)),)),1,""),"[>1e13]!0;[<10]!0;0%;!0")*ISERR(-(MID("C"&A1,ROW($1:$100),1)&0))
第二类是将数字展开后,取首尾都是文本的数字串,如冻豆腐,和WDDN:
WDDN:
SUM(--TEXT(MID(LEFT(A1,ISERR(-(1&MID(A1&"@",ROW($2:$100),1)))*ROW($1:$99)),IF(ISERR(-(1&MID("@"&A1,COLUMN(A:AV),1))),COLUMN(A:AV),99),99),"[>"&10^13&"]!0;[<10]!0;.00;!0"))
冻豆腐:
=SUM(-TEXT(TEXT(MID(TEXT(MID(REPLACE("a"&ASC(A1)&"A",COLUMN(1:1),1,REPT(" ",16)),ROW($1:$89),17),),2,16),"0%;0%;0%;!0"),"[>"&10^13&"]!0;[<10]!0;-0%")*IF(ISERR(FIND(MID("a"&ASC(A1)&"A",COLUMN(1:1),1),".0123456789")),1,0))
第三类,也是理解起来比较容易的就是以XCD,YOKA为代表的,直接在字符串中按长度取数,而长度通过mmult求含数字的个数. 这样取得的数字会包含前面的子数字串.所以需要用前面首个是否只文本来确定.
XCD:
=SUM(--TEXT(MID(A1,ISNUMBER(-(MID("A"&A1,ROW($1:$99),1)&0))*99+ROW($1:$99),MMULT(1-ISERR(-MID(A1,ROW($1:$99),COLUMN(A:CU))),ROW($1:$99)^0)),"[<10]!0;[<=1e13]0%;!0;!0")
YOKA:
=SUM(--TEXT(MID("Z"&A1,ISERR(-(0&MID(A1,ROW($1:99)-1,1)))*ROW($1:99)+1,MMULT(1-ISERR(-MID(A1,ROW($1:99),COLUMN(A:O))),ROW(1:15)^0)),"[<10]!0;[>1e13]!0;0%;!0"))
其中wenshui2006也是这个方法,但由于去除子数字串的手段是串联的,所以超过了嵌套限制而无法使用:
=SUM(--TEXT(0&MID(TEXT(MID("a"&A1,ROW($1:$99),MMULT(TEXT(MID(A1,ROW($1:$99),COLUMN(A:O)),"!1;!1;!1;!0")*1,MOD(ROW($1:$15),1)+1)+1),),2,15),"[<10]!0;[>1E+13]!0"))
其中第三类应该是比较容易想到的办法,也是本题答案中用的较多的一种,关键使用并联判断并优化,不要重覆判断.
第二类答案的思路方向其实是本题的核心考点之一,即在2维面里的比较判断技巧(BTW:这也是本期函数另外一题的技巧考点);另一个考点是满足180字符以下的公式都要使用到的TEXT双条件判断功能,辅助的一个小技巧是0%格式保留2位数.
我的答案:
第二类思路的答案,153个字符:
=SUM(-TEXT(IF(ISERR(-MID(A1,ROW($1:99)-1,2)),0&MID(A1,ROW($1:99),MMULT(1-ISERR(-MID(A1,ROW($1:99),COLUMN(A:P))),ROW(1:16)^0)),),"[>1e13]!0;[<10]!0;-0%"))
需要注意一下的是首文本判断用ISERR(-MID(A1,ROW($1:99)-1,2))即可. 只要是合法的数字串,不可能2个字符中有一个文本的.其中利用的>10隐含条件的技巧.
中规中矩的写法是158:
=SUM(-TEXT(IF(ISERR(-MID(A1,ROW($1:$99)-1,2)),0&MID(A1,ROW($1:$99),MMULT(1-ISERR(-MID(A1,ROW($1:$99),COLUMN(A:P))),ROW($1:$16)^0)),),"[>1e13]!0;[<10]!0;-0%"))
第三类思路的答案,130个字符
=SUM(TEXT(LEFT(TEXT(MID(A1&"a",ROW($1:99),COLUMN(A:P)),),COLUMN(A:P)-1),"[>1e13]!0;[<10]!0;0%;!0")*ISERR(-MID(A1,ROW($1:99)-1,2)))
用2个TEXT结合LEFT留下尾部是文本的数字串,用ISERR去除首部不是文本的数字串后,直接求2维数组里的和.
此公式适用除日期和科学记数以外的所有情况,包括含负数.
中规中矩的写法是132:
=SUM(TEXT(LEFT(TEXT(MID(A1&"a",ROW($1:$99),COLUMN(A:P)),),COLUMN(A:P)-1),"[>1e13]!0;[<10]!0;0%;!0")*ISERR(-MID(A1,ROW($1:$99)-1,2)))
[ 本帖最后由 willin2000 于 2008-12-24 18:26 编辑 ] |