excel删除重复数据保留一条_[Excel]用公式删除重复项

ec1ce6319838695107bec3f25f889eac.png

太长不看版:

  1. Excel可以用数据>删除重复项 把一组数据里面的重复单元格删掉, 但是这种操作要依靠手动, 不能自动更新, 所以如果你的数据来源发生更新的时候要自己重新做一遍, 容易出错
  2. 要想能够自动完成数据>删除重复项 的功能, 用下面这个公式就可以了. 假设需要删除重复项的这组单元格是A2:A11, 删除重复项以后的唯一值列表放在C列, 在C2放置这个公式, CTRL+SHIFT+ENTER完成输入, 之后把单元格向下填充
=IFERROR(INDEX($A$2:$A$11,MATCH(0,COUNTIF($C$1:C1,$A$2:$A$11),0)),"")

搞定.


我们都知道可以用数据>删除重复项获得一个唯一元素列表。很多时候这个操作已经够我们用了,但是其实呢,就像筛选可以用公式实现一样,删除重复项这个操作也一样可以用公式搞定。

方法就是把index, match还有countif连起来用,当然iferror也要用上。

内容来源:How to Get Unique Items from a List in Excel Using Formulas

比如A2:A11是这么一组数据:1,1,1,2,2,3,4,5,5,6

然后做一个删除重复项就成了C2:C7的这一些东西:1,2,3,4,5,6

公式长成这样:=IFERROR(INDEX($A$2:$A$11,MATCH(0,COUNTIF($C$1:C1,$A$2:$A$11),0)),"")

上面的公式可以拆成下面几块:

  • countif($C$1:C1,$A$2:$A$11),这个记作countif(...)
  • match(0, countif(...),0),这个记作 match(...)
  • index($A$2:$A$11, match(...)), 这个记作 index(...)
  • match找不到的时候会报错,所以最外面再套一个iferror(index(...),"")

上面这个公式是一个数组公式,完成输入以后要按ctrl+shift+enter,而不是enter。

1. countif

这个地方最绕的应该还是countif. 我尽量说明一下.

首先如果是=countif($A$2:$A$11,$A$2:$A$11) 如果在excel里面用数组形式输入这个公式, 返回的结果是 3. 这个3指的是$A$2:$A$11 1这个值出现了3次. 如果我们把A2:A11的数据重新排列一下顺序: 2, 1, 3, 4, 1, 2, 5, 1, 5, 6, 这个公式就会返回2, 因为2这个值出现了2次. 如果我们在公式外面再套一个其他的公式, 然后用公式> 公式求值去看一下计算过程的话就会看到:

df8d3c0b8f96ba709b5332e8e0270459.png
对=sum(countif($A$2:$A$11,$A$2:$A$11))作公式求值的第一次求值结果

可以看到对=countif($A$2:$A$11,$A$2:$A$11)求值的结果是:{2;3;1;1;3;2;2;3;2;1} , 也就是这个数组里面, 2出现了2次,1出现了3次,3出现了1次,4出现了1次,1出现了3次,2出现了2次,5出现了2次,1出现了3次,5出现了2次,6出现了1次.

这就是当我们把criteria设置成一个范围内的单元格的时候会产生的结果.

2. match和index

接下来看看第二层, match. 还是借助公式求值这个工具, 这次我们在C2这个单元格输入

=MATCH(0,COUNTIF($C$1:C1,$A$2:$A$11),0)

记得按CTRL+SHIFT+ENTER! 返回结果是1

然后在C2这里做一个公式求值, 求值结果是: =MATCH(0,{0;0;0;0;0;0;0;0;0;0},0)

从这个公式来说, MATCH返回1是没问题的, 毕竟这个数组第一个就是0. 但是现在还是看不出来和我们向问题有什么关联. 但是接下来把index再套上去就不一样了, 这个时候返回的结果是2. 如果我们把A2:A11里面所有的2都替换成Feb呢? C2这个时候也会变成Feb. 这是肯定的, 毕竟=index($A$2:$A$11,1) 肯定就是返回这写个单元格里的第一个嘛.

现在还不太看得出来为什么这么干就能获得唯一值列表, 所以让我们把C2往下填充, 哎, 居然真的就成了唯一值了!

d97802655b5af3453d4d62a60aef7e34.png

让我们对C7这个单元格做一下公式求值吧:countif(...) 求值以后变成了{1;1;1;1;1;1;1;1;1;0} . 这个时候只有最后一个元素是0, 自然match的时候就会返回最后一个元素的位置, 接下来用index再把位置转换成元素, 也就是6.

下面那一堆#N/A 通过iferror就可以干掉了.


所以最关键的地方还是在countif,拿一系列的单元格来做countif的criteria可以说是一个奇技淫巧了, 在没有写这篇专栏文章以前我真完全没有想到还可以这么干, 下面我画一个图解尝试解释一下吧.

030bcebbd42df4a3b9937e6473de2e24.png

比如在上面这个数据表里面, B列有三个数据:Ben, Jane, Tom,那么现在下面这个公式返回的是几呢?

=countif(B:B,A1)

用A1的值(Ben)作为标准去数B列, B列就只有一个Ben, 那当然就是返回1了啦.

同样的, =countif(B:B, A2)呢?B列有一个Jane, 所以也是1.

92bb422cccee4cd4d5735cb48a11b4a2.png

在上面的两个例子里, 被搜索的范围是没有改变的, 都是B列的Ben, Jane, Tom着三个单元格, 但是搜索的标准变了. 那么如果我们把这两次搜索合并成一次搜索是否可行呢? 当然是可以的:

=countif(B:B,A1:A2)

