经常进行函数查询的用户对LOOKUP函数应该不会陌生,它主要用于在查找范围中查询用户指定的查找值,并返回另一个范围中对应位置的值。其查询原理与VLOOKUP函数和HLOOKUP函数中当第4个参数为1或TRUE时非常相似。
LOOKUP函数目前已经被使用得非常广泛,具体的函数语法如下:
LOOKUP(lookup_value,lookup_vector,[result_vector])
LOOKUP(lookup_value,array)
为了便于用户更加清晰地了解该函数的用法,现将该函数的各个参数含义介绍如下。
l lookup_value查找值:可以使用单元格引用、常量数组和内存数值;
l lookup_vector查找范围和result_vector结果范围:同样支持单元格引用和常量数组;
l 同时,在第2个语法中列出的array参数中,LOOKUP函数还支持使用二维数组进行查找,函数返回二维数组中最后一列(或者一行)的结果。
注意:中文版Excel 2010中关于LOOKUP函数的帮助文档仍然存在错误,查找范围的数据并非必须升序排列。
只有当需要在查找范围中查找一个明确的值的时候,查找范围必须升序排列;当希望查找一个不确定的值时,如查找一列数据最后一个值,查找范围并不需要严格地升序排列。同时,LOOKUP函数支持忽略空值、逻辑值和错误值来进行数据查询。
同时,LOOKUP函数是Excel查找类函数中位数不多的在函数内部支持数组运算的函数,而且经过内部数组运算后,该函数几乎可以完成所有VLOOKUP函数和HLOOKUP函数的查找任务,目前已经被广大Excel函数爱好者们广泛使用。
提示:深入理解LOOKUP函数的查找原理
LOOKUP函数以其高效率的运算速度逐渐被Excel函数公式爱好者们所喜爱,在Excel Home技术论坛上,LOOKUP函数已经被很多用户运用到大量的实际工作 中,特别在数组公式、内存数组应用中被更加广泛地运用。
经过大量的数据分析表明,LOOKUP函数采用“二分法”的原理进行数据查找,因此运算速度肯定高于使用“遍历法”的函数查找。
“二分法”查找原理解释如下:
1. 数据升序排列(默认);
2. 在由N个数据组成区间(1~N)查找某值X。
假设查找范围中有100个数据,LOOKUP函数首先比较中间值(第INT(1+100)/2=50个数据)与X的大小,如果该值比要查找的X小,那么由于数据是升序的,则收敛搜索区域为“右区间”即第51个~第100个。反之则在“左区间”查找,进入次级区间后,将再度使用刚才的方法进行对比查找。如果中间值刚好=X,则在右区间中继续查找,知道返回最后一个等于X的位置为止。
另外,与“二分法”不同的另外查找数据方法:“遍历法”-顾名思义,对所有数据都要从头到尾“扫描一遍”。
同时,针对其查找原理进行推算得出近似的运算速度比较结果如下。
假设遍历法=N,二分法=POUNDUP(LOG(N,2),)。
即对LOOKUP函数对数据查找范围反复使用逐层减半地缩小搜索 范围,从而达到加快查找速度的目的。
一、使用LOOKUP进行查询
示例1:从成绩明细表中查询学员总成绩。
如图1所示,展示了某年级学员的某次月末考试成绩表,下面使用LOOKUP函数来实现查询学员的总成绩。
注:为了加快查询速度,学员姓名已经按升序排列。
假设F12单元格为选择的学员姓名:孙佩,F13单元格公式为:
=LOOKUP($F$12,$B$3:$B$10,$I$3:$I$10)(公式1)
或:
=LOOKUP($F$12,$B$3:$I$10)(公式2)
公式1中使用了LOOKUP函数的标准用法,分别针对B列姓名进行升序查找,并在I列中返回学员总分结果。
而公式2主要利用LOOKUP函数在二维区域中的查找原理,函数在B3:I10的区域中最左列进行姓名查找,并返回二维区域中最后一列的总成绩。
利用这个技巧的优势在于,用户无无须像VLOOKUP函数必须指定返回值的列数,公式更为简单。
二、代替VLOOKUP函数查找
通过上节中对LOOKUP函数的介绍,用户已了解LOOKUP函数可以在很多时候代替VLOOKUP函数来进行升序查找。如果数据在无序状态下,LOOKUP函数同样可以利用其内部数组运算的原理来实现无序查询。
示例2:利用LOOKUP函数实现无序查询。
如图2所示,展示了一份员工信息表,希望在B3单元格通过B2的姓名查询其部门归属,从图中明显看到结果返回错误。在下面的示例中,将利用LOOKUP函数来实现姓名数据的无序查询。
在原B3公式中,由于信息表中E列姓名未按升序排列,因此公式返回错误结果。如果这时使用LOOKUP函数,B6单元格的公式修改如下:
=LOOKUP(1,0/(E:E=$B$5),F:F)
公式主要使用了查找姓名在信息表中有效的姓名范围中进行比较判断,如(E:E=B5)比较结果为:{FALSE; FALSE; FALSE; FALSE; TRUE;FALSE; FALSE}
再利用0除以这个内存数组,结果为:{#DIV/0!; #DIV/0!; #DIV/0!; #DIV/0!; #DIV/0!; #DIV/0!; #DIV/0!; #DIV/0!},最后在这个数组中查找数值1,返回小于等于1的最大值位置,即前面结果中0的位置(位置6),返回对应的部门名称:项目管理部。
此算法是LOOKUP函数在无序查找中的典型用法,由于函数本身支持数组内部运算,因此该公式无须使用数组公式组合键进行输入,目前已经被很多用户广泛使用。
提示:在Excel2010中,已经支持用户选择整列数据(如:E:E=$B$5)进行数据比较操作,Excel会自动选择有效数据区域进行处理,而不会像Excel2003返回#NUM!错误结果。