数据如下,查找李四(B11)的性别(C10),尝试用多种方法来通过姓名查找性别(当然,普通的情况是两部分放在不同的工作表中(每部分都有规模较大的数据),这里是为了方便演示。):
不管使用哪种查找引用函数,由“李四”(B11)确定行,“性别”(C10)确定列。可有多种方法达到同样的目的(公式中使用不同函数或函数组合)。
1 Vlookup函数vlookup是查找vlaue,是特指vertically lookup value,所以这里的v不是value,而是vertical,因为在Excel中,除了垂直纵向查找的vlookup,还有水平横向查找的hlookup。
看下面的语法规则,vlookup是由第三个参数确定列,去查找行,所以是纵向查找。适合于第一行是字段(变量),其它行是记录(各变量取值)的工作表。
VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup])
参数 | 简单说明 | 输入数据类型 |
lookup_value | 要查找的值 | 数值、引用或文本字符串 |
table_array | 要查找的区域 | 数据表区域 |
col_index_num | 返回数据在查找区域的第几列数 | 正整数 |
range_lookup | 精确匹配/近似匹配 | FALSE(0、空格或不填(但是要有','站位))/TRUE(1或不填(无逗号站位)) |
该函数由第三个参数确定目标列,由第一个参数在第二个参数中查找匹配值的首次匹配行:
=VLOOKUP(B11,$B$4:$F$7,MATCH(C10,B3:F3,0),0)
B11(李四)是查找值,$B$4:$F$7查找区域(以李四所在列开始,查找其所在行),第三参数用了Match返回列号3,李四匹配的首行是第2行。精确匹配为OFFSET(B4,2-1,3-1,1,1)的值。
2 Hlookup函数hlookup的 h 是指horizontal,horiaontally lookup,lookup column。
看下面的语法规则,第三个参数确定了行,要去查找列。
适合于第一列是字段(变量),其它列是记录(各变量取值)的工作表。
HLOOKUP(lookup_value,table_array,row_index_num,range_lookup)
参数 | 简单说明 | 输入数据类型 |
lookup_value | 要查找的值 | 数值、引用或文本字符串 |
table_array | 要查找的区域 | 数据表区域 |
row_index_num | 返回数据在要查找的区域的第几行数 | 正整数 |
range_lookup | 模糊匹配/精确匹配 | TRUE /FALSE(或不填) |
=HLOOKUP(C10,B3:F7,MATCH(B11,B3:B7,0),0)
“性别”(C10)是查找值,B3:F7查找区域(以性别所在行开始,查找其所在列)。
“李四”(B11)确定行,“性别”(C10)确定列。
3 Lookup函数lookup函数有数组和向量两种形式:
LOOKUP(lookup_value,array)
以上是数组形式,查找值和要找的结果分别位于查找区域array的首列和末列。
LOOKUP(lookup_value,lookup_vector,result_vector)
式中 lookup_value:函数LOOKUP在第一个向量中所要查找的数值,它可以为数字、文本、逻辑值或包含数值的名称或引用;
lookup_vector:确定查找区域,只包含一行或一列的区域,其可以是文本、数字或逻辑值,必须按升序排列(因为LOOKUP函数使用的是二分法查找,也就是模糊匹配);
result_vector:由查找区域匹配结果所在区域,只包含一行或一列的区域,其大小必须与 lookup_vector 相同。
对于未排序的数据,需要使用一个小技巧,通过构造和查找逻辑值来实现:
=LOOKUP(0,0/(查找范围=查找值),结果范围)
0/(查找范围=查找值)可以构造一组逻辑值。在这组值内去查找0。
=LOOKUP(0,0/(B4:B7=B11),INDEX(C4:F7,,MATCH(C10,C3:F3,0)))
Lookup的第一个参数是查找值,第二参数可以一个数组,B4:B7=B11产生一个数组{FALSE;TRUE;FALSE;FALSE},然后用0除以它,又产生一个新的数组{#DIV/0!;0;#DIV/0!;#DIV/0!},只有一个0,其它全部为错误值,这个0就是我们需要的,这样就解决了Lookup函数第二参数要按升序排序的要求了。
Lookup函数第三参也是一个数组,我们用Index函数来实现,因为Index函数如果省略第二参数,刚好是返回第三参数的列区域,而Index函数第二参数也用了Match函数来找到符合条件的列{"男";"女";"男";"女"}。
了解更多lookup函数,参考:
http://www.itblw.com/graphic/139fcf04c051737b903bf13d4fbd1e8f.html
4 Index函数=INDEX(C4:F7,MATCH(B11,B4:B7),MATCH(C10,C3:F3,0))
直接由两个match函数确定行,列,由index函数在指定区域内返回值。
5 Offset函数=OFFSET(B3,MATCH(B11,B4:B7,0),MATCH(C10,C3:F3,0),1,1)
Offset这个函数作用是根据某一参照单元格,经过偏移行、偏移列,然后得到新的引用区域的,这个新的引用区域如果是一个单元格的话,那就最后两个参数都是1,如果得到的这个新的引用区域是一个多行多列的区域的化,那么最后两个参数就是行高与列宽。
Offset的第一个参数是B3,参照单元格,第二参数用Match函数来返回偏移多少行,同样用Match函数来实现偏移多少列,第四参数是指新区域的行高是1,第五参数是指新区域的列宽是1,如果最后两个参数都是1,那么新区域就是一个单元格。
6 Indirect函数=INDIRECT(LOOKUP(MATCH(C10,C3:F3,0),{1,2,3,4},{"C","D","E","F"})&MATCH(B11,B4:B7,0) 3)
Indirect这个函数的作用是根据单元格的引用(字符串)返回引用单元格的值,这个函数有二个参数,不过我们用时都是只写它的第一个参数,因为第二参数是1或者省略的话,那么第一参数用的是A1引用样式。
我们用了Lookup这个函数返回列号, 而lookup函数的第一参数用了Match函数来找列的位置,找到相应的位置之后,就会对应相应的字母CDEF,然后我们用Match函数来找行号,行号还要加上这个公式前面的行数。
7 数组函数{ =INDEX(B3:F7,MAX(IF(B3:B7=B11,ROW(B3:B7)-2,0)),MATCH(C10,B3:F3,0)) }
Index函数的第二参数用了数组,先判断符合条件用了if函数。
IF(B3:B7=B11,ROW(B3:B7)-2,0)这个返回一组数{0;0;3;0;0},符合条件就显示纵向位置,不符合的就显示0,然后用最大值函数Max从{0;0;3;0;0}中提取这个3,这个3就是Index函数的第二参,行参数,Index第三参数用了Match实现,取得行所示的横向w位置。有了两个位置值及数据区域,由index即可返回值。
8 说在最后以上实例用vlookup是最直观的,其它方法只是为了演示其它查找与引用的公式,只是为了说明查找与引用的实质是如何去确定行、列。vlookup当然也有缺陷,例如不能反向查找与引用,这时,其它函数就派上用场了。
对于较复杂的公式或函数,可以理解起来较复杂,有两个技巧可供分享:
8.1 打开“函数参数”对话框查看函数功能、返回、参数。
a 在单元格中输入等号函数名和左小括号,如“=if(”,点击“插入函数”图标,即可打开“函数参数”对话框。
b 选择含有公式,公式中含有函数的单元格,点击“插入函数”图标,即可打开“函数参数”对话框(对应公式中的第一个函数)。
c 如果公式有多个函数或函数有嵌套,需要查看的是除第一个函数以外的其它函数,只要单击到该函数部分,点击“插入函数”图标,即可打开该“函数参数”对话框。
8.2 利用“F9”来对公式做“局部”求值,对数组公式也是如此,特别是数组因为是一个数组,无法在一个单元格中显示结果时。
8.3 利用“公式”选项卡中的“公式求值”可以按顺序逐步计算公式的各部分。
特意在百度文库中分享了出来,供分析或熟悉用。
链接:https://pan.baidu.com/s/13X0uqxdLLDtIqKaLQYu1xg
提取码:wuhn
-End-