用订单号查客户、用员工编号查姓名、用产品编码查单价。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)
FALSE 或 0;#N/A;=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)
| 原因 | 排查 |
|---|---|
| 查找值不在第一列 | 确认 table_array 的第一列就是查找列 |
| 数字和文本不一致 | 用 ISNUMBER/ISTEXT 检查,必要时 VALUE 或 TEXT 转换 |
| 前后有空格 | 用 TRIM 清理,或先分列 |
| 不可见字符 | 用 CLEAN 或 SUBSTITUTE(...,CHAR(160),"") |
| 区域没锁定 | 向下填充后范围偏移,改 $A$2:$D$100 |
| 精确匹配写成了近似 | 第四个参数必须是 FALSE/0 |
| 查找值被截断 | 编号超过 15 位时,Excel 只保留前 15 位;编号列应设为文本 |
VLOOKUP 不能返回查找列左边的字段。需要往左查时用 excel-index-match 或 excel-xlookup。col_index_num 是相对 table_array 的列序,不是工作表列号。区域从 B 列开始时,B 是 1,C 是 2。TRUE 依赖升序,数据乱序会返回错误结果;不确定时一律用 FALSE。VLOOKUP 返回从上往下第一条;要最后一条得用 XLOOKUP 的 search_mode=-1 或先排序。table_array 内插入列,硬编码的列号会指向错误字段;用 MATCH 或改用 XLOOKUP。VLOOKUP(E2,A:D,4,FALSE) 写法简单,但数据量大时会拖慢计算;限定实际行数更好。IFNA/IFERROR 处理查找失败合上页面,先回答,再展开对照。
VLOOKUP 的第四个参数省略时,默认是精确匹配还是近似匹配?VLOOKUP 不能返回查找列左边的字段?#N/A,优先检查哪三件事?TRUE),日常查找应显式写 FALSE 或 0。VLOOKUP 只在区域第一列查找,返回列号只能向右数。
小程序版
微信扫码,随时查命令