夜雨聆风学习资料网

ARTICLE · 1314717

Excel 最被低估的函数:INDEX

Excel 最被低估的函数:INDEX

上周有个客户发来一张表,三行线、四个月,问我三号线三月做了多少。

我给了他一个数——1,340。他愣了两秒,说:我算了半天,你怎么一眼就出来了。

我说我没算。我知道它第几行第几列。

一、大部分人只会沿一条轴找

VLOOKUP、XLOOKUP、XMATCH,前面文章讲过一圈,它们有个共同点:全是一维的。你给它一个值,它在一列或者一行里找。

一维查找能回答「三号线全年多少」,因为你只要在「线别」那一列里找到三号线,然后把整行加起来。SUMIF 干这个很利索。

但你问「三号线三月多少」,它答不了。这不是它能力不行,是问题变了形状——它从「找一个」变成了「找两个」,行一个、列一个。

一张交叉表本来就有两根轴。你的查找只有一根,剩下的那一根,你只能靠眼睛补。

还有个更扎心的事实:那张表全年加总 12,580,可客户一次都没问过这个数。他问的永远是「某条线某个月」。总数是最没人要的答案,因为你早就知道了。

二、INDEX 不是查找函数,是坐标函数

先看语法,短得让人不习惯:

=INDEX(区域, 行号, 列号)

它不问你「找什么」,它问你「第几行第几列」。这个差别是根本性的。

查找函数的输入是「内容」,INDEX 的输入是「位置」。

内容这东西脏得很:可能重复、可能多一个空格、可能是全角逗号、可能是「三号線」的繁体。位置是干净的整数。你只要能算出位置,就绕开了全部这些破事。

所以在真正会用的人手里,INDEX 不是拿来单独用的,它是下游——上游负责把「内容」翻译成「位置」,INDEX 负责拿位置换东西。上游那个翻译官,就是 MATCH。

三、双向查找:两个 MATCH,各管一根轴

想在三月和三号线身上取到那个数,就这么写:

=INDEX($B$2:$E$4, MATCH("三号线",$A$2:$A$4,0), MATCH("3月",$B$1:$E$1,0))

第一个 MATCH 在左列里找线名,返回 1;第二个 MATCH 在首行里找月份,返回 3。INDEX 拿到 (1, 3),把那个格子交给你。

这个活 XLOOKUP 干不了。不是它弱,是它设计上只沿一条轴走——一次一个条件,多一个条件就得嵌套。你可以套两层 XLOOKUP 硬做出来,但那个公式长到下周你自己都未必读得懂。

而 INDEX 这条,换查询只改两个字符串,结构一个字不动。你可以把它拖成一个查询面板:上面两个下拉选线、选月,下面一格出数,客户自己点着玩。

这就是代做和写公式的区别。写公式是把这一次算对,做面板是把下一次也交了。

四、行号或列号填 0:把一整行当参数交出去

这一招九成人不知道,但它是 INDEX 最值钱的地方。

=SUM(INDEX($B$2:$E$4,1,0)) → 三号线整行求和

=MAX(INDEX($B$2:$E$4,0,3)) → 3月整列最大值

那个 0 的意思是「这一维我全都要」。取出来的不是单个值,是一整行数组,可以直接喂给 SUM、AVERAGE、MAX、SORT。

拿那张表试:三号线整行加起来 4,600,平均 1,150;三月整列 3,540,最高 1,340——最后这个数跟双向查找取到的是同一个,只是路径不同。

为什么好用?因为行号可以是变量。

你在一个格子里写上「三号线」,INDEX 就把那一整行递出去,下游所有计算自动跟着换线。客户想看二号线的,改一个格子,整块结果全变。你不用给他写十二个公式,你给他一个开关。

这跟我前面写 OFFSET 那篇是一个思路:别把位置写死。但方法反过来——OFFSET 是让位置自己动,INDEX 是把位置算出来。后者更干净,因为它不是易失函数,不会因为你改了一个无关的格子就全表重算。

五、行号也能自己算:永远取最后一个

台账每月往下加一行,你要取最新那格,最土的办法是每次手动改区域。改到第八个月,你自己都记不清该写 B2 还是 B9。

=INDEX(B2:B100, COUNTA(B2:B100))

COUNTA 数出这一列有几个非空,那就是最后一行的相对位置,INDEX 拿它去取。数据加十行、加一百行,公式一个字不用改。

这个活 OFFSET 也能干,但 OFFSET 是易失函数,任何一次改动都会触发全表重算,几万行的时候你会听见风扇转起来。INDEX 这条是静态的,几十万行照样轻。

同一个目标,一个用会动的位置,一个用算出来的位置。选后者。

六、五个坑,第四个最阴

1. 行号列号必须是整数。你写 1.5,Excel 不报错,它静默截成 1。你以为取的是中间那一档,其实取的是第一行。这种错最难查,因为数字看着正常。

2. MATCH 第三个参数不写 0,默认是近似匹配。它会找「小于等于目标值的最后一个」,前提是数据升序排好。表没排序,它照样给你一个数——错的,但不报错。

3. INDEX(区域,0,0) 返回整块区域。 365 下它会溢出到一片格子,看着像出了乱码;老版本直接 #VALUE!。想取整块,用不着 INDEX。

4. 单行或单列区域,只填一个参数——但那参数算「行」还是算「列」,取决于区域是横是竖。横着的表你按列的逻辑填,它取到隔壁那一格,不报错。这条我栽过,客户一句「数不对」我才回头一个一个核。

5. 越界 #REF!。这个反而是最老实的坑,它至少会响一声。

七、说到底,表是二维的

INDEX 这名字起得不好。听着像「索引」「目录」,容易让人以为是辅助功能。它其实是坐标系。

一张表横竖两根轴,任何一个格子都是两根轴的交点。你只要知道交点在哪,就拿到了那个数——而且知道交点在哪这件事,本身比拿到那个数更有用。因为拿到数只能回答一次,知道交点可以回答一万次。

大部分人做表做了十年,还是只会沿一条轴找。所以他们的表只能回答「某个东西总共多少」,回答不了「某个东西在某个月是多少」。

而后者,才是老板真正会问的问题。

你给的是坐标,Excel 才给得出值。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料