VLOOKUP 又返回 #N/A 了,查找值明明在表里。这种时候把公式拆开看,问题往往出在里面那个 MATCH:它找位置的方式和你以为的不一样。

三个参数,第三个最关键

MATCH 的写法是 MATCH(查找值, 查找区域, 匹配类型)。第三个参数决定行为:填 0 是精确匹配,填 1 是找小于等于查找值的最大值、要求区域升序,填 -1 是找大于等于查找值的最小值、要求降序。省略不写默认是 1,这就是大部分人踩坑的根源。

返回的是位置,不是值

MATCH 返回查找值在区域里排第几个,从 1 开始。区域是 B2 到 B100,返回 5 就表示 B6。它自己不返回值,所以常和 INDEX 搭配使用,比 VLOOKUP 灵活的地方在于可以往左查。

=INDEX(C:C, MATCH(F2, B:B, 0))

报 #N/A 的六个常见原因

  • 文本和数字混着:单元格里是文本型的 1001,查找值是数字 1001,精确匹配一定找不到。
  • 藏了空格:从系统导出的数据常带前后空格,用 TRIM 清洗,或者查找时也套一层 TRIM。
  • 看不见的字符:换行符、不换行空格,CLEAN 加 TRIM 一起上。
  • 合并单元格:合并后只有左上角有值,其他位置是空的。
  • 区域没锁:下拉填充时区域跟着偏移,越界就报错,记得按 F4 加绝对引用。
  • 第三参数写成了 1:区域没排序,近似匹配给出的位置完全不可预期。

通配符和区间分级

精确匹配模式下,星号和问号会被当通配符。想查找本身就是星号的内容,前面加波浪号转义。做区间分级,比如按分数段评等级,就用第三参数 1 加升序的阈值表,这是 MATCH 最实用的场景之一,比嵌套 IF 干净得多。

和 XLOOKUP 的关系

新版 Excel 有 XLOOKUP,一个函数搞定查找和返回,还能指定找不到时显示什么。但老版本和部分 WPS 版本没有,MATCH 加 INDEX 的组合依然是兼容性最好的写法。数据量大时在整列上跑 MATCH 会明显变慢,把区域限定到实际数据范围能提速。

数组写法要小心

把 MATCH 放进数组公式做双向查找时,行列两个 MATCH 返回的序号要分别对应 INDEX 的行和列,顺序反了就取到隔壁单元格的值,还不会报错。这种错误最难发现,因为结果看上去是个正常数据。写完随手用几个不同条件验证一遍。

取舍:日常查找一律把第三参数写成 0,写死精确匹配;只有做区间分级时才用 1,并且确认表已按升序排好。