注:本文方法同时适用于 Excel 和 Numbers。

问题

对 Excel 中一列已经排序的数据,如何去重,且保留最终留下的值的行号?

例如:

1
2
3
4
5
6
7
8
9
110
110
151
163
163
163
888
888
999

这样一列数据,进行普通的去重之后结果为:

1
2
3
4
5
110
151
163
888
999

而现在想要的效果是:

1
2
3
4
5
6
7
8
9
110

151
163


888

999

分析

遇到这个问题第一个念头是用脚本来做,虽然 VBA 编辑很方便,也肯定能解决,但是总觉得还是不如 Excel 本身提供的操作方便。

第二个念头是使用公式,数据已经排序,需要保留第一次出现该值的那一行,那么可以比对本行值与上一行的值,如果相等则说明不是第一次出现,应删除,如果不等则说明是第一次出现,应保留。沿这个思路很简单地用一个 IF 就解决了问题:

1
=IF(A2<>A1,A2,"")

效果

总结

自从几年前学了点 VBA,遇到一些利用 Excel 进行数据处理的问题首先就想到使用脚本去做。可以想见步骤:

  1. Alt+F11 打开脚本编辑器。
  2. 查并不熟悉的 API 然后写出逻辑。
  3. 执行之后拿到结果。
  4. 保存的时候可能还得复制到另一份纯净的 Excel 文档里去,免得带脚本的 xls 文件在别人的机子上打开会报安全隐患之类的。

略繁琐,而像本问题则很合适就由 Excel 自带的公式来做,一行公式干净利落。

题外话

前面都是浮云,重点其实在这里,说这么多其实想说的是这样一句话:

做事情选对方法和工具很重要。

比如我周末看了优酷排行第一的蛙泳教学视频,然后有意识地调整了一下呼吸节奏与动作,前后对比如下:

#调整前调整后
最远距离1km2km
50m 划水次数3326
呼吸急促难持久平稳易坚持
个人感觉速度慢,累速度一般,不怎么累

由此可见一斑。