VLOOKUP查找多列与多个结果:返回多个值写法
讲清Excel里一次查找返回多列数据、列出全部匹配行的两种写法:用VLOOKUP的列序号参数配合MATCH取多列,用FILTER或辅助列列出多条结果,并附逐项核对方法。
很多人用 VLOOKUP 查数据时,最初只能拿到一个结果:输入工号,返回姓名,但部门和电话还得再写一遍公式。另一种情况更麻烦:同一个部门有十几个人,VLOOKUP 只会返回一条,其余的被悄悄略过。这篇文章写给经常在 Excel 里做查询、核对和汇总的人,讲清楚两件事:怎样用一个查找公式返回多列数据,以及怎样把所有匹配的结果列出来。
读完你应该能做到:在一张员工表里,输入一个工号就同时拿到姓名、部门和电话;输入一个部门名,就把该部门全部人员列出来。两件事的做法不同,选错了会漏数据,所以下面先分清情况。
查找多列和多个结果,怎么写公式?一句话结论:多列用 VLOOKUP 加 MATCH,多条结果用 FILTER 或辅助列
VLOOKUP 每次只返回查找区域中一列的值,但它的列序号参数可以写成公式,所以多列的问题可以用 MATCH 解决。列出多条匹配行则是另一回事,VLOOKUP 本身做不到,需要换工具。
| 你的情况 | 推荐做法 | 原因 |
|---|---|---|
| 每个查询值只对应一行,需要同时取多列 | VLOOKUP 配合 MATCH 算列序号 | 公式结构不变,向右拖动即可,兼容较老版本 |
| 同一个值对应多行,要全部列出 | FILTER 函数 | 结果自动向下铺开,一个公式搞定,但需要较新版本 |
| 版本较老,没有动态数组函数 | 辅助列编号加 INDEX 和 MATCH | 每个重复项有不重复的编号,常见版本都能用 |
| 查询列不在查找区域的左端 | XLOOKUP 或 INDEX 加 MATCH | VLOOKUP 要求查询列在左端,其他写法没有这个限制 |
| 只需要一次性结果,不需要公式 | 筛选或数据透视表 | 不用写公式,适合一次性整理 |
开始之前:先确认这几点
动手前先看四件事,它们决定后面的写法能不能用。
其一,你的 Excel 版本是否支持动态数组。 FILTER 和部分新函数只在较新的版本中可用。在单元格中输入“=FILTER”,如果自动提示出现,说明可用;如果没有,就用辅助列的方法。
其二,查询列是否在表的左端。 VLOOKUP 只能从查找区域的左端开始查找。如果工号在 D 列、姓名在 A 列,VLOOKUP 无法直接用,应改用 XLOOKUP 或 INDEX 加 MATCH。
其三,表头文字是否统一。 用 MATCH 找列序号时,表头必须与公式中引用的文字完全一致。多一个空格、少一个“的”,结果就会报错。建议先用“查找和替换”或手动检查表头,确认没有多余空格。
其四,源数据里是否有重复值。 一个工号重复出现,说明数据可能有问题,VLOOKUP 只会返回一条。如果是同一个部门多人,那就是正常的多条结果,需要按下面的第二种方法处理。
用 VLOOKUP 一次返回多列的步骤
假设一张员工表放在 A 到 E 列,A1 到 E1 依次是“工号、姓名、部门、电话、邮箱”,数据从第 2 行开始。我们在 G2 输入工号,在 H1 到 J1 写上想查的字段名“姓名、部门、电话”。
- 在 H2 输入公式
=VLOOKUP($G2,$A$2:$E$500,MATCH(H$1,$A$1:$E$1,0),FALSE)。第 1 参数是查询值,第 2 参数是查找区域,第 3 参数用 MATCH 根据表头自动算出列序号,最后的 FALSE 表示精确匹配。 - 检查 MATCH 部分的作用:它在 A1 到 E1 中找到“姓名”的位置,返回 2,这个数字就是 VLOOKUP 要返回的列序号。
- 把 H2 的公式向右拖动到 J2,三列都会得到正确的列序号。因为表头在变化,公式引用的列也会随之变化,不需要逐个修改。
- 在 G2 输入一个工号,例如一个实际存在的工号,确认 H2 到 J2 出现了对应的姓名、部门和电话。
- 如果某一列显示#N/A,说明查询值在源表中找不到,或者表头文字不一致,先回到第一步的表头检查。
- 查找区域的范围要覆盖全部数据。上面的$A$2:$E$500 表示到第 500 行为止,如果数据更多,需要扩大范围,或者改用整列引用。
- 确认后,如果要查询其他工号,只需修改 G2,三列结果会同步更新。
用 FILTER 列出所有匹配行
当同一个部门有多人,需要全部列出时,VLOOKUP 做不到。如果版本支持,可以用 FILTER。假设要在 G2 输入部门名,结果从 G5 开始向下列出该部门全部员工的工号、姓名和电话,可以在 G5 输入 =FILTER(A2:E500,C2:C500=G2,"没有匹配结果")。
这个公式的含义是:在 A2 到 E500 中,筛选出 C 列等于 G2 的所有行,返回全部列。结果会自动向下铺开,行数随匹配数量变化。如果没有匹配,会显示引号中的提示文字,而不是报错。
使用时要注意两点。结果区域下方和右侧不能有内容,否则会出现#SPILL!错误,提示结果被阻挡。另外,如果只需要其中几列,把 A2:E500 换成需要的列即可,例如只返回姓名和电话,可以写成 FILTER(B2:B500,...) 再加上 D 列,或者用 CHOOSECOLS 这类函数,但要先确认版本支持。
旧版本怎么做:辅助列编号法
如果没有 FILTER,可以用辅助列把重复项变成不重复的关键字,再逐条查找。在 F2 输入 =C2&COUNTIF($C$2:C2,C2),然后向下填充。这样同一部门初次出现时得到“销售部 1”,第二次得到“销售部 2”,以此类推。
查询时,在 G2 输入部门名,在 H2 输入 =IFERROR(INDEX($B$2:$B$500,MATCH($G$2&ROWS(H$2:H2),$F$2:$F$500,0)),""),向下拖动,依次返回该部门的每个姓名。要返回多列,可以把 INDEX 的区域换成对应列,并在右侧复制公式。这个方法步骤多一些,但常见版本都能用。
做完后逐项核对
查出结果后,不要直接使用,先检查下面几项。
| 检查项 | 怎么看 | 有问题怎么办 |
|---|---|---|
| 返回的列是否正确 | 随机抽两个工号,对照源表看姓名、部门和电话是否对得上 | 检查表头是否一致,MATCH 的范围是否从 A1 开始 |
| 是否出现#N/A | 扫一遍结果区,看有没有错误值 | 确认查询值是否存在,是否有多余空格或全半角差异 |
| 行数是否齐全 | 用 COUNTIF 统计源表中该部门人数,与 FILTER 结果行数比对 | 扩大查找区域范围,确认没有遗漏行 |
| 是否有重复值 | 对工号列使用 COUNTIF 查重 | 清理重复数据,再重新查询 |
| 结果是否被截断 | 看 FILTER 结果下方是否有内容挡住 | 清空阻挡的单元格,或换一个起始位置 |
📊 核心对比
三种方法各有适用场景,可以按下面的方式判断。
| 方法 | 能否返回多列 | 能否列出多行 | 版本要求 | 主要风险 |
|---|---|---|---|---|
| VLOOKUP 加 MATCH | 能 | 不能,只返回一条 | 常见版本都支持 | 查询列必须在左端,漏掉重复项 |
| FILTER | 能 | 能 | 较新版本 | 结果区被占用时报错 |
| 辅助列加 INDEX 和 MATCH | 能,需逐列复制 | 能 | 常见版本都支持 | 步骤多,辅助列需要维护 |
🎯 哪种做法适合你?
如果你只是做一张标准的信息卡,每次输入一个编号,看它对应的几项信息,用 VLOOKUP 加 MATCH 更直接。如果你经常需要按类别拉出全部明细,比如每个部门的人员名单,FILTER 会省去大量拖拽。如果同事的电脑版本较老,文件要分享给他人使用,辅助列方法更稳妥,因为它在常见版本中都能打开并正常计算。
❓ 常见问题(FAQ)
1. VLOOKUP 能不能一次返回整行数据?
可以。把 MATCH 的结果作为列序号,并让公式向右拖动,就能取回整行。如果表头很多,建议先确定需要的字段,只拖动到需要的列,避免结果太杂。
2. VLOOKUP 为什么返回的总是一条?
VLOOKUP 的设计就是找到匹配项后停止,它不会继续向下查找。要列出全部匹配项,必须使用 FILTER 或辅助列方法。
3. 查询列不在左端,怎么办?
可以使用 XLOOKUP,它能指定任意查找列和返回列。如果版本不支持,就用 INDEX 加 MATCH 组合,先用 MATCH 找到行号,再用 INDEX 取出对应列的值。
4. FILTER 结果出现#SPILL!是什么原因?
这说明结果区域下方或右侧有内容挡住了动态数组向外铺开。清空这些单元格,或者把公式移到一个空白区域即可。
5. 公式算出来是对的,但数据对不上,可能是什么原因?
常见原因有三个:表头文字有差异,导致 MATCH 找错列;查找区域没有覆盖到最后一行;数值与文本格式不同,例如工号一个是数字、一个是文字。逐一检查这三点,通常能找到问题。
📝 总结
VLOOKUP 查找多列靠的是列序号参数配合 MATCH,查找多条结果则需要 FILTER 或辅助列。先确认 Excel 版本、查询列位置和表头一致性,再选择对应写法,最后用行数和抽样对照做核对,就能让查询结果既完整又可靠。


