要逐行比较两列,在第一行旁边输入 =B2=C2 并向下填充:TRUE 表示两个单元格相同,FALSE 表示不同。如果要找出一列中的值是否以任意顺序出现在另一列中,改用 =COUNTIF($B$2:$B$8,A2)>0。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Product | Old | New | Same? | Status |
| 2 | Apple | $1.20 | $1.20 | TRUE | Same |
| 3 | Pear | $1.50 | $1.60 | FALSE | Changed |
| 4 | Carrot | $0.80 | $0.80 | TRUE | Same |
| 5 | Bread | $2.40 | $2.20 | FALSE | Changed |
| 6 | Milk | $1.10 | $1.10 | TRUE | Same |
| 7 | Cheese | $4.50 | $4.90 | FALSE | Changed |
D3、D5 和 D7 为 FALSE,条件格式规则 =$B2<>$C2 给这三行着色。E 列用文字代替 TRUE 和 FALSE 显示同样的判断。把 C3 改成 1.5,第 3 行就变成 Same。
用 IF 比较两列
=B2=C2 返回 TRUE 或 FALSE。用 IF 包起来就能自己选择显示的文字:=IF(B2=C2,"Same","Changed"),就像上面的 E 列。如果想让相同的行留空、只标出差异,用 =IF(B2<>C2,"Changed","")。如果想看数字变化了多少,就不用比较而用减法:=C2-B2。
不用辅助列也能统计差异个数,在 SUMPRODUCT 中比较两个区域即可:对上面的表格,=SUMPRODUCT(--(B2:B7<>C2:C7)) 返回 3。
不用公式的方法:选中 B2:C7,并让 B2 成为活动单元格,打开 开始 > 查找和选择 > 定位条件,选择 行内容差异单元格,然后点击确定(在 Windows 上按 Ctrl+\ 效果相同)。Excel 会选中 C3、C5 和 C7,即同一行中与 B 列不同的单元格;给它们设置填充颜色就能标记出来。
用 EXACT 区分大小写比较
= 比较会忽略大小写:ab12 等于 AB12。当大小写很重要时(产品代码、密码、ID),用 EXACT(A2,B2),只有两段文本逐字符完全相同时才返回 TRUE。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Code | Entered | Equal? | EXACT |
| 2 | AB12 | AB12 | TRUE | TRUE |
| 3 | CD34 | cd34 | TRUE | FALSE |
| 4 | EF56 | EF56 | TRUE | TRUE |
| 5 | GH78 | Gh78 | TRUE | FALSE |
C 列用的是 = 比较,认为四行全部匹配。EXACT 则认为第 3 行和第 5 行不同,因为 cd34 和 Gh78 用了小写字母。
找出一列中有、另一列中缺少的值
当两个列表顺序不同时,要把每个值和另一整列进行比较。COUNTIF($B$2:$B$8,A2) 统计 A2 在 B2:B8 中出现的次数,所以 >0 表示“找到了”,=0 表示“缺少”。$ 符号让公式向下填充时查找区域保持固定。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | January | February | In February? | With MATCH |
| 2 | Ana | Dan | TRUE | TRUE |
| 3 | Ben | Fay | TRUE | TRUE |
| 4 | Cara | Ana | FALSE | FALSE |
| 5 | Dan | Gus | TRUE | TRUE |
| 6 | Eve | Hal | FALSE | FALSE |
| 7 | Fay | Ivy | TRUE | TRUE |
| 8 | Gus | Ben | TRUE | TRUE |
Cara 和 Eve 为 FALSE:她们 1 月买过,2 月没有。MATCH 用另一种方式得到同样的答案:MATCH(A2,$B$2:$B$8,0) 返回 A2 在 B 列中的位置,找不到时返回 #N/A,ISNUMBER 再把结果转换成 TRUE 或 FALSE。要反过来检查(2 月的新客户),在 B 列旁边放同样的公式,并交换区域:=COUNTIF($A$2:$A$8,B2)>0。
比较两个列表并返回匹配的值
很多时候,问题不只是“有没有”,而是“旁边的值是否一致”。这里把发票和一份顺序不同的付款列表进行比较:XLOOKUP 在付款中找到每张发票,返回已付金额,D 列再把它与发票金额比较。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Invoice | Amount | Paid | Match? | Payment for | Paid | |
| 2 | INV-101 | 120 | 120 | TRUE | INV-103 | 240 | |
| 3 | INV-102 | 85 | Not paid | FALSE | INV-101 | 120 | |
| 4 | INV-103 | 240 | 240 | TRUE | INV-105 | 140 | |
| 5 | INV-104 | 60 | 60 | TRUE | INV-106 | 95 | |
| 6 | INV-105 | 150 | 140 | FALSE | INV-104 | 60 | |
| 7 | INV-106 | 95 | 95 | TRUE |
INV-102 没有付款,所以 C3 显示 Not paid。INV-105 付了 140 而不是 150,所以 D6 也是 FALSE。XLOOKUP 的最后一个参数 "Not paid" 会替代找不到值时出现的 #N/A。XLOOKUP 需要 Excel 2021 或 Microsoft 365;在 Excel 2019 中使用 =IFERROR(VLOOKUP(A2,$F$2:$G$6,2,FALSE),"Not paid")。其他参数见 XLOOKUP 页面。
列出另一列中缺少的值
除了生成一列 TRUE/FALSE,FILTER 还能把缺少的值直接列成一个列表。COUNTIF(B2:B8,A2:A8) 的第二个参数是区域,会一次性统计 A 列的每个值,FILTER 再保留计数为 0 的那些。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | January | February | Not in February | |
| 2 | Ana | Dan | ||
| 3 | Ben | Fay | ||
| 4 | Cara | Ana | ||
| 5 | Dan | Gus | ||
| 6 | Eve | Hal | ||
| 7 | Fay | Ivy | ||
| 8 | Gus | Ben |
轮到你了: 在 D2 中,列出不在 2 月名单中的 1 月客户。
答案会溢出显示 Cara 和 Eve。=FILTER(A2:A8,ISNA(MATCH(A2:A8,B2:B8,0))) 也可以。如果所有客户都回来了,FILTER 会返回 #CALC!;为这种情况加上第三个参数:=FILTER(A2:A8,COUNTIF(B2:B8,A2:A8)=0,"None")。FILTER 需要 Excel 2021 或 Microsoft 365。更多条件写法见 FILTER。
突出显示两列之间的差异
上面的公式也可以用作条件格式规则。选中第一个列表,打开 开始 > 条件格式 > 新建规则 > 使用公式确定要设置格式的单元格,输入针对第一个单元格的公式。这里 A2:A8 使用 =COUNTIF($B$2:$B$8,A2)=0,B2:B8 使用 =COUNTIF($A$2:$A$8,B2)=0:只在其中一个列表中出现的名字都会被着色。
| A | B | |
|---|---|---|
| 1 | January | February |
| 2 | Ana | Dan |
| 3 | Ben | Fay |
| 4 | Cara | Ana |
| 5 | Dan | Gus |
| 6 | Eve | Hal |
| 7 | Fay | Ivy |
| 8 | Gus | Ben |
1 月中的 Cara 和 Eve 被着色,2 月中的 Hal 和 Ivy 被着色。如果两列应该逐行一致,就在两列上都使用规则 =$A2<>$B2,就像本页的第一个表格。如果想给两个列表中都有的名字着色,改用 >0,参见突出显示重复项页面。
为什么相同的值显示为不同
最常见的原因是看不见的空格:末尾带空格的 Ana 不等于 Ana。从其他系统或网页粘贴来的数据经常带有这种空格。改为比较去除空格后的值。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Name | Other list | Equal? | Trimmed |
| 2 | Ana | Ana | FALSE | TRUE |
| 3 | Ben | Ben | TRUE | TRUE |
| 4 | Cara | Cara | FALSE | TRUE |
| 5 | Dan | Dan | TRUE | TRUE |
C 列认为第 2 行和第 4 行不同;D 列在 TRIM 去掉两端空格之后,认为四行全部匹配。另一个常见原因是一列中的数字以文本形式存储,而另一列中是真正的数字:101 和 '101 看起来一样,但 Excel 的 = 比较返回 FALSE,MATCH、VLOOKUP 和 XLOOKUP 也无法在一个中找到另一个。COUNTIF 是例外:它会把看起来像数字的文本当作该数字读取,所以认为二者相等。单元格角上的绿色小三角标记了文本版本;用 =VALUE(A2) 或 =A2*1 转换,或者选中这些单元格,从警告图标中选择 转换为数字。
常见问题
如何在 Excel 中比较两列是否匹配?
逐行比较:在 C2 中输入 =A2=B2 并向下填充;TRUE 表示两个单元格相同。要检查 A 列的每个值是否出现在 B 列的任何位置,用 =COUNTIF($B$2:$B$8,A2)>0。
如何比较两列并返回第二列中的值?
查找这个值:=XLOOKUP(A2,$F$2:$F$7,$G$2:$G$7,"Not found") 返回 G 列中的匹配值,找不到则返回 Not found。在 Excel 2019 及更早版本中,使用 =IFERROR(VLOOKUP(A2,$F$2:$G$7,2,FALSE),"Not found")。
Excel 比较两个单元格时区分大小写吗?
不区分。=A2=B2 把 abc 和 ABC 视为相等。要区分大小写,用 =EXACT(A2,B2),只有每个字符(包括大小写)都相同时才返回 TRUE。
如何列出在一列中有、另一列中没有的值?
在 Excel 365 和 2021 中,=FILTER(A2:A8,COUNTIF(B2:B8,A2:A8)=0) 会把 A2:A8 中所有未出现在 B2:B8 中的值溢出显示出来。
为什么 Excel 说两个相同的值不一样?
通常是其中一个多了空格,或者是以文本形式存储的数字。用 =TRIM(A2)=TRIM(B2) 比较以排除空格,并用 =VALUE(A2) 或 =A2*1 转换文本数字。