至近至遠東西,至深至淺清溪。至高至明日月,至親至疏夫妻。
-《八至》唐.李冶
首先有個問題問下小夥伴們,在Excel中當我們需要對一列數據進行統計不重複的內容時,你會怎麼操作呢?
如果沒猜錯的話,應該是以下這兩種方法
方法一:刪除重複項
點擊菜單欄中的【數據】-【刪除重複項】,刪除重複值
方法二:使用數據透視表
選中需篩選的數據,點擊【插入】-【數據透視表】,然後把對應數據列表頭拉入行中,實現篩選
今天給大家介紹的是使用公式實現數據刪除重複值,重點是可以跟隨原始數據,實時更新
先給大家演示下效果:
可以看出,篩選出的數據和其他方式得出的數據一致,且當我們對原始的人名進行修改的時候,可以看到不重複的人員這一列人名也跟著變動了
先給大家看下C2單元格的公式:
=IFERROR(INDEX($A$2:$A$15,MATCH(0,COUNTIF($C$1:C1,$A$2:$A$15),0),1),"")
公式詳解:
首先可以看出,這個公式主要用到了下面4個函數
IFERROR,INDEX,MATCH,COUNTIF
為了方便理解,下面逐個給大家分析下。
COUNTIF函數
我們知道COUNTIF函數是用來進行計數統計的,語法結構
COUNTIF(range,criteria)
Range: 要計算其中非空單元格數目的區域
Criteria: 以數字、表達式或文本形式定義的條件
我們經常用到的是查找一個內容,在目標區域出現的次數,就像下面這樣統計趙雲在A列出現的次數
看我們的公式:
COUNTIF($C$1:C1,$A$2:$A$15)
可以看出第一個參數C1是絕對引用的,第二個C1是相對引用,即隨著我們下拉單元格,Range區域是隨之變更,C1:C2,C1:C3...
又可以看出Range和Criteria都是一個數據區域,含義是什麼呢?
代表通過Countif函數依次統計A2:A15,每個單元格內容在C1:C1出現的次數
當我們的Range是一個區域或者一個值的時候,Criteria是區域的時候,查找的結果返回的是一組數組
就像上面Countif的Range是C1(趙雲),Criteria是A2:A15,即當Criteria是A2,A5,A9時,返回結果為1;當Criteria不是這幾個單元格內容時,返回的結果都是0,
其實我們的公式就是代表以下這些公式的結果合集:
Countif(C1,A2);Countif(C1,A3);Countif(C1,A4)...
D2輸入公式:
=countif(C1,A2:A15)
最終返回的結果是:
再演示下,如果C1和C2都是趙雲,會出現什麼結果
D3輸入公式:
=countif(C1:C2,A2:A15)
計算步驟同樣是公式的結果合集
Countif(C1:C2,A2);Countif(C1:C2,A3);Countif(C1:C2,A4)...
最終結果是:
所以我們使用的公式輸出的結果就是一列數組,比如我們在C2輸入:趙雲,再在C3使用公式:
=COUNTIF($C$1:C3,$A$2:$A$15)
返回的數組就是如下樣式的:
MATCH函數
接著我們看Match函數,Match函數語法為
MATCH(lookup_value, lookup_array, [match_type])
lookup_value:必需參數,需要在 lookup_array 中查找的值,比如可以是數字也可以是文本,比如"0","趙雲",或者是單元格
lookup_array:必需參數,要搜索的單元格區域。
match_type:可選參數,數字 -1、0 或 1。1代表會查找小於或等於lookup_value 的最大值,0代表等於 lookup_value 的第一個值,-1代表大於或等於 lookup_value 的最小值
我們看公式:
MATCH(0,COUNTIF($C$1:C1,$A$2:$A$15),0)
能看出Lookup_value為0,lookup_array為
COUNTIF($C$1:C1,$A$2:$A$15),match_type為0,代表查找到的第一個值
為什麼lookup_vlaue為0呢, 我們再看上面介紹的Countif函數,當我們查找值的內容(A列的值)不在Range(C列提取值)範圍時,得到的結果是不是0,第一個0的出現是不是就代表的新出現一個不在查找區域的值,即我們需要篩選的數據內的不重複的值
此時我們用Match函數查找第一個0在數組的位置,即得到了新的不重複的值在原始數據第幾行了
INDEX函數
Index函數的語法結構是這樣的:
INDEX(array, row_num, [column_num]),通過行列的內容返回數組裡的具體內容
Array:必需。單元格區域或數組常量。
如果數組只包含一行或一列,則相對應的參數 row_num 或 column_num 為可選參數,我們現在只有一列,所以column_num是可選參數
Row_num:必需。選擇數組中的某行,函數從該行返回數值。如果省略 row_num,則必須有 column_num。
Column_num:可選。選擇數組中的某列,函數從該列返回數值。如果省略 column_num,則必須有 row_num。
看我們的公式:
INDEX($A$2:$A$15,MATCH(0,COUNTIF($C$1:C1,$A$2:$A$15),0),1)
其中Array為A2:A15,Row_num為Match函數輸出的結果,Column_num為1,即查第Match結果行,第1列,在數據區域A2:A15的值
最終即得到我們需要的結果
IFERROR
IFERROR函數是用來判斷計算公式是否正確的一個函數,如果公式正確返回公式的值,如果不正確返回設定的值,我們設定的結果是空值
IFERROR(value, value_if_error)
其中Value值是必需的,檢查是否存在錯誤的值
value_if_error也是必須的,當Vlaue公式的計算結果為錯誤時要返回的值。
錯誤類型有:#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME? 或 #NULL!。
總結
整個公式,比較難理解的是COUNTIF函數的那塊,大家可以多多練習下,多試驗幾次就能幫助我們更好的理解了,另外注意因為這是數組公式,輸入完成後,我們需要按CTR+Shift+Enter鍵結束公式。
如果覺得文章對你有幫助的話,希望大家幫忙點贊加分享哦~,謝謝
本文由彩虹Excel原創,歡迎關注,帶你一起長知識!
文章來源: https://twgreatdaily.com/q-DFM28BMH2_cNUgnwKq.html