别再背 VLOOKUP 了:用 Power Query 合并查询做多表匹配,一次配置永久刷新
VLOOKUP 插一列就悄悄算错、几万行就卡到打不开?本文用一个订单匹配商品单价的完整案例,手把手演示 Power Query 合并查询的四步操作、M 代码写法、多列条件匹配与区间匹配技巧,并附上常见踩坑清单,把每周重复的匹配工作变成一键刷新。
为什么该考虑放弃 VLOOKUP
VLOOKUP 是很多人学会的第一个「高级」函数,但它有三个绕不开的毛病:只能向右查找,返回列必须写在查找列右边;插入或删除列后 col_index_num 会悄悄错位,公式照常算出结果,却全是错的;几万行数据下拉整列公式,文件动辄卡到打不开。
而大多数 VLOOKUP 的真实用途其实是「把另一张表的信息贴过来」——这正是 Power Query 的「合并查询(Merge Queries)」最擅长的事。它的思路完全不同:不是在单元格里算一次,而是搭一条数据管道。源数据更新后,只要点一下「全部刷新」。
一个真实场景
假设你手上有两张表,放在同一个工作簿的两个工作表里。
订单表(表名 Orders):
| 订单号 | 商品编码 | 数量 |
|---|---|---|
| SO-1001 | A203 | 12 |
| SO-1002 | B117 | 5 |
| SO-1003 | C309 | 8 |
商品表(表名 Products):
| 商品编码 | 商品名称 | 单价 | 供应商 |
|---|---|---|---|
| A203 | 无线键盘 | 129 | 深圳甲 |
| B117 | 显示器支架 | 89 | 东莞乙 |
| C309 | USB 集线器 | 45 | 深圳甲 |
目标:给订单表补上商品名称和单价,并算出金额。
第 1 步:把两张表读进 Power Query
分别选中两个数据区域,按 Ctrl+T 转成表格,命名后到「数据」选项卡点「来自表格/区域」。两张表会以查询的形式出现在左侧查询窗格中。
第 2 步:新建合并查询
在「主页」选项卡点击「合并查询」→「将查询合并为新查询」。弹窗上半部分选 Orders,下半部分选 Products,然后分别单击两张表中的「商品编码」列——这一步等于告诉 Power Query:用这一列做关联键。
联接种类选「左外部(Left Outer)」,也就是以订单表为准,匹配不到就留空。生成的 M 代码是:
= Table.NestedJoin(Orders, {"商品编码"}, Products, {"商品编码"}, "Products", JoinKind.LeftOuter)第 3 步:展开要用的列
结果里会多出一列叫 Products 的表格式列,点它标题右侧的展开图标,取消勾选「使用原始列名作为前缀」,只保留「商品名称」和「单价」。对应代码:
= Table.ExpandTableColumn(已合并, "Products", {"商品名称", "单价"}, {"商品名称", "单价"})第 4 步:计算金额并上载
在「添加列」选项卡点「自定义列」,公式写 = [数量] * [单价],命名为「金额」。最后「主页」→「关闭并上载」,结果落到一张新工作表,同时生成一个查询,以后右键「刷新」即可。
如果改用 VLOOKUP,至少要写两条公式:
=VLOOKUP(B2, Products!$A:$D, 2, FALSE)
=VLOOKUP(B2, Products!$A:$D, 3, FALSE)一旦有人在 Products 表的 A、B 列之间插一列,这两条公式不会报错,只会安静地返回错误数据——这才是 VLOOKUP 最危险的地方。
合并查询比 VLOOKUP 强在哪
| 对比项 | VLOOKUP | 合并查询 |
|---|---|---|
| 向左查找 | 不支持 | 任意方向 |
| 源表插列 | 结果可能错乱 | 不受影响 |
| 多列条件 | 需拼辅助列 | 按住 Ctrl 多选 |
| 数据量 | 几万行开始卡顿 | 十万行也顺畅 |
| 更新方式 | 重新拖公式 | 一键刷新 |
| 附带清洗 | 无 | 可修整、改类型、分组 |
进阶用法
多列联合作为匹配键
同一商品编码在不同供应商下可能重复,这时要同时按「商品编码」和「供应商」匹配。在合并查询弹窗里按住 Ctrl 依次点选两列,M 代码会写成 {"商品编码", "供应商"}。注意两边的点选顺序必须一致,否则匹配结果会错乱。
找出匹配不上的行
把联接种类换成「左反(Left Anti)」,返回的就是所有在商品表里找不到对应记录的错误订单,做数据核对时非常实用:
= Table.NestedJoin(Orders, {"商品编码"}, Products, {"商品编码"}, "未匹配", JoinKind.LeftAnti)区间匹配
VLOOKUP 的近似匹配(第四参数为 TRUE)常被用来做阶梯定价、绩效分档。合并查询没有直接的近似匹配,两种替代方案:一是用「模糊匹配合并」并设置相似度阈值;二是先按区间下限排序,再用自定义列 = List.Last(List.Select(区间表[下限], each _ <= [数量])) 找到对应档位。
几个容易踩的坑
- 键列类型不一致:一边是文本
"1001",一边是数字1001,PQ 不报错,就是匹配不上。两列都设成「文本」最稳妥。 - 看不见的空格:系统导出的数据常带首尾空格,先做「转换」→「格式」→「修整」再合并。
- 数据源没转成表格:普通区域新增的行不会进入查询范围,务必
Ctrl+T。 - 刷新报错:多半是文件路径变动或工作表被改名,到「数据源设置」里重新指向即可。
小结
判断标准很简单:如果这件事只做一次、数据量很小,直接用 XLOOKUP 更省事;如果它每周都要做、涉及多表关联、还要清洗和计算,那就用 Power Query 合并查询搭一条可刷新的管道。前者是函数思维,后者是流程思维——真正省时间的,往往是后者。
广告