ARTICLE · 1003120
Excel中如何快速找出两列的差异值?两个函数教会你,1秒搞定

一、 函数写法
=UNIQUE(TOCOL(B4:D100),0,1)
:提取 B4:D100 区域内所有只出现过一次的姓名(即在整个三列名单中不重复的姓名),并以一列的形式输出。
二、函数拆解(从内到外)
1. TOCOL(B4:D100)
功能:将指定的二维区域(多行多列)转换为一列(纵向数组)。
语法:TOCOL(array, [ignore], [scan_by_col])
array:要转换的区域,此处为 B4:D100。
ignore:可选,指定是否忽略空值或错误。默认 0 表示不忽略任何值(空单元格也会保留)。
scan_by_col:可选,FALSE(默认)表示按行扫描(先从上到下读完第1列,再读第2列……);TRUE 表示按列扫描。
执行结果:
TOCOL(B4:D100) 会将 B4:D100 中 所有单元格(包括空单元格)按 行优先 顺序合并成一个 一维纵向数组
例如,前几个元素依次为:

空单元格也会被纳入数组,成为空字符串 ""。
2. UNIQUE( 上一步结果, 0, 1 )
功能:从数组中提取唯一值,并可根据参数控制是否只保留出现一次的值。
语法:UNIQUE(array, [by_col], [exactly_once])
array:要处理的数组,这里就是 TOCOL 返回的一列。
by_col:0(或 FALSE)表示按行比较(因为是一列,所以行/列无差别)。
exactly_once:1(或 TRUE)表示只返回在数组中恰好出现一次的元素。
执行过程:
首先,UNIQUE 会统计上一步数组(291个元素)中每个不同值出现的次数。
然后,筛选出出现次数 = 1 的值。
最后,将这些值按它们在数组中首次出现的顺序排列,输出为一列。
三、结合你的数据推演结果
从截图可见,三列姓名存在大量重复(如“王浩”同时出现在 B4、C4、B5、C7……等),而有些姓名只出现在某一列
所以,公式最终会返回那些只在三个名单列中出现一次的姓名,大概率就是那些只属于“未签到名单”(D列)且未在其他列出现的少数人,以及可能个别在“应签到”或“已签到”中独有的。
四、关键注意事项
⚠️ 空值处理
TOCOL 默认不忽略空单元格,所以数组中包含大量空字符串 ""。
空字符串在整个区域中出现次数远大于1(因为区域很大但数据只填到约22行),所以 UNIQUE 的 exactly_once=1 会自动排除空值(因为空值出现多次),结果中不会出现空白行。
但如果区域中空值恰好只出现一次(几乎不可能),则可能会被输出。通常建议显式忽略空值以提高性能,写作:
=UNIQUE(TOCOL(B4:D100, 1), 0, 1)
其中 1 表示忽略空单元格。
⚠️ 动态溢出
公式只需写在 G4 一个单元格,结果会自动“溢出”到下方若干行(行数等于符合条件的姓名个数)。
如果下方已有数据,会报 #SPILL! 错误,需先清空。
五、总结一句话
这个公式的作用是:把 B、C、D 三列的所有名单摊成一列,然后找出其中只出现一次的姓名,通常用于筛选出“仅在某个名单中出现、未在其他名单中重复”的人员(比如只未签到的人,或只应签到的人)。
它的精妙之处在于 两层数组操作:TOCOL 负责降维,UNIQUE 负责筛选,一步到位生成动态报表。