2007年3月2日 星期五

[EXCEL] 排除重複的資料

 
  相關函數MATCH() / ROW() / SMALL() / INDEX()

  有一堆原始資料,其中可能有重複的部份,要如何才能排除重複的資料,每種資料只留下一筆?

  第一種方法,是先排序,把重複的部份集中在一起,再一筆一筆過濾排除。這個方法的好處是簡單,不需要任何函數或公式;壞處是,它會破壞掉原來的資料順序,而且必須從頭到尾用人工巡視一遍,可能會有疏漏

##CONTINUE##
  第二種方法,是用「格式化條件」把重複的部份變色,再一筆一筆過濾排除。詳細方法請參考這篇「[EXCEL]挑出重複的資料」。它的好處是不破壞原來的資料順序,而且可以一邊輸入新資料,一邊即時檢查新資料是否重複;壞處是,它一樣必須從頭到尾用人工巡視一遍,可能會有疏漏。如下圖 A 欄的紅色資料。

  第三種方法,也就是現在要介紹的方法,則是利用函數公式,直接挑出不重複的資料,這樣既不會破壞原來的資料順序,也不必從頭到尾用人工巡視一遍

  如上圖,有學生的請假記錄,如果想找出「二月份請過假的人」,也就是要把請過二天以上假的人只顯示一次,做法如下。

  假設名單範圍在 A1:A20,C 欄是用下列公式直接挑出不重複的請假名單:C2 輸入公式

=INDEX(A:A,SMALL(
IF(
IF(ISNA(MATCH($A$1:$A$20,A:A,0)),
"",
MATCH($A$1:$A$20,A:A,0))=ROW($A$1:$A$20),
ROW($A$1:$A$20),
""),
ROW()))

  這是一個陣列公式,請用 CTRL+SHIFT+ENTER 完成輸入。公式可往下複製。出現 #NUM! 時,表示名單已經列完了。

  這個公式的原理,是利用 MATCH(A2,A:A,0) 會在 A:A 找出第一個符合 A2 資料的位置列數,如 E 欄所示。如果 MATCH() 的結果和列數相同,如 E2,表示 A2 是第一次出現。如果 MATCH() 的結果和列數不相同,如 E5,表示 A5 不是第一次出現,也就是重複資料。

  利用 E 欄這個陣列,再加上 IF() 把陣列中的重複資料清為空白,就可以得到一個不重複名單列數的陣列了。再用 SMALL() 做排序,INDEX() 把列數轉為資料,就可以得到 C 欄的名單了。

  為了讓公式能使用在大小不同的變動名單上,我們允許名單範圍 A1:A20 中有空白。注意 E12 的 #N/A,就是因為 A12 為空白造成的。公式中的 ISNA() 就是為了把 #N/A 清為空白以免公式出錯才加的。

  實用上,可以把名單範圍設稍微大一點,當名單大小變動時,就不必每次更改公式了。

2008/10/21 補充:

  夏日大大提供了一個更簡便的公式,

  =T(INDEX(A:A,MIN(IF(COUNTIF(C$1:C1,$A$2:$A$20),4^8,ROW($A$2:$A$20)))))


  小弟大力推薦,有興趣的朋友可以研究一下。

1 意見:

~~~ 2014/4/11 下午5:23 提到...

天才 終於讓我找到方法了

感謝大恩大德

落淚