在Microsoft Excel中列举唯一项(即不重复项)的方法有很多种,例如可使用删除重复项功能,也可使用数据透视表(PivotTable)。要实现最大的版本兼容性和自动性,则必须使用公式实现这一功能。Excel并未提供直接的列举函数,因此需要我们动手实现。
注意:本文仅提供了一种可行的办法,但较为繁琐。如条件允许,仍应使用前文所述之方法。另外,也可尝试使用FREQUENCY函数搭配数组公式法。由于数组公式计算量较大,速度较慢,这里仅提供一般的公式实现方法。
下面为一个已经列出一些示例数据的数据表。我们要不重复地列出这些商品项(即我们期待的结果是:{“Apple”;”Banana”;”Carrot”}。
| A | |
| 1 | Apple |
| 2 | Banana |
| 3 | Carrot |
| 4 | Apple |
| 5 | Carrot |
首先,为方便进一步处理,我们要为相同的字段确定一个确定的数字。那么,最简单的方法莫过于使用某字段在区域中的第一次出现序号。撰写公式如下:
| A | B | |
| 1 | =IF(ISBLANK(B1),”",MATCH(B1,B:B,0)) | Apple |
| 2 | =IF(ISBLANK(B2),”",MATCH(B2,B:B,0)) | Banana |
| 3 | =IF(ISBLANK(B3),”",MATCH(B3,B:B,0)) | Carrot |
| 4 | =IF(ISBLANK(B4),”",MATCH(B4,B:B,0)) | Apple |
| 5 | =IF(ISBLANK(B5),”",MATCH(B5,B:B,0)) | Carrot |
其中ISBLANK的判断是为了防止B列出现空格;MATCH函数则返回了在给定区域(第二个参数)的第一个匹配值(第一个参数)的位置,而第三个参数0则表示精确匹配。A列计算结果应为{1;2;3;1;3}。
下面进行枚举。首先要枚举出刚才生成的所有序号数字(我们一直要把它们视为字段的ID)。这里就体现出了刚才采用数字作标识的好处:有了数字后我们就可以使用Excel提供的Small(或Large)函数,可以有效地整理这些字段(或是序号),便于之后的跳过重复项操作。
在新的单元格上,建立如下的表格:
| D | E | F | |
| 1 | =IF(E1=”",”",COUNTIF(A:A,E1)) | =SMALL(A:A,ROW(E1)) | =IF(E1=”",”",VLOOKUP(E1,A:B,2,FALSE)) |
| 2 | =IF(E2=”",”",COUNTIF(A:A,E2)) | =SMALL(A:A,SUM($D$2:D2)+1) | =IF(E2=”",”",VLOOKUP(E2,A:B,2,FALSE)) |
| 3 | =IF(E3=”",”",COUNTIF(A:A,E3)) | =SMALL(A:A,SUM($D$2:D3)+1) | =IF(E3=”",”",VLOOKUP(E3,A:B,2,FALSE)) |
| 4 | =IF(E4=”",”",COUNTIF(A:A,E4)) | =SMALL(A:A,SUM($D$2:D4)+1) | =IF(E4=”",”",VLOOKUP(E4,A:B,2,FALSE)) |
| 5 | =IF(E5=”",”",COUNTIF(A:A,E5)) | =SMALL(A:A,SUM($D$2:D5)+1) | =IF(E5=”",”",VLOOKUP(E5,A:B,2,FALSE)) |
其中E列是列出序号,D列则计算每序号的重复次数。在此处要注意,Excel中所有与排列大小的函数(包括Small、Large、Rank等)的序号都包括了重复次数,因此我们必须要加上重复次数以排除其影响。F列将列出的就是我们所需要的唯一枚举结果。注意此处我使用了VLOOKUP函数是为了方便理解和扩展性(即可以列举同一行中的任意项),完全可以采用INDEX函数直接引用相应单元格以获得最高效率。
