|
发表于 2014-6-22 12:05:37
|
显示全部楼层
在讨论下一个函数之前,不如先探讨一下GPS(导航仪)的使用 (评点:有种不祥的预感)。
当我们在GPS中,设定目的地 的时候,通常有两种方法,一种是使用POI(兴趣点),比如我要去Westfield买块豆腐,让GPS直接搜索关键字Westfield,就能把附近的几个westfield直接搜出来。我并不在乎westfield的具体地址,只要那里有豆腐给我吃 就行。vlookup正是这样,我只关心能否搜到那个数值,并不在意这个数值处于葵花宝典的哪个位置。
另一种设定目的地 的方式,是输入地址,门牌号码。
第一种方式,是基于内容搜索。而我们将要展示的是,后一种,location based,基于位置搜索的函数:Index – Match。 (评点:终于绕回来了!还敢更绕一点吗?)
Index-Match是两个函数,乃一套组合拳,一刚一柔,一外一内,一阳一阴,一。。。(打住!)。好吧,为了能够对他们个个击破,偶不得不充当一次小三,把刚柔并济,内外兼修,阴阳失调的Index-Match夫妇,暂时拆散。。。
先说一下秀外慧中的Match的函数:MATCH(lookup_value, lookup_array, [match_type])
Match函数是干哈的呢?很简单,她只给我们一个数字,这个数字代表着一个位置,这个位置是表格内,距离起始行(列)的相对位置。比如,下面这三个苍劲有力的笔体,“神”这个字处于“偶的神”字段的第几位,答案在此就不公布了,有兴趣的同学,可以作为回家作业。
Match函数是 先找到“神”,再把“神”和列中第一个“偶”字作比较,得出“神”的相对列数。她乍一看长的酷似vlookup,但是要简单得多,大家都已经历过Vlookup,均已达到“除却巫山”的至高境界,不过如果没有摸透match的脾气,也会死的很惨。看看Match的函数有什么特性:
Match得出的数值,是lookup value所在相对的位置,不是value本身。Lookup value不分大小写,即便精确匹配,也是大小写 色盲。数列的起始位置 至关重要,起始位置都处于最左边或者最上面的位置。比如上面的那个例子,“神”在C1的位置,如果数列起始位置是A1,和起始位置在B1,得出的结果就不一样。数列本身是一个一维数组,说白了,要么一行,要么一列,如果要定位多行 多列的二维数组,就不得不用两次Match函数,后面会提到。[match type],看到这种带括号的,就知道不是善茬。虽然是可选项,给人一种可有可无的错觉。然而一旦选错了,必将后悔终生。Match类型只接受三种类型:1,0和-1。
a.首先说0,这和vlookup一样,是精确匹配。从上到下,从左到右,只有一摸一样的,才能入选,如果找不到,就返回#N/A。
b.其次说1这个类型。1或者不填,是一样的。查找原理是,在数组中,找到小于或等于lookup value的最大值。需要升序排列。
c.最后是-1这个类型,和1刚好相反。数组中,如果有数值大于或者等于lookupvalue,就停下。要降序排列。
老实说,我就只用过0 —精确查找。其他两种,太搞,当然有志于成为Excel的大师,一定要有“我不入地狱,谁入地狱”,视死如归的革命决心。别跟我似的,只会偷懒。
Match函数是个比较简单的函数,返回的数值代表处于某个数组的一个相对位置。
现在来说说她老公Index函数:INDEX(array, row_num, [column_num])
Index就是之前所谓的,基于位置来定位的函数。我们知道Excel表格,有纵列和横行组成。说白了,就如一个坐标的第四象限,有纵坐标(行数)和横坐标(列数)组成。微软向来喜欢搞自己一套标准,象限中定位一个点,传统上,喜欢把横坐标x,放在纵坐标y之前,然而Excel中,都是先指定纵坐标的行数(row num),在写横坐标的列数(Column num)。
先举个简单的例子:
我要找到“女2”和“女B”交集的单元格内容是啥,公式是 =INDEX(C4: D5,2,2) 。
表格的范围是C4: D5; 处于B5位置的“女2”,相对于C4: D5所在的范围,是第二行。而处于D3位置的“女B”,相对于C4: D5,是第二列。
之所以有意这么写,是为了突出,公式中的行号和列号,是个相对值,相对于选取的表格范围来说,并非Excel工作簿的绝对位置。既然行号和列号是跟着表格走的,表格的选取就变得至关重要。
如何选取表格数组?
最关键的是设定好表格的起始位置,就是表格左上角的第一个单元格。因为之后的相对位置,都取决于第一个格子所在的位置。所以选的时候要特别小心。选取的方法,又因定位方式的不同,分2大类:
通过行+列的方式来定位。就比如上面的例子,表格数组的起始位置在C4,而要查找位置是D5,D5相较于C4,既不在同一行,也不在同一列。公式中,行号和列号均不能忽略。通过单行/单列的方式定位。换言之,起始的单元格 和 要寻找的单元格 处于同一行或者同一列。依旧用上面的例子,公式还可以写成=INDEX(C5: D5,,2),一样可以返回出“Les”这个字段。设定的起始位置在C5,要找的是D5,处于同一行,这样写公式的时候,行号就可以忽略,连打两个逗号,最后填上列号2。
这两种方法殊途同归,唯一的区别在于 起始单元格和目标单元格的相对位置。在实际操作中,可以根据表格的结构,因地制宜,灵活决定使用哪种定位方式。稍后,会给出实际例子来说明。。。。。什么??已经被Match小姐complain了,夫妻分开太久,已经相思成灾了?好吧,偶不想成为罪人,是时候让他们再次见面,我们也可以瞻仰一下Match-Index是如何练就玉女心经,刚柔相济,干柴烈火的。。。
再次请出Match-Index贤伉俪:
MATCH(lookup_value, lookup_array, [match_type])
INDEX(array, row_num, [column_num])
Match函数能给出,相对位置。而Index能基于相对位置,找到内容。把Match 和 Index函数结合起来,就可以自动找到我们要的东东了。所以把Index公式中,row_number用一个match函数取代,column number用另一个match函数取代。最后Match和Index的全家福就是:
INDEX(array, MATCH(lookup_value, lookup_array, [match_type]), MATCH(lookup_value, lookup_array, [match_type]))
看着晕菜了吧,晕着,晕着就习惯了。。。
来,给个例子,就明白了
数列中,纵坐标是月份,横坐标是电脑配件,中间的是销售额。A3单元格是四月份,A4中是DVD光驱。我要找出四月份DVD光驱卖了多少台。乍一看可以用vlookup解决,但是A2和A3的内容是个变值,可以随时改变成June-Flash Drives之类的,vlookup的 column Index这一项就是个变量,必须要嵌套一个match函数,也能解决。但不如Match-Index来的直观。
首先观察表格结构,发现查找的内容和起始单元格,大部分都不可能是同一列或者同一行,先老老实实选取整个表格F3:I14作为Index的array。(莫非还有不老实的??一个字回答:恩!)。我们一步一步来。
众所周知,match只能找一维数组的中单元格的位置。所以先来index中的纵坐标所在的列—月份,row number= MATCH(A3,E3:E14,0);横坐标的电脑产品column number =MATCH(A4,F2:J2,0)。所以最后Index函数,就是这样的:
然而, 但是,不过,有时候,遇到大型表格,行数和列数恶多,电脑屏幕有限,当前的屏幕装不下全部的表格,这给选取整个表格添加了难度。此时就是灵活选择起始单元格的时候了。。。当一个表格满屏显示不全的时候,最好的选取方式,就是选择整列或整行。
Match函数的选取的array是整列和整行。April四月份处于E列的第六位,Dvd drives处于2行的第8位,这个时候相对位置,已经变成了Excel工作簿的绝对位置了。此时的起始单元格在哪里?没错,起始的单元格,就是A1。
那么Index的公式要改成这样了:=INDEX(1:1048576,MATCH(A3,E:E,0),MATCH(A4,2:2,0))
这里有2个问题要注意
“1:1048576”怎么来的?是直接点击左上角的灰色箭头得到的。1048576 是2的20次方,是Excel 2007和2010的行数的极限。1:1048576,意味着全选整张work sheet。(我擦,第一次这么佩服自己,如此有学识,连这么变态的东西都知道。。。。 画外音:还不是刚google来的)第二点就相当关键,Match-Index练习玉女心经的练门就在于此:起始单元格。两个函数的起始单元格必须一致,否则就会走火入魔(注意:从来没有加粗字体过,初次就这么献出去了)。这和跳交谊舞是一样的,起步很重要,双方要同时跨出第一步,一旦起步的时间有先后,之后每一步就错位了。
下面的例子将展示Match-Index 较之Vlookup优越的一面:向左查询,敬请期待。。。。
[ 本帖最后由 jasonliu234 于 2011-4-3 21:11 编辑 ] |
|