VLOOKUP 是 Excel 里最有名的函数,也是最多人"学了一半"的函数。
学一半的表现是:知道它大概能查东西,但一到自己表上就出 `#N/A`;知道有四个参数,但第四个参数到底是 0 还是 1,一直没搞明白。
这篇我不用参数表讲,用一张真实的表讲。你看完应该能直接套。
先看这张表,这就是你要解决的问题
假设你手上有两张表。
表一:员工信息表(在 A 到 C 列)
| 工号 | 姓名 | 部门 |
|---|---|---|
| A001 | 张三 | 技术部 |
| A002 | 李四 | 市场部 |
| A003 | 王五 | 技术部 |
| A004 | 赵六 | 财务部 |
表二:本月考勤表(在 E 到 F 列)
| 工号 | 姓名 |
|---|---|
| A003 | |
| A001 | |
| A004 |
现在你要做的活:把表二里空着的"姓名"填上,依据是表一的对应关系。
手工做法是一个一个看,看三行还行,看三百行会瞎。
拆开看:四个参数各是什么意思
用上面那张表,具体是:
我一个个说清楚。
第一个参数:要查什么
`E2` —— 就是表二里的那个工号 `A003`。
这里有个关键认知:VLOOKUP 是"拿着一把钥匙去找门"。钥匙就是你手上有的东西。
在上面的例子里,你手上有的钥匙是工号,想拿的是姓名。所以第一个参数一定是工号所在的单元格。
第二个参数:去哪里查
`$A$2:$C$5` —— 表一的数据区域,从工号列的第一行数据开始,一直框到最后一列。
这里有三个坑,我一个个说:
坑一:区域必须从"钥匙列"开始。 也就是工号那一列必须是区域的第一列。你不能框 `B2:C5`(从姓名开始),那样它找不到工号。
坑二:必须加 `$` 锁定。 这点下面单独讲,是 90% 的人第一次用会踩的坑。
坑三:区域不要框整列。 有人图省事写 `A:C`,能跑,但数据一多会变慢。框实际的数据范围就行。
第三个参数:带回来第几列
`2` —— 在 `A2:C5` 这个区域里,你要的"姓名"是第几列?
从 A 数起:A 是第 1 列(工号),B 是第 2 列(姓名),C 是第 3 列(部门)。
所以姓名是 2,部门是 3。
第四个参数:0 还是 1
填 0。
就这一个答案,别纠结。
- `0`(或 `FALSE`)= 精确匹配。找"一模一样"的那个。
- `1`(或 `TRUE`)= 近似匹配。找"最接近但不超过"的那个。
日常表格里你几乎永远要精确匹配。填 1 的后果是:查 `A003` 可能给你返回 `A001` 的数据,而且完全不报错——这是最可怕的错误,因为它不报错。
那个 `$` 到底是怎么回事
这是 VLOOKUP 新手第二个必踩的坑,值得单独讲。
假设你写了这样一个公式:
在 F2 单元格里,它工作正常,返回"王五"。
然后你往下拖,拖到 F3。
Excel 会自动把公式里的引用一起往下挪,变成:
问题来了:`A2:C5` 变成了 `A3:C6`。
查找区域往下挪了一格,第一行变成了 `A3`(王五),而表一的 `A001`(张三)已经被挪出区域了。所以查 `A001` 会返回 `#N/A`。
解决办法就是加 `$`:
`$` 的意思是"钉住,别动"。`$A$2` 表示列和行都钉住,往下拖、往右拖,它都不变。
反向查找:VLOOKUP 的死穴
现在换个需求。
你知道姓名,想查出工号。
用 VLOOKUP 直接做,会失败。因为姓名(B 列)在工号(A 列)的右边,而 VLOOKUP 只能"从左往右找"——它要求钥匙在区域的第一列。
有三种解法,我推荐第二种。
解法一:把表一改造成"姓名在前"
在旁边加一列辅助区,把姓名和工号对调顺序。能用,但丑,而且原表一改动就得重做。
解法二:IF 拼一个虚拟区域(推荐,不用改原表)
原理是:`IF({1,0}, 姓名列, 工号列)` 会临时拼出一个"姓名在左、工号在右"的虚拟区域,VLOOKUP 就能用了。
解法三:改用 INDEX + MATCH
这是更彻底的方案,我在另一篇里单独讲。简单说:`=INDEX(要返回的列, MATCH(要找的值, 查找的列, 0))`,它能随便向左向右查。
为什么老出 #N/A:五个原因,从多到少
`#N/A` 是 VLOOKUP 最常见的报错。按出现频率排:
| 报错原因 | 怎么判断 | 怎么改 |
|---|---|---|
| 没加 `$`,拖动后区域跑偏 | 第一行对,往下就错了 | 选中区域按 F4 |
| 查找值两边有空格 | 肉眼看不出,长度不一样 | 用 `TRIM()` 包一层 |
| 数字和文本格式不一致 | 一个是 1001,一个是 "1001" | 用 `--` 或 `VALUE()` 转换 |
| 真的没有这个值 | 手工核对确实不存在 | 用 IFERROR 包起来 |
| 区域第一列不是钥匙列 | 检查框选范围 | 重新框,从钥匙列开始 |
前两个占了八成。特别是"空格"这个——从系统导出的数据,几乎必然带不可见空格,`A003` 和 `A003 ` 在 VLOOKUP 眼里是两个不同的东西。
让报错变好看:套一层 IFERROR
查不到的时候显示一片 `#N/A`,表就很难看。套一层就好:
这样查不到时显示"未找到",比红字友好得多。
完整的操作步骤(照着做一遍)
- 在表二的"姓名"列第一个空格(F2)里,输入 `=VLOOKUP(`
- 点一下 E2(工号),公式里出现 `E2`,输入 `,`
- 用鼠标框选表一的 `A2:C5`,按 F4 锁定,输入 `,`
- 输入 `2`(姓名在区域第 2 列),输入 `,`
- 输入 `0`,输入 `)`,回车
- 选中 F2,双击右下角的小方块(填充柄),整列自动填好
一句话总结
VLOOKUP 就是:拿着你手上有的,去一张表的第一列里找,找到了就把同一行第 N 列的东西搬回来。第四参数填 0,区域按 F4。
记住这一句,剩下的都是细节。
评论 0