Excel index函数与match函数的配合应用,横竖匹配多条件返回值
因为自己是个兼职站长的人,平时在公司有整理一些资料,所以excel也是自己经常用的办公工具,当然经常会碰到一些问题需要新的方法来解决,这个过程学习excel也就必须了,总归会把学到的excel新的知识点分享出来,那么今天就简单介绍下Excel 的index函数。
根据excel固有的帮助,我们可以了解到index函数有两种形式:
1.数组形式,其写法为INDEX(array,row_num,column_num)
参数的解释:
Array 为单元格区域或数组常量。
-
如果数组只包含一行或一列,则相对应的参数 row_num 或 column_num 为可选参数。
-
如果数组有多行和多列,但只使用 row_num 或 column_num,函数 INDEX 返回数组中的整行或整列,且返回值也为数组。
Row_num 数组中某行的行号,函数从该行返回数值。如果省略 row_num,则必须有 column_num。
Column_num 数组中某列的列标,函数从该列返回数值。如果省略 column_num,则必须有 row_num。
2.引用形式,其写法INDEX(reference,row_num,column_num,area_num)
返回指定的行与列交叉处的单元格引用。如果引用由不连续的选定区域组成,可以选择某一选定区域。
可以理解为,你要找一个人,要先找出他所在的楼层(竖向),然后再找出他所在的房间在第几间(横向)
所以可以理解为index(要查找数据的数据区块,第几行,第几列) 第几行,第几列一般用MATCH去匹配
Reference 对一个或多个单元格区域的引用。
-
如果为引用输入一个不连续的区域,必须将其用括号括起来。
-
如果引用中的每个区域只包含一行或一列,则相应的参数 row_num 或 column_num 分别为可选项。例如,对于单行的引用,可以使用函数 INDEX(reference,,column_num)。
Row_num 引用中某行的行号,函数从该行返回一个引用。
Column_num 引用中某列的列标,函数从该列返回一个引用。
Area_num 选择引用中的一个区域,返回该区域中 row_num 和 column_num 的交叉区域。选中或输入的第一个区域序号为 1,第二个为 2,以此类推。如果省略 area_num,则函数 INDEX 使用区域 1。
Reference的写法:(A1:B4,D1:E4,G1:H4),则 area_num 1 为区域 A1:B4,area_num 2 为区域 D1:E4,而 area_num 3 为区域 G1:H4。
两种形式的原理一直,却别在第二种格式在确定位置时多一个最后的参数,取值在哪个区域。当然一般是以,1,2,3确定哪个行数、列数、区域数,条件您知道这个位置,然而很多情况,这个位置是不确定,需要根据条件来判断出正确的位置,这个类似于excel多条件求和、excel多条件统计,而这个是索引或成为返回正确的值。最经常的运用是index函数与match函数的混搭配合法,以达到解决的效果。
示例:
INDEX函数与MATCH函数联用:
MATCH函数是返回在指定方式下与指定数值匹配的数组中元素的相应位置。
公式:MATCH(LOOKUP_VALUE,LOOKUP_ARRAY,MATCH_TYPE)
LOOKUP_VALUE为在数据表中查找的数值
LOOKUP_ARRAY为包括要查找的连续单元格区域
MATCH-TYPE为数字1,0,-1
原理就用match函数来确定满足条件的行数或列数,结合后公式INDEX(array,MATCH(LOOKUP_VALUE,LOOKUP_ARRAY,MATCH_TYPE),MATCH(LOOKUP_VALUE2,LOOKUP_ARRAY2,MATCH_TYPE))
当然还有更为复杂的运用,比如需要返回满足条件的单号:
=INDEX([原料状况.xls]请购_DATA!$L$3:$L$2963,MATCH(IF(V773="集港",SUMPRODUCT(LARGE(([原料状况.xls]请购_DATA!$Y$3:$Y$2963=AL773)*([原料状况.xls]请购_DATA!$Q$3:$Q$2963>=(W773-10))*[原料状况.xls]请购_DATA!$Q$3:$Q$2963,ROW($1:$1))),IF(V773="在途",SUMPRODUCT(LARGE(([原料状况.xls]请购_DATA!$Y$3:$Y$2963=AL773)*([原料状况.xls]请购_DATA!$R$3:$R$2963>=(W773-10))*[原料状况.xls]请购_DATA!$R$3:$R$2963,ROW($1:$1))),IF(V773="已采未产",SUMPRODUCT(LARGE(([原料状况.xls]请购_DATA!$Y$3:$Y$2963=AL773)*([原料状况.xls]请购_DATA!$T$3:$T$2963>=(W773-10))*[原料状况.xls]请购_DATA!$T$3:$T$2963,ROW($1:$1))),"无采购单号")))&AL773,IF(V773="集港",[原料状况.xls]请购_DATA!$Q$3:$Q$2963,IF(V773="在途",[原料状况.xls]请购_DATA!$R$3:$R$2963,IF(V773="已采未产",[原料状况.xls]请购_DATA!$T$3:$T$2963,"error")))&[原料状况.xls]请购_DATA!$Y$3:$Y$2963,0),1)
根据单号和另外一些条件来正确显示时间:
=IF(OR(V772="",ISERROR(Z772)),"",INDEX([原料状况.xls]请购_DATA!$Z:$AB,MATCH(IF(AA772=FALSE,IF(ISNUMBER(Y772)=TRUE,Y772,LEFT(Y772,14)),IF(ISNUMBER(Z772)=TRUE,Z772,LEFT(Z772,14)))&AL772,[原料状况.xls]请购_DATA!$L:$L&[原料状况.xls]请购_DATA!$Y:$Y,0),MATCH(V772,[原料状况.xls]请购_DATA!$Z$2:$AB$2,0)))
这些是自己的一些运用,然而看似复杂的公式其实都是一些类似的衍生,只要了解原理,至于如何配合其他一些函数那就是您的事情了,因为在设定函数的过程,总归会出现一些难以预料的情况,所以还要加上一些判断来纠正显示的结果,让结果更接近正确,需要注意的是,运用index函数必须注意以下的各条说明内容。
相关重要说明
- 如果同时使用参数 row_num 和 column_num,函数 INDEX 返回 row_num 和 column_num 交叉处的单元格中的值。
- 如果将 row_num 或 column_num 设置为 0,函数 INDEX 则分别返回整个列或行的数组数值。若要使用以数组形式返回的值,请将 INDEX 函数以>数组公式 (数组公式:数组公式对一组或多组值执行多重计算,并返回一个或多个结果。数组公式括于大括号 ({ }) 中。按 Ctrl+Shift+Enter 可以输入数组公式。)形式输入,对于行以水平单元格区域的形式输入,对于列以垂直单元格区域的形式输入。若要输入数组公式,请按 Ctrl+Shift+Enter。
-
Row_num 和 column_num 必须指向数组中的一个单元格;否则,函数 INDEX 返回错误值 #REF!。
