ARTICLE · 1209431
财务人必学的 Excel 技巧:INDEX+MATCH 函数
我刚入行那会儿,做工资核算。
几百号员工,编号、姓名、部门、职级、工资档,一张大表从 A 排到 Z。月底核对工资时,要按员工编号把基本工资、绩效、扣款一项项匹配回来,用的全是 VLOOKUP。
当时觉得这函数天下无敌,写得飞快,一个月结从没失过手。
直到有一回,老板说要在部门表和工资表之间加一列"入职年限"。
就插了一列。
我打开工资核算表一看,全错了。VLOOKUP 里的列号是写死的,原来指向第四列的是工资,插了一列之后,第四列变成了"职级",工资跑到了第五列。几百个格子,一个一个改列号?改完又怕是漏了。那一晚我加班到十一点半,改完心还是虚的,生怕发工资那天出纰漏。
后来一个前辈看我狼狈,说了一句:你干嘛不用 INDEX+MATCH?它认的是"这列叫什么",不是"这列在第几个"。
我试了一下,从此就再没用过 VLOOKUP 做复杂匹配。
今天就把这个组合拆开讲给你,不讲玄学,只讲用在哪、怎么用、为什么它比 VLOOKUP 稳。
先拆开看,两个函数都不难
INDEX 是个"按坐标取值"的函数。
语法:INDEX(范围, 行号, [列号])
比如 =INDEX(B2:B13, 3),B2 到 B13 是一列范围,行号 3,就从 B2 往下数第 3 个,返回 B4 的值。你可以把它理解成:在格子里数格子,数到第几行就返回那个值。
MATCH 是个"找位置"的函数。
语法:MATCH(要找的值, 查找范围, 匹配方式)
比如 =MATCH("张三", A2:A13, 0),在 A2 到 A13 里找"张三",匹配方式用 0 表示精确匹配,返回它在范围里是第几个。"张三"如果在 A5,就返回 4(从 A2 起数第 4 个)。
两个搭起来:INDEX 负责"取东西",MATCH 负责"告诉你东西在第几行"。
写成通用公式:=INDEX(返回范围, MATCH(查找值, 查找范围, 0))
读一遍就懂:MATCH 找到查找值在查找范围里的第几行,INDEX 就按这个行号去返回范围取那个值。
跟 VLOOKUP 比,它到底好在哪
四个差别,决定了什么时候该换武器。
第一个,能往左找。
VLOOKUP 要求返回列必须在查找列的右边。你要根据员工编号查姓名,没问题;可要是反过来,根据姓名查编号,就歇菜了。INDEX+MATCH 没这限制,查找列和返回列可以随便摆,左到右、右到左都行。
第二个,插列不会错。
VLOOKUP 第三个参数是列号,写几就是第几列。你在中间插一列,原来第 4 列变成第 5 列,公式还指第 4 列,数据就全跑偏了。我开头那个加班故事就是这么来的。
INDEX+MATCH 不认列号,它认的是整列本身。MATCH 去找"姓名"这一列,INDEX 去取"工资"这一列,中间插几列都不影响,因为 MATCH 是按列找值、返回行号,行号不会因为插入列而变。
第三个,两列可以不相邻。
VLOOKUP 要求返回列在查找列右边,且中间夹多少列都无所谓,但你得自己数夹了几列,列号写错就全错。INDEX+MATCH 完全不管相不相邻,查找范围和返回范围各自独立,想指哪指哪。
第四个,组合玩法多。
双向查找、多条件查找这些进阶用法,VLOOKUP 单独搞不定,得套别的函数或数组公式。INDEX+MATCH 天然能扩展,往下讲。
五个实操技巧,财务人照着用
技巧一:范围加绝对引用。
公式要向下拖的时候,查找范围和返回范围都得用美元符号锁死。写成 =INDEX($B2:B100,MATCH(G2, $A2:A$100, 0)),行号部分别锁,这样拖动公式时范围不动、查找值跟着走。
整列引用(A:A)也能避免拖动错位,但整列参与计算会拖累性能,数据量上万行时明显变慢,推荐用具体范围加绝对引用。
技巧二:MATCH 第三参数固定写 0。
0 是精确匹配。MATCH 默认值是 1,会按"近似匹配"处理,前提是查找范围已升序排列。财务数据基本不会专门去排序,不写 0 就可能返回错行。我见过一位同事 MATCH 里没写 0,结果员工编号排得有点乱,匹配出来的部门全错位,查了两天才发现。
技巧三:多条件查找,用 & 拼条件。
要同时满足两个条件,比如"姓名是张三,部门是销售部,取工资",单一个 MATCH 做不到。用数组公式这么写:
=INDEX(E2:E100, MATCH(1, (A2:A100=G2)*(B2:B100=H2), 0))
读法:姓名等于 G2 且部门等于 H2 的那一行,返回 E 列(工资)对应的值。
老版本 Excel(2019 之前)输入完要按 Ctrl+Shift+Enter,外面会自动加一对大括号;新版直接回车就行。
三个条件以上就继续乘,(A=)(B=)(C=),原理一样。
技巧四:双向查找,用两个 MATCH。
产品销售额矩阵,行是产品名,列是月份。要知道"A 产品 6 月的销售额",一个 MATCH 找行(产品名在第几行),另一个 MATCH 找列(6 月在第几列),两个一起喂给 INDEX:
=INDEX(销售额区域, MATCH(产品名, 产品列, 0), MATCH(月份, 月份行, 0))
两个 MATCH 各管一个维度,INDEX 按这个坐标取值。这种双向查找,VLOOKUP 得套 MATCH 才能做到,INDEX+MATCH 直接写更顺。
技巧五:大数据量时,INDEX+MATCH 更轻。
VLOOKUP 每行都要从查找列开始扫,扫到返回列为止。INDEX+MATCH 用 MATCH 一次性定位行号,INDEX 直接按行号取值,不用逐行扫。几千行以内差别不大,过了万行就能感到明显差距。
几个容易栽的坑
查找列不能有重复值。MATCH 找到第一个就停,如果你按员工编号查没问题,按姓名查就可能踩坑——两个张三,它只返回第一个。遇到这种情况,要么改成按"姓名+部门"多条件查找,要么在数据里加唯一标识。
返回范围要和查找范围行数一致。INDEX(B2:B100, MATCH(..., A2:A50, ...)),查找范围 50 行、返回范围 100 行,MATCH 返回 50 的时候 INDEX 还在范围内没事,但逻辑上是错的。养成习惯,两个范围起点、长度对齐写。
INDEX 和 MATCH 的范围别跨错表。MATCH 查员工表的 A 列,INDEX 取工资表的 E 列,两个范围指向的不是同一张表、行数不一样,返回结果就错。财务人最容易在多表联动时栽这个跟头。
那 VLOOKUP 是不是可以扔了
不是。
简单的正向查找,比如根据员工编号查姓名,查找列在左、返回列在右、不会随便插列,VLOOKUP 写法短、老版本兼容好,用着挺顺。
但一旦场景复杂了——要反向查、要多条件、要插列、要大数据量——就该换 INDEX+MATCH。
不是哪个函数更好的问题,是哪个函数扛得住你的场景。
我现在还常跟徒弟讲那一晚的事。
十一点半,财务室就剩我一个人,VLOOKUP 的列号一个一个改,改完还不敢信自己。那种感觉干过的人都懂:怕第二天工资发错,怕接到人事部电话,怕最后查出来是自己公式没写对。
后来我学乖了,复杂查找一律 INDEX+MATCH。倒不是它有多高级,是它不坑人。你不去动它,它不会因为你中间插了一列,就偷偷把工资给你换成职级。
会 VLOOKUP 的财务人满大街都是,肯多走一步把这对组合练熟的,不到三成。别做那七成。
配套练习案例已经备好,四道题:反向查找、插列稳定性、数组多条件、双向查找,练一遍,这组合就真长在你手上了。















































































