=INDEX(C2:C6,MATCH(F2,A2:A6,0)) 找到 F2 在 A2:A6 中所在的行,并返回 C2:C6 同一行的值。MATCH 负责找位置,INDEX 负责取出这个位置上的值。它在所有 Excel 版本中都能用,而且可以向左查找。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Code | Look for | Price | |
| 2 | Apple | Fruit | $1.20 | P-101 | Pear | $1.50 | |
| 3 | Pear | Fruit | $1.50 | P-102 | |||
| 4 | Carrot | Vegetable | $0.80 | P-205 | |||
| 5 | Bread | Bakery | $2.40 | P-310 | |||
| 6 | Milk | Dairy | $1.10 | P-412 |
把 F2 改成 Milk,G2 会返回 $1.10。把 C2:C6 改成 B2:B6,它就会改为返回类别。
INDEX 和 MATCH 如何配合
这个公式是把两步放在一个单元格里。这里把它们拆到不同的单元格中,你可以看到每一部分返回什么。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Code | Look for | Bread | |
| 2 | Apple | Fruit | $1.20 | P-101 | Position | 4 | |
| 3 | Pear | Fruit | $1.50 | P-102 | Price | $2.40 | |
| 4 | Carrot | Vegetable | $0.80 | P-205 | |||
| 5 | Bread | Bakery | $2.40 | P-310 | |||
| 6 | Milk | Dairy | $1.10 | P-412 |
MATCH(G1,A2:A6,0) 返回 4,因为 Bread 是 A2:A6 中的第四项。INDEX(C2:C6,4) 返回 C2:C6 中的第四项 $2.40。把 MATCH 放进 INDEX 里替换 G2,就得到了单个单元格的公式。要让它正常工作,有两条规则:
- 两个区域必须从同一行开始,并且高度相同。
MATCH(...,A2:A6,0)从第 2 行开始计数,所以 INDEX 必须读取C2:C6,而不是C1:C6(那样会返回上一行)。 - MATCH 要以 0 结尾。 不写 0,MATCH 会做近似匹配,假定 A 列已经排好序;在一列名称中,它可能返回错误行的位置。MATCH 一文讲解了它的三种匹配类型。
如果值不在列表中,MATCH 会返回 #N/A,整个公式也会返回 #N/A。=IFNA(INDEX(C2:C6,MATCH(F2,A2:A6,0)),"Not found") 会改为显示文本。
向左查找
VLOOKUP 只能返回查找列右边的列。INDEX 和 MATCH 不在乎列的顺序:可以在 D 列中查找,返回 A 列的值。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Code | Code | Product | |
| 2 | Apple | Fruit | $1.20 | P-101 | P-310 | Bread | |
| 3 | Pear | Fruit | $1.50 | P-102 | |||
| 4 | Carrot | Vegetable | $0.80 | P-205 | |||
| 5 | Bread | Bakery | $2.40 | P-310 | |||
| 6 | Milk | Dairy | $1.10 | P-412 |
P-310 返回 Bread。在 F2 中输入 P-205 会得到 Carrot。如果用 VLOOKUP,你得先把 Code 列挪到表格最前面。
双向查找:INDEX 搭配两个 MATCH
INDEX 接受一个行号和一个列号。给它一整张表,让一个 MATCH 找行,另一个 MATCH 找列。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Region | Jan | Feb | Mar |
| 2 | North | 4,200 | 3,900 | 4,800 |
| 3 | South | 3,100 | 3,600 | 3,300 |
| 4 | East | 5,200 | 4,700 | 5,600 |
| 5 | West | 2,800 | 3,000 | 3,400 |
| 6 | Region | East | ||
| 7 | Month | Mar | ||
| 8 | Sales | 5,600 |
East 是 A2:A5 中的第 3 行,Mar 是 B1:D1 中的第 3 列,所以 INDEX 返回 B2:D5 中第 3 行第 3 列的值:5,600。找行的 MATCH 沿第一列向下查找,找列的 MATCH 沿标题行横向查找,两个区域都与表格 B2:D5 对齐。
INDEX MATCH 为什么比 VLOOKUP 好
=VLOOKUP(F2, A2:D6, 3, FALSE)
=INDEX(C2:C6, MATCH(F2, A2:A6, 0))
两个公式都返回价格。区别在表格发生变化时才显现出来:
- 插入列。 在 Category 和 Price 之间插入一列,VLOOKUP 仍然要第 3 列,而第 3 列现在是新插入的空列。在 INDEX 版本中,Excel 会把
C2:C6自动调整为D2:D6,公式照常工作。 - 向左查找。 上面已经演示过:VLOOKUP 做不到,INDEX MATCH 可以。
在 Excel 2021 和 Microsoft 365 中,XLOOKUP 用一个函数、更简单的参数就能同时做到这两点。如果文件需要在 Excel 2019 或更早版本中打开,INDEX MATCH 仍然是首选,而且 INDEX 本身单独使用也很有用。如果要同时按两个条件查找,见多条件查找。
练习:向左查找
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Code | Price | Stock | Product | Look for | Price | |
| 2 | P-101 | $1.20 | 40 | Apple | Milk | ||
| 3 | P-102 | $1.50 | 25 | Pear | |||
| 4 | P-205 | $0.80 | 60 | Carrot | |||
| 5 | P-310 | $2.40 | 15 | Bread | |||
| 6 | P-412 | $1.10 | 30 | Milk |
轮到你了: 产品名称在最后一列。在 G2 中用 INDEX 和 MATCH 返回 F2 中产品的价格。
练习:双向查找
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Student | Math | Science | Art |
| 2 | Ana | 78 | 85 | 92 |
| 3 | Ben | 64 | 71 | 88 |
| 4 | Cara | 95 | 89 | 73 |
| 5 | Dev | 82 | 67 | 79 |
| 6 | ||||
| 7 | Student | Cara | ||
| 8 | Subject | Science | ||
| 9 | Score |
轮到你了: 在 B9 中返回 B7 中的学生在 B8 中科目上的分数。
常见问题
INDEX MATCH 是怎么工作的?
MATCH 找到某个值在一列中的位置,INDEX 返回另一列中这个位置上的值。在 =INDEX(C2:C6,MATCH("Pear",A2:A6,0)) 中,MATCH 返回 2,因为 Pear 是 A2:A6 中的第二项,然后 INDEX 返回 C2:C6 中的第二项。
为什么用 INDEX MATCH 而不是 VLOOKUP?
它可以返回查找列左边的列,而且在表格中插入列时也不会出错(没有会过时的列号)。在 Excel 2021 和 Microsoft 365 中,XLOOKUP 用一个函数就能带来同样的好处。
MATCH 中的 0 是什么意思?
它表示要求精确匹配。不写它的话,MATCH 会使用 match_type 1,也就是假定该列已按升序排列的近似匹配;在未排序的列表中,它可能返回错误行的位置。
怎样用 INDEX MATCH 做双向查找?
给 INDEX 一整张表和两个 MATCH,一个找行,一个找列:=INDEX(B2:D5,MATCH("South",A2:A5,0),MATCH("Feb",B1:D1,0)) 返回 South 行与 Feb 列交叉处的值。