Excel的信息查找功能非常直观,而这里所说的“信息查找”是指对数据表之间数据关联的查询与引用。一般而言,为了保证数据的规范性和一致性,一个系统里的数据应该满足第三范式。即既要满足第一范式:一张表中只能保存一种数据,不能把多种数据保存在同一张数据库表中;还要满足第二范式:数据表中的每一列数据都和主键直接相关,而非间接相关。
Excel中的数据表综合性较强。因此,通常会出现这两种情况:(1)用Excel在较为宽泛的第三范式的基础上建立各个数据表之间的关系,数据表之间需要通过信息查找和引用函数进行关联。(2)在其他数据库系统里建立了严谨的数据关系,并且有各种数据信息的管理应用,出于更进一步的应用需求,需要在Excel中导出数据,再利用Power Pivot建立数据关系以进行进一步的分析。对于第一种情况,就需要对数据信息进行各种关联,此时就会用到信息查找与引用类函数。
1.LOOKUP( )函数
用途:用于根据某个关键字从单行或单列区域或者从一个数组中查询数据,然后返回所查找的特定值。LOOKUP( )函数所查询的区域或数组,必须按升序排列数据。
用法:LOOKUP(lookup_value, lookup_vector, [result_vector])
说明:
图15-21 LOOKUP( )函数示例
“lookup_value”可以是数字、文本、逻辑值、名称或对值的引用,文本不分大小写。
“lookup_vector”为被查找区域(数组),必须是单行或单列区域,且按升序排列。
“result_vector”为返回值区域,也必须是单行或单列区域,且大小与“lookup_vector”相同。
如果找不到“lookup_value”,则函数将与“lookup_vector”中小于“lookup_value”的最大值进行匹配。
如果“lookup_value”小于“lookup_vector”中的最小值,则LOOKUP( )函数会返回错误值“#N/A”。
在数组中的查找与上例类似,如:
=LOOKUP("C", {"a", "b", "c", "d";1, 2, 3, 4}) // 返回3
=LOOKUP("bump", {"a", 1;"b", 2;"c", 3}) // 返回2
2.VLOOKUP( )函数
用途:用于通过对关键字的查询检索,将某一区域中的数据返回到特定单元格,以实现数据动态关联,保证数据的规范性。这里的“V”是Vertical(纵向)之意,即被检索的数据是纵向(按列)存放的。
用法:VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
说明:
图15-22 VLOOKUP( )函数示例
参数“lookup_value”为在表格或区域的第一列中需要被查找的值,被查找的值可以是文本、数字或逻辑值,文本不区分大小写。
参数“table_array”为包含数据的单元格区域(也可直接使用已命名区域的名称)。
参数“col_index_num”指从数据区域中返回数据的列号。这个列号是指数据区域中的列数,与数据的列标无关。例如,图15-22中参数“col_index_num”为2,表示返回H$3:I$7区域中的第二列数据,即H$3:I$7区域中“提成率”列的数据。
参数“col_index_num”必须大于等于1。因此,VLOOKUP( )函数只能返回右侧信息。
参数“range_lookup”为可选参数,是逻辑值,用于指定VLOOKUP( )函数是按照精确匹配值还是近似匹配值进行查找。
如果“range_lookup”为“TRUE”或被省略,则必须按升序排列“table_array”第一列中的值;否则,VLOOKUP( )函数可能无法返回正确的值。此时,函数返回精确匹配值或近似匹配值,如果找不到精确匹配值,则返回小于“lookup_value”的最大值。
如果“range_lookup”为“FALSE”,则不需要对“table_array”第一列中的值进行排序。此时,VLOOKUP( )函数将只会查找精确匹配值。如果“table_array”的第一列中有两个或更多的值与“lookup_value”匹配,则使用第一个被找到的值。如果找不到精确匹配值,则返回错误值“#N/A”。
VLOOKUP( )函数的应用广泛,有关VLOOKUP( )函数的应用详情,请阅读15.3.4小节。
3.HLOOKUP( )函数
用途:用于通过对关键字的查询检索,将某一区域中的数据返回到特定单元格,从而实现数据动态关联,保证数据的规范性。这里的“H”是Horizontal(横向)之意,代表“行”。
用法:HLOOKUP(lookup_value, table_array, row_index_num, [range_lookup])
说明:
Excel存放数据具有灵活性。有时数据表可能横向(按行)存放。因此,需要可以进行横向检索的函数。
HLOOKUP( )函数的参数与VLOOKUP( )函数的参数总体类似,不同之处在于第三个参数。VLOOKUP( )函数中的“col_index_num”为区域中的列号,而HLOOKUP( )函数中的“row_index_num”为区域中的行号。例如,图15-23中的参数“col_index_num”为2,表示返回区域$I$2:$L$3中的第二行数据,即区域$I$2:$L$3中“折扣率”行的数据。
图15-23 HLOOKUP( )函数示例
4.INDEX( )、MATCH( )函数
(1)INDEX( )函数
用途:用于返回表格或区域中指定行、列位置的值。
INDEX( )函数和MATCH( )函数结合使用,可以匹配并返回表格或区域中的值或值的引用。一般而言,这两种函数的结合使用可以实现VLOOKUP( )函数的所有功能,并且具有更好的灵活性。利用INDEX( )函数提取数据的示例如图15-24所示。
用法:INDEX(array, row_num, [column_num])
说明:
图15-24 INDEX( )函数示例
第一个参数“array”既可以是表格区域,也可以是某一数组。
图15-25 MATCH( )函数操作示例
单独使用INDEX( )函数时,必须知道所需数据在区域(或数组)中的行、列位置,这也导致其操作的灵活性很差。因此,INDEX( )函数多与MATCH( )函数结合起来使用。
(2)MATCH( )函数
用途:用于在表格或区域中匹配值,并返回匹配值在表格或区域中的位置。
用法:MATCH(lookup_value, lookup_array, [match_type])
说明:
图15-26 INDEX( )函数与MATCH( )函数的近似匹配
参数“lookup_value”和“lookup_array”分别表示匹配值和查找匹配值的区域。
参数“match_type”有三个选项(指数字1、0或-1):
● 1(缺省值),近似匹配,查找小于或等于查找值的最大值;同时,“lookup_array”要按升序排列。
● 0,精确匹配,“lookup_array”无须排序;
● -1,近似匹配,查找大于或等于查找值的最小值;同时,“lookup_array”要按降序排列。
MATCH( )函数返回匹配值的位置,而不是值本身。如果需要获取值本身,则需要和其他函数一起使用,如INDEX( )函数、VLOOKUP( )函数。
匹配文本值时,MATCH( )函数不区分大小写字母。
5.CHOOSE( )函数
用途:用于根据第一个参数“索引号”从最多254个数值中选择一个。
用法:CHOOSE(index_num, value1, [value2], ...)(www.xing528.com)
说明:
“index_num”必须是介于1到254之间的数字,或是包含1到254之间的数字的公式或单元格引用。如果“index_num”为小数,则在使用前将被截去小数取整。
图15-27 CHOOSE( )函数示例
在参数“value1”“value2”……中,“value1”是必需的,后续值是可选的。在1到254个数值参数中,CHOOSE( )函数将根据“index_num”从中选择一个数值或一项要执行的操作。参数可以是数字、单元格引用、定义的名称、公式、函数或文本。图15-27中的C3单元格代码如下,并向下填充。
=CHOOSE(B3,"极差","差","及格","良好","优秀")
CHOOSE( )函数的功能看似普通,但其与其他函数合用时将会产生出色的使用效果:
● 与IF( )函数合用,简化多条件选择性返回值的表达。
如图15-28,利用排名作为索引号,给出选择性的返回值。E3单元格的代码如下,向下填充。
=IF(D3<=3,CHOOSE(D3,"一等奖","二等奖","三等奖"),"")
此例当然可以使用IF( )函数嵌套来实现,但使用IF( )函数嵌套时,公式较长、括号较多,书写起来也容易出错,不如IF( )函数配合CHOOSE( )函数的使用效果简洁。
可以看到,利用CHOOSE( )函数,必须首先获得一个从1开始的索引值。
● 与MATCH( )函数配合使用。
如图15-29,先用MATCH( )函数定位当前值在等级分值中所处的位置,然后用CHOOSE( )函数返回对应的等级名称。D3单元格的代码如下,向下填充。
图15-28 CHOOSE( )函数与IF( )函数合用
=CHOOSE(MATCH(C3,$F$3:$F$7),$G$3,$G$4,$G$5,$G$6,$G$7)
图15-29 CHOOSE( )函数与MATCH( )函数合用
此例当然也可以利用IF( )函数嵌套或者IFS( )函数来实现,但公式都比较长,用IF( )函数时括号还较多。
另外,可以看到CHOOSE( )函数参数中的“value1”“value2”……必须是实际值的枚举,不能将其合并起来并用一个区域表示。
● 与SUM( )函数配合使用,计算多列数值的求和。
如图15-30,可以看到,CHOOSE( )函数可以使用数组型索引。此时,函数会根据数组值分别获取相应的值。计算过程为:利用CHOOSE( )函数获得区域1(即C4:C9),再获得区域2(即E4:E9),然后对区域1和区域2求和。
● 与VLOOKUP( )函数配合使用,解决VLOOKUP( )函数不能返回左侧值的问题。图15-31中J4单元格的公式代码为:
图15-30 CHOOSE( )函数与SUM( )函数合用
=VLOOKUP(I4,CHOOSE({1,2},$C$4:$C$9,$B$4:$B$9),2,0)
由于VLOOKUP( )函数只能返回右侧信息(“col_index_num”必须大于等于1),所以当出现如图15-31所示的特殊情况,即基于某些业务细节反查基础信息时,可以使用CHOOSE( )函数将数组的次序颠倒过来。
图15-31中示例的计算过程为:用CHOOSE( )函数分别将C4:C9、B4:B9两区域取出,并在后台组成一个新数组。由于操作顺序为先取C区域、后取B区域,所以这时已经将数组的列序顺了过来。然后,VLOOKUP( )函数将根据I4单元格的值,在新数组中进行检索,返回第二列的值。
图15-31 CHOOSE( )函数与VLOOKUP( )函数合用
6.OFFSET( )函数
用途:用于以指定的引用(如单元格或相连单元格区域的引用)为参照系,通过给定偏移量得到新的引用。
用法:OFFSET(reference, rows, cols, [height], [width])
说明:
图15-32 OFFSET( )函数示例
OFFSET( )函数对各种“动态区域”问题都有用,这些动态包括计算的起点和范围。
7.ROW( )、COLUMN( )函数
用途:用于返回当前单元格或指定单元格的行标或列标。
用法:ROW([reference]); COLUNM([reference])
说明:
图15-33 ROW( )、COLUMN( )函数示例
当参数为一个区域时,将返回起始单元格的行标和列标。
相关的函数还有ROWS( )函数和COLUMNS( )函数,将返回一个区域的行数和列数。
8.ADDRESS( )函数
图15-34 ADDRESS( )函数示例
用途:用于根据行标和列标,返回单元格地址,且能够指定地址格式是绝对引用、相对引用或者混合引用。
用法:ADDRESS(row_num, column_num, [abs_num], [a1], [sheet_text])
说明:
参数“abs_num”即格式参数,参数为1时返回绝对地址,参数为2或者3时返回混合地址,参数为4时返回相对地址。因此,图15-34示例中E3单元格的公式代码如下,向下填充到E8:
=ADDRESS(B3,C3,D3)
ADDRESS( )函数从设计上提供了动态地址工具。但是,由于Excel单元格的引用功能十分方便,所以这一地址工具的作用被大大降低了。
9.INDIRECT( )函数
用途:用于返回由文本字符串指定的单元格引用。即参数给定的文本字符串表示地址,而INDIRECT( )函数返回这一地址单元格的值。
用法:INDIRECT(Ref_Text, [A1])
说明:
图15-35 INDIRECT( )函数示例
可以看到,对单元格最直接的引用方式就是单元格地址。
I5单元格的引用代码中的“INDIRECT”为工作表名称。
INDIRECT( )函数仅仅给出一个文本形式的地址的单元格信息,且只能是单元格。因为从严格意义上讲,Excel公式就是对单元格赋值的过程。
INDIRECT( )函数常用于多个工作表数据的合并汇总等工作之中,引用给多个工作表的数据提供了便利。鉴于篇幅关系,在此不再赘述。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。