VLOOKUP 精确匹配、近似匹配、通配符与常见 N/A 原因

适用场景

用订单号查客户、用员工编号查姓名、用产品编码查单价。VLOOKUP 是最常见的查找函数,但它只能从左往右查,而且第四个参数写错时会把“近似匹配”当成“精确匹配”,结果是错的却不报错。

语法

=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
参数 含义 注意
lookup_value 要查找的值 必须在 table_array 的第一列
table_array 查找区域 通常要锁定,如 $A$2:$D$100
col_index_num 返回第几列 从 table_array 第一列开始数,不是工作表列号
range_lookup FALSE/0 精确,TRUE/1 近似 日常查找几乎都用 FALSE

精确匹配

=VLOOKUP(E2,$A$2:$D$100,4,FALSE)

近似匹配

=VLOOKUP(A2,$F$2:$G$6,2,TRUE)

近似匹配要求查找区域的第一列按升序排列,然后返回小于等于查找值的最大值。适合分数等级、税率档位、提成区间。

如果数据没有排序,近似匹配可能返回完全错误的结果,而且不会报错。日常查订单号、编号时不要用 TRUE。

示例

假设 A 列编号、B 列姓名、C 列部门、D 列工资,E 列是要查的编号:

查姓名
=VLOOKUP(E2,$A$2:$D$100,2,FALSE)

查工资
=VLOOKUP(E2,$A$2:$D$100,4,FALSE)

找不到时显示“未找到”
=IFNA(VLOOKUP(E2,$A$2:$D$100,2,FALSE),"未找到")

按编号查并返回多列
=VLOOKUP($E2,$A$2:$D$100,COLUMNS($A$1:B1),FALSE)

COLUMNS($A$1:B1) 向右填充时会变成 2、3、4,适合一次查回姓名、部门、工资,避免手改列号。

通配符

精确匹配模式下,lookup_value 支持 * 和 ?:

=VLOOKUP("*"&E2&"*",$A$2:$B$100,2,FALSE)

匹配包含 E2 的文本。要查星号本身,用 ~* 转义。

动态列号

列号写死以后,在查找区域中间插入一列,4 可能就指向了别的字段。用 MATCH 找列号更稳:

=VLOOKUP($E2,$A$1:$D$100,MATCH("工资",$A$1:$D$1,0),FALSE)

常见 #N/A 原因

原因 排查
查找值不在第一列 确认 table_array 的第一列就是查找列
数字和文本不一致 用 ISNUMBER/ISTEXT 检查,必要时 VALUE 或 TEXT 转换
前后有空格 用 TRIM 清理,或先分列
不可见字符 用 CLEAN 或 SUBSTITUTE(...,CHAR(160),"")
区域没锁定 向下填充后范围偏移,改 $A$2:$D$100
精确匹配写成了近似 第四个参数必须是 FALSE/0
查找值被截断 编号超过 15 位时,Excel 只保留前 15 位;编号列应设为文本

易错点

相关条目

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. VLOOKUP 的第四个参数省略时,默认是精确匹配还是近似匹配?
  2. 为什么 VLOOKUP 不能返回查找列左边的字段?
  3. 查找结果全是 #N/A,优先检查哪三件事?
答案
  1. 默认是近似匹配(TRUE),日常查找应显式写 FALSE 或 0。
  2. VLOOKUP 只在区域第一列查找,返回列号只能向右数。
  3. 查找值是否在区域第一列、两边类型是否一致、区域是否锁定且没有多余空格。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令