admin 管理员组文章数量: 1184232
2023年12月24日发(作者:学会sql能干什么)
Excel常用的查找引用函数及方法
在excel函数的运用中,查找引用函数是经常用到的。像VLOOKUP的运用,还有有条件的引用等等。在这里,我想讲讲比较常用的几个函数,还有一些网上常见到的经典问题。
一、 VLOOKUP
VLOOKUP是初学者问得比较多的一个函数,许多人学引用就是从它开始的。它是功能是:在表格或数值数组的首列查找指定的数值,并由此返回表格或数组当前行中指定列处的数值。说白一点就是:根据首列进行查找。
它的格式:VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
用中文来表示:VLOOKUP(查找条件,查找范围,要引用的数据在范围内的第几列,查找方式<精确与否>)。
这里有点得说明一下,它的第一个参数lookup_value(查找条件)必须是查找范围的最左列,也就是首列。第四个参数,查找方式,有两种状态,一种为False(或0),函数以精确匹方式查找,并支持无序查找;一种为True(或1),函数以模糊匹配方式查找,定位在小于它的最大值。
图一
如图,在B12里的公式:=VLOOKUP(A12,$A$1:$E$10,2,0)
这公式根据A12的数据。在A1:A10里查找与A12精确匹配的数据,找到后,取相对应的第二列的数据。如果找不到,就会返回#N/A。
这里,A12的“A003”就是查找条件,$A$1:$A$10是查找范围,2是取值列,最后的0是精确匹配。
如果用模糊查找:=VLOOKUP(A12,$A$1:$E$10,2,1),并把A12的值改为:A013,大家请看图二
图二
函数就会查找小于A013的最大值A009,并取出第2列里的对应值,得到:陈平。
如果我们要根据姓名来查询学号,VLOOKUP能否完成呢?因为姓名在学号的右边,是不合乎“查找范围的最左列”的条件的。办法总是有的,以下公式就是了:
=VLOOKUP(A13,IF({1,0},$B$1:$B$10,$A$1:$A$10),2,0)
如图三:
图三
此公式利用IF函数来产生一个新的内存数组来提供给VLOOKUP作第二个参数(查找范围)进行查询,最终达到目的。
除了用这个方法外,还可以用以下公式来实现:
=INDEX($A$1:$A$10,MATCH(A14,$B$1:$B$10,0))
如图四:
图四
这里用到了两个有关查找与引用的函数:index和match
二、 index与match
2.1 函数基础
我们先看看index在帮助里是怎么说的:
返回表或区域中的值或值的引用。函数 INDEX() 有两种形式:数组和引用。数组形式通常返回数值或数值数组;引用形式通常返回引用。
INDEX(array,row_num,column_num) 返回数组中指定单元格或单元格数组的数值。
INDEX(reference,row_num,column_num,area_num) 返回引用中指定单元格区域的引用。
这里用到的是第一种:index(引用区域,引用区域的第几行,引用区域的第几列)
当引用区域只是一行或只是一列时,第二或第三个参数就得省略。举个简单的例子:
=INDEX(A1:E10,3,2)
这公式就是引用A1:D10区域的第三行第二列的数据。如图五:
图五
面公式:=INDEX(B1:B10,3)也一样得到“贝瑶”。这里的引用区域只是在D列,所以把列的参数省了。
Match的功能是:返回在指定方式下与指定数值匹配的数组中元素的相应位置
格式:MATCH(lookup_value,lookup_array,match_type)
MAT(要查找的数据,查找区域,查找方式)
这里的第三个查找方式与VLOOKUP的一样。
=MATCH(A16,B1:B10,0) 返回A16的数据(贝瑶)在B1:B10的位置,得到3。
如图六:
图六
现在回头来看公式:=INDEX($A$1:$A$10,MATCH(A14,$B$1:$B$10,0))
这回明白了吧:用Match函数取得A14(王春燕)在第几行(4),然后用index函数在A1:A10里取第四行就得到了A003。
2.2 两个经典
2.2.1同名横排
在此讲一个许多网友问过的问题。
做一个简单的例子,如下图
A列里的姓名有重复,要求把相对应的B列的值横排在唯一姓名的右边。
E2的公式:(数组公式)
{=IF(COUNTIF($A$1:$A$7,$D2) D列的值可以用高级筛选得到,也可以用公式(此公式一会就说) 公式中红色的部分是公式的核心。蓝色的部分作用是去错误值。 红色部分公式还是index的引用,第一个参数是$B$1:$B$7,只在一列引用,所以后面的还要一个参数就够。这个参数就是:SMALL(IF($A$1:$A$7=$D2,ROW($A$1:$A$7),""),COLUMN(A$1)),先看IF的部分:IF($A$1:$A$7=$D2,ROW($A$1:$A$7),""),意思是:$A$1:$A$7里的数据与D2的相等的,就取得它的行号,否则为空(""),得到的结果是:{"";2;3;"";"";6;""}。 外面套的是SMALL函数,这是了个取第N个最小值的函数。 格式:SMALL(array,k) 《SMALL(取值区域或数组,取第几个)》 前面的公式,把结果放进去就得到:SMALL({"";2;3;"";"";6;""},COLUMN(A$1)) COLUMN(A$1)的结果是1,也就是列号。这里运用行绝对列相对的引用,当公式向右拖拉复制时,COLUMN(A$1)公变成COLUMN(B$1)、COLUMN(C$1)、COLUMN(D$1)、、、、、、,这样依次会得到1,2,3,4、、、、、、这样的值。用这方法,SMALL就会在E1、F1、G1里依次得到{"";2;3;"";"";6;""}的第一、第二、第三、、、、、第N个最小值。这个就是所有“张三”所在行的行号了。 最后用index函数分别在B列里依次取得相对应的值。 再说说前面那蓝色部分吧,刚才已经说了,是去除错误值的。 IF(COUNTIF($A$1:$A$7,$D2) Countif函数是计数的,这里是计算A1:A7里有几个D2的数据,COLUMN()-4,是列号减去4,因为E列并不是第一列,所以得用-4来调整,在E1里,COLUMN()就等于5,COLUMN()-4=1。也就是这是公式开始的第一列。当列数大于COUNTIF($A$1:$A$7,$D2)时,就清空。这样,就把#NUM!这个错误值去了,这样就美观多了。 2.2.2一列中取唯一值 D列的数据又如何自动生成呢? D列的值可以用高级筛选得到,也可以用公式,这里说一个公式。取一列中唯一值的公式有许多,我们也可以运用上面的原理来到得,当然,这并不是很好的方法,但在此为了了解与熟悉这个原理,我们就拿它来开刀吧。 因为D1的标题也是唯一的,我们就从D1开始放入公式:=IF(ROW()>SUM(1/COUNTIF($A$1:$A$7,$A$1:$A$7)),"",INDEX($A$1:$A$7,SMALL(IF(MATCH($A$1:$A$7,$A$1:$A$7,0)=ROW($A$1:$A$7),ROW($A$1:$A$7),""),ROW(A1)))) 这公式可以分为两大部分,红色部分是主体,是index的引用,外层是IF,是用判断去错误值的。 在这个Index引用里,主体是IF(MATCH($A$1:$A$7,$A$1:$A$7,0)=ROW($A$1:$A$7),ROW($A$1:$A$7),""),下面看看这公式的计算机理: MATCH($A$1:$A$7,$A$1:$A$7,0)=ROW($A$1:$A$7),这一段公式,用MATCH函数分别得到$A$1:$A$7里的每一个元素在$A$1:$A$7里的位置,因为这里用了精确匹配的查找方式,得到的位置是第一次出现的位置,这样,就会得到这么一组数据:{1;2;2;4;4;2;7},也就是说,第一个数据“姓名”在$A$1:$A$7 里的位置是1,同理,第二个数据“张三”的位置是2,第三个数据“张三”的位置还是2,明白了吧?那MATCH($A$1:$A$7,$A$1:$A$7,0)=ROW($A$1:$A$7)又得到什么呢?ROW($A$1:$A$7),得到$A$1:$A$7的行号:{1;2;3;4;5;6;7},MATCH($A$1:$A$7,$A$1:$A$7,0)=ROW($A$1:$A$7)就是一个判断,把两个结果放入公式就可以看到,{1;2;2;4;4;2;7}={1;2;3;4;5;6;7},两组数据进行对比,相对应位置上的数据相等的话,就会返回TRUE(真),否则返回FALSE(假),这样就会得到这样的结果:{TRUE;TRUE;FALSE;TRUE;FALSE;FALSE;TRUE},在外层加上IF再一次选择:IF({TRUE;TRUE;FALSE;TRUE;FALSE;FALSE;TRUE},ROW($A$1:$A$7),""),是TRUE值的,返回行号,否则返回空值。(这里,也可以把后面的,""省略,这样,公式会在条件为FALSE时返回值为FALSE,这样的结果所以得到的效果是一样的。)得到:{1;2; "";4; "";"";7}(省略,"":{1;2;FALSE;4;FALSE;FALSE;7}) 最后,用SMALL函数结合ROW函数把这几个数值依次取出来,做为INDEX的第二个参数,完成取唯一值的大任。 三、 INDIRECT 3.1.1基础 返回由文本字符串指定的引用。此函数立即对引用进行计算,并显示其内容。当需要更改公式中单元格的引用,而不更改公式本身,请使用函数 INDIRECT。 上面是帮助里对INDIRECT函数功能的讲述。 这是格式: INDIRECT(ref_text,a1) ref_text:为对单元格的引用,是一个定义为引用的名称或对文本字符串。 • A1是引用式样: • 如果 a1 为 TRUE 或省略,ref_text 被解释为 A1-样式的引用。 • 如果 a1 为 FALSE,ref_text 被解释为 R1C1-样式的引用。 • 帮助里对INDIRECT函数的运用讲的并不多,但INDIRECT在引用方面的功能是很强大的。不过用法有点玄。 比如: =INDIRECT($A$1),得到的结果不是A1里的数据B1,而是A1里的数据的指向—B1单元格里的数据:100。 =INDIRECT("A1"),是对A1里的数据直接的引用了,得到:B1。 =INDIRECT("sheet1!b1"),是对sheet1!b1里的数据直接的引用。 =INDIRECT(A1&"!b1"),是对A1里的数据连接文本“B1“后的指向的引用。如图: A1里的数据是“sheet1”, A1&"!b1"其实就是sheet1!b1, =INDIRECT(A1&"!b1")得到的结果是sheet1!b1里的数据:100。 3.1.2 经典例子 这里举个INDIRECT与SUMIF相结合的三维引用的例子。 下面的例子来自excelhome网站 这是个多表汇总的例子,公式只有一个,用宏表函数得到表名。 =SUM(SUMIF(INDIRECT(IF(sht_name=csht_name,INDEX(sht_name,1),sht_name)&"!A1:a10"),A2,INDIRECT(IF(sht_name=csht_name,INDEX(sht_name,1),sht_name)&"!b1:b10")))-SUMIF(INDIRECT(INDEX(sht_name,1)&"!A1:a10"),A2,INDIRECT(INDEX(sht_name,1)&"!b1:b10")) 这里定义了两个名称 取得当前表名 csht_name=MID(NT(1),FIND("]",NT(1))+1,31) 取得全部表名: sht_name=MID(OK(1),FIND("]",OK(1))+1,31) IF(sht_name=csht_name,INDEX(sht_name,1),sht_name) 看这个,很明了的,这是典型的if的用法了:当表名是当前表时,就取用第一个表名来取代,否则直接取用就是。 因为sht_name取得的是全部表的表名,汇总表也在内了,汇总表是不参于计算的,所以就用第一个表来代替。 这样,第一个表就用多了一次,所以在后面就得减一次:-SUMIF(INDIRECT(INDEX(sht_name,1)&"!A1:a10"),A2,INDIRECT(INDEX(sht_name,1)&"!b1:b10")) 套在外一层的,就是INDIRECT的引用了:INDIRECT(IF(sht_name=csht_name,INDEX(sht_name,1),sht_name)&"!A1:a10") 其实你可以把它简化为这样:INDIRECT("各表的表名"&"!A1:A10") 写到这里,觉得有点江郎才尽的感觉了。 最后,说说choose这个函数。 这样吧,用帮助里的一个例子来说:=CHOOSE(2,A2,A3,A4,A5) 这里,有5个参数:2,A2,A3,A4,A5 第一个参数,是叫CHOOSE函数:取后面的参数的第2个(也就是A3,当然,是取得里面的数据,而不是像INDIRECT取它的指向)。后面的参数就像是水果,给CHOOSE拿的。 这函数好像没什么大作用呀,给出一大堆“水果”,然后叫他取第几个才取第几个,谁不会呀? 其实每一个函数单独使用功能再强也强不到哪,只有几个函数齐心合力一起来才显示出公式的威力。 我们看看正面的例子:工资条问题。 工资条的问题许多人都问过,当然方法也不止一个: =CHOOSE(MOD(ROW(),3)+1,"",Sheet1!A$1,OFFSET(Sheet1!A$1,ROW()/3+1,))这是罗刚君的 =IF(MOD(ROW(),3),OFFSET(工资表!$A$1,(MOD(ROW()-1,3)>0)*ROUND(ROW()/3,),COLUMN(A1)-1),"")这个公式是excelhome的版主写的,放在《excel实战技巧精粹》这本书里。 我们看罗同志的公式就是用CHOOSE来完成这个功能的。 这里,最外层的就是CHOOSE,它有四个参数: MOD(ROW(),3)+1 "" Sheet1!A$1 OFFSET(Sheet1!A$1,ROW()/3+1,) 第一个参数,是叫CHOOSE函数取后面第几个的指示参数:例如在A1里,MOD(ROW(),3)+1,ROW()就得到1,那么MOD(ROW(),3)就得到1。(这个不用太多解释吧)再+1就是2了。也就是叫CHOOSE取第二个参数:Sheet1!A$1 公式到了A2,MOD(ROW(),3)+1就会得到3,就取:OFFSET(Sheet1!A$1,ROW()/3+1,) OFFSET是个偏移函数,在这里,以SHEET1!A$1为基点,向下偏移ROW()/3+1完事。
版权声明:本文标题:Excel常用的查找引用函数及方法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1703411197a450155.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论