IF不可不用,不可多用

 IF不可不用,不可多用

文章选自:http://post.baidu.com/f?kz=49511214,作者:juyouhh
              先说不可不用。
            if最善于解决非此即彼、非男即女、非阴即阳、非前即后、非有即无的问题。如果问题的答案是二选其一,则除了if,没有更好的办法。比如学龄,以7岁为条件,if(年龄>=7,"已到学龄","未到学龄"),做这样的判断,任何函数方法都不会更简明于此了。
            如果我们的问题都是这么简单就好了。
            有一个著名的数组公式,其内核公式为:if(match(列起点:列终点,列起点:列终点,0)=row(列起点:列终点),row(列起点:列终点),""),作用是在一列中查找重复值各单项的所在行号,这个if就是不可或缺,不可不用的,因为到目前为止还没有其他更简明的办法来达到用公式筛选重复值的目的。但说穿了,if在这里所解决的,仍然还是一个非此即彼的问题。
            再看一例:设A列为姓名,B列为数值, 求姓名甲的数值合计。{=SUM(IF(A1:A15="甲",B1:B15))},其实也是一类问题,是{=SUM(IF(A1:A15=" 甲",B1:B15,0))}的一种简写,叫做非甲即0。而在数组公式中,*号可以用来替代AND,+号则可以替代OR,因此也可以进一步简写作 {=SUM((A1:A15=F1)*B1:B15)},而且条件越多,越可以体现这种写法的优点,比如再加上一列月份,求甲在3月份的数值合计,你可以 省下两个if,多用一个*号就可以了(自己试试?)
       再来说不可多用。
            为什么不可多用?大致是因为:一、会增加公式写入的强度;二、降低公式的可读性;三、降低运算速率;四、不利于脑力的发挥和开掘,使人懒惰。
            例一:A1为一个数值,其范围为1-7,B1设置公式,按A1数值变化分别等于A-G。
            先来看看纯粹使用if的解法:=IF(A1=1,"a",IF(A1=2,"b",IF(A1=3,"c",IF(A1=4,"d",IF(A1=5,"e",IF(A1=6,"f",IF(A1=7,"g","")))))))
            是不是很麻烦?何止是麻烦,假如再增加两个条件,A1的数值范围为1-26,B1相应取值为A-Z,你又当如何?
            if的嵌套最大可以为7层,上面的公式已经用到了极限。虽然说可以用一些旁门左道来“突破”这个限制,但也只是一种堆沙式的游戏,如上例,可以采用以下 方 式:=IF(A1=1,"a",IF(A1=2,"b",IF(A1=3,"c",IF(A1=4,"d",IF(A1=5,"e",IF(A1=6,"f",IF(A1=7,"g","")))))))& amp;IF(A1=8,"h",IF(A1=9,"I",""))……
            这样的用法,真是叫人兴味荡然,昏昏欲睡,EXCEL何必还要学下去,还不如去跟儿子摆积木更好玩呢!
            所以说,if最好不要多用。不是说不能用,而是说用多了会叫人伤心。
            其实EXCEL里准备了许多办法来替代上面的愚蠢的做法。
            比如CHOOSE函数。=CHOOSE(A1,"a","b","c","d","e","f","g","h","i"),这是不是方便多了?CHOOSE的参数清单可以有29项之多,一般足够你使用了。如果还不够,那么请看下面:
            =LOOKUP(A1,{1,2,3,4,5,6,7,8,9,10;"a","b","c","d","e","f","g","h","i","j"}),你可以尽情地输入参数,只要公式内容长度允许(规定公式内容长度为1024个字符)。
            如果真的如例中所举,只是生成A-Z等字母的话,则只需=CHAR(A1+64)就可以了。当然,实际使用中这样的巧合实在是太少了,但作为一种方法还是有提及的必要。
            一个if只能处理一个有无或是否的问题,即使这个问题可能是由诸多小的方面组合而成的。我们可以利用这一点,来达到替代if使用的目的。
            例二:公司结算日期为每月24日,帐目的月份一栏,如果超过24日,就要记为下月。
            如果按照普通思路,公式应该是这样的:=IF(DAY(A1)>24,IF(MONTH(A1)=12,1,MONTH(A1)+1),MONTH(A1))
            要用到两个if判断,外层的是判断日期是否大于24,内层的是判断月份是否在12月,因为12月的下月是1月而非13月。现在对比一下下面的公式:
            =MONTH(DATE(YEAR(A1),MONTH(A1)+1,0)+(DAY(A1)>24))
            后者用了A1日期当月最后一天的序列值,最重要的是后面加了一个由判断是否大于24而生成的逻辑值,相当于=if(day(a1)> 24,1,0)。逻辑值在公式设置中是一个很重要的概念,是对问题本身的逻辑关系的判断,其中TRUE=1,FALSE=0,生成的同样是有无或是否的结果,用得恰当,会使你的公式格外生动有趣。类似的还有根据年龄计算性别、年龄的公式,也是使用逻辑值做判断,具体见我以前的相关帖子,此处不在赘述。
            是不是一定要少用if,以至于该用的也想办法不用?我曾经说,最少用到if的公式往往是最好的公式。之所以用“往往”来做限制,就是因为我没有根据来做一定如此的定论。凡事都要实事求是,具体情况具体分析。
            例三:A1为性别,B1为年龄,C1标注是否退休。条件是男60岁,女55岁。
            对这个问题,=IF(OR(AND(A1="男",B1>=60),AND(A1="女",B1>=55)),"退","未退")只用到一 个if,但未必就比=IF(B1-IF(A1="男",5)>=55,"退","未退")更简洁,尽管后者用到两个if判断。当然我还是反 对=IF(AND(A1="男",B1>=60),"退",IF(AND(A1="女",B1>=55),"退","未退"))这种用法的。
            就写这么多,欢迎批评。
      
              更正:"类似的还有根据年龄计算性别、年龄的公式",前一个“年龄”应该是“身份证”,抱歉。

       作者: juyouhh     2005-10-11 22:04   回复此发言 
   
    回复:if不可不用,不可多用
       多看多用多学多总结嘛,谁天生就会?
            比如我看到http://post.baidu.com/f?kz=48756270 中juyouhh
            的那个公式=SUM((CODE(MID(A1,ROW(INDIRECT("a1:a"&LEN(A1))),1))> 45216)*1),其中的ROW(INDIRECT("a1:a"&LEN(A1)))就是一个很好的例子,是一个怎么在数组公式中取得连续序 列的很好的实例,这样看这个公式就不仅仅只是看到整个公式的功能,而应该是学到一些解决问题的思路*~_~*
   
       作者: bengdeng     2005-10-12 08:50

沒有留言:

張貼留言