按ctrl+shift+enter转换为数组公式, 这个时候返回的值实际上就是{1;1} 了, 这个结果的意思就是第一次搜索(用A1作标准), 找到了1个, 第二次搜索(用A2作标准), 也找到了1个. 这个就是拿一组数据做countif的criteria时候发生的事情.

那么回到我们的公式

=INDEX($A$2:$A$11,MATCH(0,COUNTIF($C$1:C1,$A$2:$A$11),0))

这里面很关键的一点, 就是我们被搜索范围的设定: 从当前列第一个单元格开始($C$1)到当前单元格上一个格子(对C2单元格, 我们设置成了C1, 这个相对关系在向下填充的时候被保留了).

对于C2单元格来说,它上面什么都没有,所以countif(...) 返回的肯定是一堆{0;0....;0},所以呢这个时候=match(0,countif(...),0)跟着返回的就是1, 那再交给index就会把用作criteria的这堆单元格的第一个拿来填到C2里面去.

接下来到C3单元格, 对它来说, 上面已经有了A2:A11这组单元格里面的第一个, 这样一来再去作countif(...) 的时候自然就不会全是0了, A2:A11里面所有值和A2相同的单元格, 对应的countif结果都会变成1. 对于前面提到的Feb, 1, 3, ...这组数据, 到C3的时候countif(...)返回的结果就会是{1;0;0;...} ,那match(...) 返回的结果也就成了2, 再用index就可以获得排在第二的单元格的值1

至于C4单元格,前面两个单元格都已经分别是Feb和1了,那countif的结果肯定会有更多的1,至于下一个0就只会出现在既不是Feb也不是1的单元格, 把这个位置用match拿出来, 再用index转成对应的值, 也就是3. 下面的都是以此类推.

这个想法还真是听精妙的, 而且让我觉得对Excel的功能有了新的认识

Excel删除重复项是一个非常常见的操作,尤其当你需要清理数据集以避免冗余信息时。以下是几种常用的方法来删除工作表中的重复项: ### 方法一:使用“删除重复项”功能 这是最简单直观的方式之一,适用于大多数情况下的快速去重。 #### 步骤: 1. **选中你要检查的数据范围**(可以是一列或多列)。如果你不确定要选择哪些列,可以选择整个表格。 2. 切换到 **“数据”选项卡**。 3. 点击 **“删除重复项”按钮**。 4. 在弹出的对话框中,勾选你希望基于哪几列来进行比较和删除的操作。默认情况下会全选所包含的所有字段。(注意:Excel保留首次出现的数据行,并移除所有后续相同的记录) 5. 单击 **“确定”** 按钮。完成后会有提示告诉你有多少条唯一值以及多少个重复项被删掉。 这种方法非常适合初学者或只是偶尔处理这类任务的人士使用。 --- ### 方法二:通过高级筛选去除重复项 对于某些特定场合下需要更精细控制的情况来说,“高级筛选”能提供更多的灵活性。 #### 步骤: 1. 同样先选定你的源数据区域。 2. 去到 **“数据”菜单栏** 下找到并点击 **“高级”命令**。 3. 在打开的新窗口里,在 “列表区域” 自动填充你应该已经选择了的目标区;如果没有则手动输入完整路径地址或者拖拽选取它。 4. 设置动作模式为 **仅复制过滤后的结果到其他位置**, 并指定一个新的空白处作为目标存放点。(如果不这么做将会直接覆盖原始资料) 5. 打开 **“选项... ”** 查看更多设置 -> 取消对 "只显示唯一记录" 的复选框标记 (这里是为了保证我们只获得非副本的内容); 6. 最终按下 OK 键执行指令后即可得到一份干净不含重复项目的副本。 这种方式的好处是可以不破坏原有数据库的同时生成一个净化过的版本供参考对比。 --- ### 方法三:利用辅助列配合公式法 当面对更为复杂的需求,比如在同一张表内既要保留下第一次出现的有效实例又得找出后来再次显现次数的信息量统计等特殊情形之下,我们可以借助新增加的一系列临时帮助性质栏目完成这项工作。 #### 示例流程演示: 假设我们要找寻A列中有无相匹配项目并且清除多余的拷贝同时保持最初一次遇见该元素不变: 1. 插入新列B命名为 `序号`, 输入以下数组公式然后向下拉伸直至涵盖整段待测序列: ```excel =IF(COUNTIF($A$2:A2,A2)=1,ROW()-1,"") ``` 2. 接着再添加另一辅助 C 列称作 `是否首现` ,在此填写判断语句如下: ```excel =IF(B2<>"", "是","否") ``` 3. 最后根据C列的结果进行排序升序排列并将所有标记不是初次亮相者隐藏起来或是物理上永久性地剔除它们就可以了! 这种技术虽然较为繁琐一点但是能够适应非常多变的要求调整方案十分强大。 --- ### 方法四:VBA宏程序自动化脚本 如果你熟悉 VBA 编程语言的话还可以编写自定义宏来做这件事儿。这对于经常遇到类似问题的专业人士而言无疑是最高效的途径。下面给出一段简单的代码例子用于批量清空某区间里的双胞胎们: ```vba Sub RemoveDuplicates() Dim rng As Range Set rng = Selection ' 或者你可以明确指出具体的工作簿名称与sheet页名及行列坐标 rng.RemoveDuplicates Columns:=Array(1), Header:=xlYes ' 修改Columns参数值以指明依据哪几列判定同质化个体,默认第一列为基准参照物,且视作标题不在范围内参与运算过程 End Sub ``` 只需按需修改相应变量声明部分就可以轻松应对不同场景的应用啦~ 以上就是关于如何在 Excel 中有效去除重复条目的四种基本技巧介绍。每一种都有各自的特点和适用范围,可以根据实际情况和个人偏好选择最适合自己的那一款哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值