Excel 自动化

如何比较两张 Excel 工作表并找出差异

按唯一编号比较两张 Excel 工作表,找出数值变化、新增行和缺失记录。通过完整示例理解双向核对、重复编号处理与结果验证,并为 AI 指定清晰的比较范围。

两份订单导出文件即使行数相同,也可能包含不同的订单。如果其中一张表重新排序或插入过记录,只比较两个 A2 单元格并不能说明问题。

比较业务记录时,应先按稳定的唯一标识匹配,再比较这个标识对应的字段。把三类结果分开:发生变化的记录、仅旧表存在的记录、仅新表存在的记录。保留两份源数据,把比较报告放到单独的工作表中。

先确定要比较什么

问题 合适的方法
某笔订单的金额变了吗? 按订单编号匹配,再比较金额
新增或删除了哪些订单? 双向检查编号是否存在
公式或单元格格式变了吗? 比较工作簿版本,而不只是公式返回的值
两张小表看起来有哪些不同? 并排查看,再逐项检查差异

Microsoft 的并排查看工作表功能有助于目视检查,但不会按业务编号对齐记录。下面的示例比较的是数值,不是格式或公式文本。

从唯一匹配键开始

使用订单编号、员工编号,或其他在每份源数据中应只出现一次的标识。仅用姓名往往不可靠。如果一笔订单有多行明细,订单编号本身就不唯一,需要使用有明确规则的组合,例如订单编号加明细行号。

匹配前,检查空编号、重复编号、前导零,以及数字与文本类型的差异。清理编号时,将原编号一并保留。不要为了强行匹配而删除有意义的空格或前导零。如果要把其他表中的字段补充到现有表里,可参阅列匹配指南。

以下公式使用英文函数名和逗号。不同语言或区域设置的 Excel 可能需要本地化函数名或分号。示例中的编号不含通配符,金额均为非空数值。

用一组小数据完成比较

在工作簿副本中创建两张名为 Old 和 New 的工作表。将以下虚构记录放入 A、B 列,第 1 行为表头。两张表的记录顺序有意设为不同。

Old 编号 Old 金额 New 编号 New 金额
A101 120 A103 75
A102 80 A101 120
A103 75 A105 60
A104 50 A102 95

前两列放在 Old 中,后两列放在 New 中。这些是教学示例数据,不是客户成果或速度测试。

首先,在每张表中添加辅助列,统计当前行编号在本表出现的次数:

=COUNTIF($A$2:$A$5,A2)

本例中每个非空编号都应返回 1。查询前应先检查大于 1 的结果。COUNTIF 不区分大小写,并支持通配符条件。如果编号的大小写有不同含义,或编号包含 *、?、~,就需要换用适合的匹配规则,不能直接照用这些简单公式。

接着,在 Old!D2 中统计新表里的匹配数量,再向下填充:

=COUNTIF(New!$A$2:$A$5,A2)

0 表示编号仅存在于 Old;1 表示有一个唯一候选;大于 1 表示匹配不明确。在 Old!E2 中取回新金额:

=XLOOKUP(A2,New!$A$2:$A$5,New!$B$2:$B$5,"Not found",0)

只有当 D 列为 1,且两边金额都是有效数值时,才比较 E 列与 B 列。不要把记录缺失、金额为空和实际金额为零混为一谈。对于计算得到的金额,应先确定合适的舍入或容差规则,再判定是否存在差异。

XLOOKUP 返回第一个匹配项,并不会替你解决重复编号问题。Excel 2016 和 2019 也不支持 XLOOKUP。在这些版本中,完成相同的唯一性检查后,可在 E2 使用以下精确匹配替代公式:

=IFNA(INDEX(New!$B$2:$B$5,MATCH(A2,New!$A$2:$A$5,0)),"Not found")

有关函数行为和版本支持,请参阅 Microsoft 的 XLOOKUP 文档和 INDEX 与 MATCH 指南。

最后,在 New 中统计每个编号在 Old 中出现的次数,找出新增记录:

=COUNTIF(Old!$A$2:$A$5,A2)

把这一列筛选为 0,就能找到 A105。如果只从 Old 查向 New,就会漏掉它。

生成能解释每项差异的报告

本例的独立报告应包含:

编号 旧金额 新金额 状态
A101 120 120 未变化
A102 80 95 已变化
A103 75 75 未变化
A104 50 — 仅在 Old 中
A105 — 60 仅在 New 中

这里共有五个不同编号:两个未变化、一个已变化、一个仅在 Old 中、一个仅在 New 中。两份源数据各有四行。若直接按相同行号比较,会得到误导性的结果。

比较多个字段时,为每项变化记录字段名、旧值和新值,同时保留编号及源数据行引用。把空匹配键或重复匹配键放入单独的待核对清单,不要静默删除。在修改任一源表前,可先阅读安全删除重复项的方法。

让 GetSheetAI 按明确范围比较

在 GetSheetAI Excel 侧边栏中,指定匹配键、比较字段、输出位置和规则,而不只是说“比较这两张表”。请把下面提示词中的字段名换成你的实际表头;如果源数据只有金额列,就去掉 Status:

按 Order ID 比较 Old 和 New,使用两张表实际有数据的范围。先报告每份源数据中的空编号和重复编号。如果编号无法唯一匹配,停止并询问我匹配规则。只比较 Amount 和 Status。区分记录缺失、空值和零值。新建 Comparison 工作表,列出编号、变化字段、旧值、新值、结果分类以及源数据行引用。包含只在一边存在的记录。不要修改任何源工作表。汇总各类数量,并列出未解决的行。

接受修改前,先核对拟采用的匹配规则。AI 可以帮助组织比较过程,但在没有你提供的规则时,不能判断两个不同编号是否代表同一笔订单。

使用报告前检查结果

  • 核对一条未变化记录、一条已变化记录,以及两边各一条独有记录。
  • 检查所有结果分类中的不同编号总数,未解决编号单独计数。
  • 确认任一源表重新排序后,分类结果不会变化。
  • 确认已包含完整的数据范围,而不只是可见行或筛选后的行。
  • 保留原始导出文件,让其他人能够复核比较过程。

如果下一步是核对发票与收款,而不是比较两个版本,请使用发票对账流程。一张发票对应多笔收款时,需要采用不同于本例“一编号一记录”的规则。