VLOOKUP 只能往右查,列号写死以后插入列还会失效。INDEX/MATCH 把“取哪一行/列”和“找第几行”拆成两个函数:MATCH 负责定位,INDEX 负责取值,因此可以向左查、按二维表查、按多条件查,而且在旧版 Excel 里也能用。
=MATCH(lookup_value, lookup_array, [match_type])
match_type |
含义 | 要求 |
|---|---|---|
0 |
精确匹配 | 最常用 |
1 |
小于等于查找值的最大值 | 查找区域升序 |
-1 |
大于等于查找值的最小值 | 查找区域降序 |
MATCH 返回的是查找值在区域中的位置序号,不是单元格地址。例如在 B2:B100 里找到第 5 个,返回 5。
=INDEX(array, row_num, [column_num])
row_num 是区域内的行号,从 1 开始;column_num 是区域内的列号,从 1 开始;row_num=0 返回整列,column_num=0 返回整行;#REF!。=INDEX(返回列, MATCH(查找值, 查找列, 0))
假设 A 列编号、B 列姓名,要按编号查姓名:
=INDEX(B:B,MATCH(E2,A:A,0))
要按姓名查编号(向左查):
=INDEX(A:A,MATCH(E2,B:B,0))
VLOOKUP 做不到第二种,因为姓名在编号右边。
假设 A2:A10 是产品,B1:M1 是月份,B2:M10 是数据:
=INDEX(B2:M10,MATCH("A 产品",A2:A10,0),MATCH("2026-01",B1:M1,0))
第一个 MATCH 找产品在第几行,第二个 MATCH 找月份在第几列,INDEX 再按行列取值。两个 MATCH 的查找区域要和 INDEX 区域的行列对应,否则会取到错误位置。
最简单的方法是在数据表里加一列辅助键:
=A2&"|"&B2
然后用同样的方式拼接查找值:
=INDEX(D2:D100,MATCH(E2&"|"&F2,A2:A100&"|"&B2:B100,0))
在 Excel 365/2021 中直接回车即可;旧版 Excel 需要按 Ctrl+Shift+Enter 作为数组公式输入。
=INDEX(D2:D100,MATCH(1,(A2:A100="华东")*(B2:B100="A"),0))
两个条件同时为真时乘积为 1,MATCH 找第一个 1。条件多时公式会变长,可读性不如辅助键;数据量大时数组运算也会变慢。
=SUMPRODUCT((A2:A100="华东")*(B2:B100="A")*D2:D100)
适合返回数值且每个条件只命中一条的情况;如果命中多条,会把它们相加,不一定是你想要的结果。
INDEX 可以配合 MATCH 生成动态范围:
=SUM(INDEX(C:C,MATCH("开始",B:B,0)):INDEX(C:C,MATCH("结束",B:B,0)))
用两个 INDEX 分别定位开始和结束单元格,中间的 : 会形成动态区域。适合报表区间不固定的场景,但公式可读性较差,建议加注释或拆成辅助单元格。
INDEX(array, row_num, column_num),先横后竖;MATCH 返回的是行号或列号,取决于查找区域的方向。MATCH 的第三个参数省略:默认是 1 近似匹配,日常查找必须写 0。1/-1 都要求排序,否则结果不可靠。MATCH 默认从前往后找;要最后一条可以配合 LOOKUP(2,1/(...)) 或改用 XLOOKUP 的 search_mode=-1。INDEX 的区域和 MATCH 的查找区域行数不同,返回位置会错位。INDEX(B:B,MATCH(...)) 写法简单,但整列 MATCH 会扫描大量空单元格;限定实际行数更好。Ctrl+Shift+Enter;365/2021 直接回车。合上页面,先回答,再展开对照。
INDEX/MATCH 为什么能实现 VLOOKUP 做不到的向左查找?MATCH 的第三个参数省略时默认是什么匹配方式?MATCH 只负责定位行号,INDEX 可以从任意列取值,不受查找列左右位置限制。1 近似匹配,要求升序;日常查找必须写 0。
小程序版
微信扫码,随时查命令