如果Excel函数圈也有江湖,那CHOOSE函数绝对算得上扫地僧。它不如IF函数那般威震江湖,但它的本领却更胜一筹。今天小花就带大家好好见识一下被大多数人冷遇的CHOOSE函数!
一、了解一下CHOOSE函数基本语句
CHOOSE函数使用 index_num 返回数值参数列表中的数值。使用 CHOOSE 可以根据索引号从最多 254 个数值中选择一个。它的基本语句是:
=CHOOSE(index_num,value1,value2,...)
index_num:指定索引号的参数,它是1-254之间的任意整数,CHOOSE根据该值从参数列表value1到value254中选取对应的参数。index_num可以是数字、公式或单元格的引用。
value1-value254:参数列表中至少包含一个value参数,即value1是必须的,且参数列表中的value个数必须大于或等于 index_num的最大可能值。value可以是数字、单元格引用、定义的名称、公式、函数或文本。
譬如下图中的公式=choose(D2,B2,B3,B4,B5,B6),第一个参数D2值为3,则函数从B2到B6的数值中返回第3个值B4,即猪猪。
二、单一逻辑判断能力,CHOOSE须逊IF一段香
看了上述CHOOSE函数的语句及解释,不难发现,CHOOSE函数兼具了IF函数的功能。
IF的基本语句是IF(逻辑判断,逻辑正确时返回值,逻辑错误时返回值),加之TRUE对应数值1,FALSE对应数值0,于是我们可以把IF函数语句翻译成CHOOSE函数语句,即CHOOSE(2-逻辑判断值,逻辑正确时返回值,逻辑错误时返回值)。
当逻辑判断结果为TRUE,2-TRUE=2-1=1,CHOOSE函数选取value1作为逻辑正确返回值;
当逻辑判断结果为FALSE,2-FALSE=2-0=2,CHOOSE函数选取value2作为逻辑错误返回值。
案例:
分别使用CHOOSE函数和IF函数来判断成绩是否合格,CHOOSE函数需使用2-逻辑值来将逻辑值转化成索引号,略显复杂!
三、多重条件判断能力,CHOOSE更胜一筹
对于多重条件判断,IF函数的忠实粉们会使用多重嵌套的方式来处理。但这样做的结果是函数公式冗长且繁琐,难以解读。在嵌套过程中,我们需要多次使用IF函数。而使用CHOOSE函数来完成多重条件判断,则较为简洁,但需理解并掌握索引参数index_num的设置原理。接下来我们结合实例来讲解下CHOOSE函数的多重条件判断公式原理。
案例:
将下图里的考核等级转化为对应的级别,每一个人的考核等级唯一。
此时如果用IF函数我们需要三重嵌套,这还是IF函数前套中比较简单的情景,当条件数量增加时,IF函数嵌套公式的复杂程度也会随之增大。而CHOOSE函数公式则无需嵌套,只需将index_num写成1+逻辑判断1*1+逻辑判断2*2+......+逻辑判断n*n的形式,将value 1设置为全部条件都不满足时的“待改进”,其他value值与逻辑判断条件依次对应排列即可。
IF函数公式如下:
=IF(I4="S","优秀",IF(I4="A","良好",IF(I4="B","一般","待改进")))
CHOOSE函数公式如下:
=CHOOSE(1+(B4="S")*1+(B4="A")*2+(B4="B")*3,"待改进","优秀","良好","一般")
公式说明:
CHOOSE函数的第一个参数index_num表示的是选取参数列表的索引号,当所有条件都不满足时,所有逻辑条件均返回FALSE,1+∑逻辑条件n*n=1+0=1,选取value 1作为公式的最终返回值,因此value 1应当填入所有条件均不满足时的目标结果,本例中即为“待改进”;
当第一个条件满足时,其他条件都不满足,1+∑逻辑条件n*n=1+1*1+0=2,选取value 2即“优秀”作为返回值;
当第二个条件满足时,其他条件都不满足,1+∑逻辑条件n*n=1+0*1+1*2+0=3,选取value 3即“良好”作为返回值;
以此类推。
因此,当各个逻辑条件彼此不包含时,CHOOSE函数的第一个参数应表示为1+∑逻辑条件n*n的形式,其余参数顺序为value all false,value if logical 1 true,value if logical 2 true......
相反的,如果各个逻辑条件间相互包含,则CHOOSE函数的第一个参数index_num应该写成1+逻辑判断1+逻辑判断2+......+逻辑判断n的形式,即1+∑逻辑条件n。这是因为,当逻辑n满足时,逻辑n-1一定也满足,所以满足的条件个数再加1即为选取参数列表的索引号,无需运用*n的形式进行转化。典型的问题是旧个税时的劳务报酬收入计税。譬如工资4500元,则其既大于4000,也大于800,把它们逻辑值相加再加1,得3,个税就采用公式中Value 3即A2*0.8*0.2计算,如下:
=CHOOSE(((A2>800)+(A2>4000)+(A2>25000)+(A2>62500)+1),0,(A2-800)*0.2,A2*0.8*0.2,A2*0.8*0.3-2000,A2*0.8*0.4-7000)
四、建立反向查找区域能力,CHOOSE全面占优
在运用VLOOKUP函数进行反向查找时,我们会使用IF{1,0}结构来完成表格数据列的重构,从而使VLOOKUP的目标查询值出现在查询范围的第一列。例如下图,由于数据源区域中,姓名一列在年级列的右侧,我们无法直接使用VLOOKUP进行查询,于是我们用IF{1,0}将A列和C列数据重排顺序,当判断为真(1),输出$C$10:$C$14列数据,判断为假(0)输出$A$10:$A$14列数据,从而新构建了以$C$10:$C$14为首列,$A$10:$A$14为第二列的数列作为查找区域,使VLOOKUP函数可以顺利查询到目标结果。
于是,问题来了。IF{1,0}结构仅能指定两列数据的顺序,无法指定多列数据的顺序,来组合成新的查询区域,这使得我们经常需要为相同查询逻辑不同查询列的多个单元格单独设置公式,无法拖动填充公式匹配列查找。譬如当前就不能将B2公式拖动填充到C2中。IF{1,0}结构的这一缺陷,使得它在与CHOOSE的对比中一败涂地!
下面是CHOOSE出手,直接一次性把3列数据重新排序构建出统一的查询区域,公式可以直接从B2拖动填充到C2中:
=VLOOKUP($A2,CHOOSE({1,2,3},$C$10:$C$14,$A$10:$A$14,$D$10:$D$14),COLUMN(),0)
公式说明:
该公式的重点是我们运用CHOOSE{1,2,3}结构将表中三列数据A10:A14、C10:C14、D10:$D14重新按C10:C14排第1列,A10:A14排第2列,D10:$D14排第3列的顺序组成一个新的数据区域用作Vlookup的查找区域。再借由COLUMN()返回公式所在单元格的列数,确定VLOOKUP查询返回的列数。CHOOSE函数的该用法大大突破了IF{1,0}结构只能将两列数据交换位置进行重建的限制,可以说是后者的威力加强版!