excel中 有两个表 表中有部分数据一样 怎样把相同数据的导到另外一个表
所属主题:数据透视表分组汇总 Excel 数据透视表分析
快速识别两表重复数据:匹配、提取与去重完整方案
如果你有两个 Excel 表,需要把其中数据相同的部分提取到新表中,最直接的方法是先判断哪些行匹配,再筛选复制。核心工具是 VLOOKUP / XLOOKUP 函数或 Power Query 合并查询。读完本文你将掌握:3 种匹配思路的适用场景、从标记到提取的完整操作路径、以及 5 个导致匹配失败的高频坑及排错方法。
为什么要用"辅助列"思路而不是直接复制
许多人在"excel中 有两个表 表中有部分数据一样 怎样把相同数据的导到另外一个表"时,第一反应是手动逐个对比——这在几十行内可行,一旦超过 200 行就会耗时且极易出错。
更稳妥的思路是三步走:
- 建立匹配标记:用函数判断每一行是否在另一张表中存在
- 筛选出匹配行:用 Excel 自带的筛选功能只显示标记为"匹配"的行
- 复制到新表:粘贴数值,去掉辅助列
这种方法的优势在于:它不改变原始数据、可重复执行、并且每种操作(函数、筛选、粘贴)都有快捷键支持。
方法一:VLOOKUP + 筛选(适合 5000 行以内)
步骤 1:确认唯一标识列
两表必须有一个共同且唯一的标识字段——员工编号、订单号、产品编码等。如果一表有重复编号,需要先去重(数据 → 删除重复值)。
关键前提:两表的标识列格式必须一致。这是最常见的失败原因,下文"常见坑"会专门展开。
步骤 2:写公式标记匹配
假设表1 的 A 列是员工编号,在表1 的 D1 输入标题"是否匹配",D2 输入:
=IF(ISNA(VLOOKUP(A2, 表2!$A:$A, 1, FALSE)), "不存在", "匹配")
公式拆解:
| 参数 | 含义 | 常见错误 |
|---|---|---|
A2 |
当前行的查找值 | 写成 A1 会错位一行 |
表2!$A:$A |
表2的编号列,必须加工作表名+感叹号 | 漏写表名会返回 #NAME? |
1 |
返回第几列的值 | 这里只判断存在性,返回第 1 列即可 |
FALSE |
精确匹配 | 漏掉或写 TRUE 可能导致近似匹配 |
步骤 3:筛选并提取
- 选中表1 整个数据区域 → 数据 → 筛选(或按
Ctrl+Shift+L) - 点击 D 列筛选项 → 只勾选"匹配"
- 选中筛选后的所有行 →
Ctrl+C - 打开新工作表 → 点击 A1 → 粘贴为数值(右键 → 粘贴选项 → "123"图标)
- 删除 D 列辅助列
方法二:XLOOKUP + 条件格式(Excel 2019 / 365)
XLOOKUP 比 VLOOKUP 更灵活——查找列不需要位于返回列左侧,且参数更直观:
=IF(ISNA(XLOOKUP(A2, 表2!$A:$A, 表2!$A:$A)), "不存在", "匹配")
如果你更希望用颜色直观标识匹配行而非生成文字标记,可以用条件格式:
- 选中表1 数据区域(从 A2 到最后一个数据行)
- 开始 → 条件格式 → 新建规则 → 使用公式确定要设置格式的单元格
- 输入公式:
=COUNTIF(表2!$A:$A, $A2)>0
- 点击"格式"→ 设置亮黄色填充 → 确定
此后凡是编号出现在表2 中的行都会自动标黄,无需额外辅助列。
方法三:Power Query 合并查询(适合 1 万行以上或定期重复)
当数据量超过 1 万行、或你需要每周都做同样的匹配操作时,Power Query 是更优解。它能做左反连接,直接输出"只在表1 而不在表2"的行,反选即得交集。
操作路径:
- 选中表1 数据区域 → 数据 → 获取数据 → 来自表格/区域(确保 Ctrl+T 先转为表格)
- 对表2 重复同样操作
- 数据 → 查询和连接 → 右键表1 查询 → 合并查询
- 选择表2 作为合并对象 → 点击"编号"列建立关联
- 在"联接种类"中选择**"左反"**(即只保留表1 中有而表2 中没有的行)
- 点击"确定" → 在右下角加载选项中选择"关闭并加载至新工作表"
如果想获取交集而非差集,将步骤 5 改为**"内部联接"**即可。Power Query 的完整操作流程和合并类型对比,可参考我们另一篇两表数据匹配的 Power Query 完整指南。
两表匹配失败:5 个高频坑与排查方法
| 错误现象 | 根因 | 解决方案 |
|---|---|---|
| 返回 #N/A 但肉眼看到数据一样 | 文本 vs 数字格式不一致 | =A2=B2 返回 FALSE 即确认;用 =TRIM(A2) 清理空格 |
| 筛选后复制包含隐藏行 | 忘记只选可见单元格 | 选中区域后按 Alt+; 再复制 |
| 粘贴后公式变错误值 | 未贴为数值 | 粘贴选项选"123"数值图标 |
| 拖拽公式后范围偏移 | 相对引用未锁定 | 把 A:A 写成 $A:$A |
| 编号左侧有绿色三角 | 文本型数字 | 数据 → 分列 → 完成,或 =A2*1 转数值 |
坑 1:编号存储为文本与数值不匹配
这是最常见的"看起来一样但匹配不上"的原因。检查方法:在空白列输入 =A2=表2!A2,返回 FALSE 基本就是格式问题。
解决两种方式任选:
- 数据 → 分列 → 直接点完成(Excel 会将文本型数字转数值)
- 写公式时统一转换:
=VLOOKUP(TEXT(A2, "0"), 表2!$A:$A, 1, FALSE)
坑 2:隐藏的空格与换行符
从 ERP 或网页导出的数据经常携带不可见字符。=LEN(A2) 如果大于肉眼可见字符数,即存在隐藏字符。用 =TRIM(A2) 或 =CLEAN(A2) 生成新列后再匹配。
坑 3:公式相对引用未锁定
VLOOKUP 第二个参数写成 表2!A:A 而非 表2!$A:$A,拖拽到第 5 行时范围会变成 表2!D:E,导致查找列偏移。更稳妥的做法是选中数据区域按 Ctrl+T 转为表格,Excel 会自动管理引用。
需要返回匹配行对应值怎么办
上述方法只判断"是否存在"。如果你还需要把表2 中的某列值(如部门、绩效评级)带回到表1,需要用:
=VLOOKUP(A2, 表2!$A:$C, 3, FALSE)
第三个参数 3 表示返回表2 第 3 列的值。注意 VLOOKUP 要求查找列在表2 中位于最左侧,否则需要改用 XLOOKUP 或 INDEX+MATCH:
=XLOOKUP(A2, 表2!$A:$A, 表2!$C:$C)
INDEX+MATCH 的写法与适用场景,可参考另一篇文章Excel 双条件查找的四种解法对比。
常见问题
怎样用 COUNTIF 判断两个表是否有相同数据?
在表1 空白列输入 =COUNTIF(表2!$A:$A, A2)>0,返回 TRUE 表示该行编号存在于表2。COUNTIF 比 VLOOKUP 更快,因为只做存在性计数、不返回值。如果你需要的是"有/没有"的判断,它是最优解。
两表数据完全一样但匹配不上是什么原因?
95% 的情况是格式问题:文本 vs 数字、全角 vs 半角、隐藏空格。先用 =A2=表2!A2 测试,返回 FALSE 就逐项排查。还有 5% 的情况是编号本身有差异,比如表1 是"001"而表2