[英]Getting unique values in Excel by using formulas only
您是否知道在Excel中通過公式“計算”唯一值列表的方法?
例如:垂直范圍包含值"red"
, "blue"
, "red"
, "green"
, "blue"
, "black"
我希望得到"red
, "blue"
, "green"
, "black"
+最終2個其他空白單元格。
我已經找到了一種方法來使用SMALL或LARGE結合INDEX來獲得計算出的排序列表,但是我想在不使用VBA的情況下進行這種計算排序。
好的,我有兩個想法給你。 希望他們中的一個能讓你到達你需要去的地方。 請注意,第一個忽略了作為公式執行此操作的請求,因為該解決方案並不漂亮。 我想我確保簡單的方法對你不起作用; ^)。
此解決方案將適用於以下警告:
以下是解決方案的摘要:
這是一個循序漸進的例子:
希望這可以幫助....
這是一個老人,有一些解決方案,但我提出了一個比我遇到的任何其他更短更簡單的公式 ,它可能對任何路過的人都有用。
我已經命名了顏色列表Colors
(A2:A7),並且放在單元格C2中的數組公式是這個( 固定 ):
=IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C$1:C1,Colors)),COUNTIF(Colors,"<"&Colors),0)),"")
使用Ctrl+Shift+Enter
在C2中輸入公式,然后將C2復制到C3:C7 。
樣本數據說明{“紅色”; “藍色”; “紅色”; “綠色”; “藍色”; “黑色”}:
COUNTIF(Colors,"<"&Colors)
返回一個數組(#1),其數值小於數據{4; 1; 4; 3; 1; 0}中的每個項目(黑色= 0項更小,藍色= 1項,紅色= 4項)。 這可以轉換為每個項目的排序值 。 COUNTIF(C$1:C...,Colors)
為已經在排序結果中的每個數據項返回一個數組(#2),其中包含1。 在C2中,它返回{0; 0; 0; 0; 0; 0}和C3 {0; 0; 0; 0; 0; 1},因為“black”在排序中排在第一位,在數據中排在最后。 在C4 {0; 1; 0; 0; 1; 1}中,它表示“黑色”,並且所有出現的“藍色”已經存在。 SUM
通過計算已存在的所有較小值的出現次數(數組#2的總和)來返回第k個排序值。 MATCH
找到第k個排序值的第一個索引(數組#1中的索引)。 IFERROR
僅隱藏底部單元格中的IFERROR
#N/A
錯誤。 要了解您擁有多少獨特物品,您可以使用以下常規公式 :
=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
我為您在VBA中創建了一個函數,因此您現在可以輕松地完成此操作。
如本教程中所示,創建一個VBA代碼模塊(宏)。
Insert
Module
。 Save As
為”中的“ Excel Macro-Enabled
。 Function listUnique(rng As Range) As Variant
Dim row As Range
Dim elements() As String
Dim elementSize As Integer
Dim newElement As Boolean
Dim i As Integer
Dim distance As Integer
Dim result As String
elementSize = 0
newElement = True
For Each row In rng.Rows
If row.Value <> "" Then
newElement = True
For i = 1 To elementSize Step 1
If elements(i - 1) = row.Value Then
newElement = False
End If
Next i
If newElement Then
elementSize = elementSize + 1
ReDim Preserve elements(elementSize - 1)
elements(elementSize - 1) = row.Value
End If
End If
Next
distance = Range(Application.Caller.Address).row - rng.row
If distance < elementSize Then
result = elements(distance)
listUnique = result
Else
listUnique = ""
End If
End Function
只需輸入=listUnique(range)
到一個單元格。 唯一的參數是range
,它是普通的Excel范圍。 例如: A$1:A$28
或H$8:H$30
。
range
必須是列。 range
開始的同一行中。 它適用於包含空單元格的列。 如果你將單元格(調用函數)覆蓋到應該沒有輸出的位置,函數也不會輸出任何內容(不是錯誤),就像我在上一個例子中的“2. Grow it”部分所做的那樣。
一種迂回的方式是將Excel電子表格加載到Google電子表格中,使用Google的UNIQUE(范圍)功能 - 這完全符合您的要求 - 然后將Google電子表格保存回Excel格式。
我承認這對Excel用戶來說不是一個可行的解決方案,但這種方法對於任何想要該功能且能夠使用Google電子表格的人都很有用。
注意到它是一個非常古老的問題,但人們似乎仍然無法使用公式來提取獨特的項目。 這是一個返回值為selfs的解決方案。
讓我們說A2列中有“紅色”,“藍色”,“紅色”,“綠色”,“藍色”,“黑色”:A7
然后將其作為數組公式放入B2中並復制=IFERROR(INDEX(A$2:A$7;SMALL(IF(FREQUENCY(MATCH(A$2:A$7;A$2:A$7;0);ROW(INDIRECT("1:"&COUNTA(A$2:A$7))));ROW(INDIRECT("1:"&COUNTA(A$2:A$7)));"");ROW(A1)));"")
那應該是這樣的;
即使要獲得排序的唯一值,也可以使用公式來完成。 這是您可以使用的選項:
=INDEX($A$2:$A$18,MATCH(SUM(COUNTIF($A$2:$A$18,C$1:C1)),COUNTIF($A$2:$A$18,"<" &$A$2:$A$18),0))
范圍數據: A2:A18
單元格C2
公式
這是一個ARRAY FORMULA
您可以使用COUNTIF來獲取范圍中值的出現次數。 因此,如果值在A3中,范圍是A1:A6,則在下一列中使用IF(EXACT(COUNTIF(A3:$ A $ 6,A3),1),A3,“”)。 對於A4,它將是IF(EXACT(COUNTIF(A4:$ A $ 6,A3),1),A4,“”)
這將為您提供一個列,其中所有唯一值都沒有任何重復
假設列A包含您要查找單個唯一實例的值,並且具有標題行,則使用以下公式。 如果您希望它以不可預測的行數進行擴展,則可以使用= ADDRESS(COUNTA(A:A),1)替換A772(我的數據結束) 。
= IF(COUNTIF(A5:$ A $ 772 A5)= 1,A5, “”)
這將在列中的每個值的LAST實例上顯示唯一值,並且不承擔任何排序。 它利用缺乏絕對性來基本上減少數據的“滑動窗口”。 當縮小窗口中的countif等於1時,該行是該列中該值的最后一個實例。
Drew Sherman的解決方案非常好,但列表必須是連續的(他建議手動排序,這對我來說是不可接受的)。 如果項目數量很大並且不遵守原始列表的順序,Guitarthrower的解決方案有點慢:它無論如何輸出排序列表。
我想要項目的原始順序(按照另一列中的日期排序),另外我想從最終列表中排除一個項目,不僅是因為它是重復的,而且還有其他各種原因。
我的解決方案是對Drew Sherman解決方案的改進。 同樣,此解決方案使用2列進行中間計算:
A欄:
列表中包含要復制的重復項和空格。 我將把它放在A11:A1100區間作為例子,因為我無法將Drew Sherman的解決方案移動到第一行沒有開始的情況。
B欄:
如果此行中的值有效(包含非重復值),則此公式將輸出0。 請注意,您可以在第一個IF中添加所需的任何其他排除條件,或者添加另一個外部IF。
=IF(ISBLANK(A11);1;IF(COUNTIF($A$11:A11;A11)=1;0;COUNTIF($A11:A$1100;A11)))
使用智能副本填充列。
C欄:
在第一行,我們將找到第一個有效行:
=MATCH(0;B11:B1100;0)
從該位置,我們使用以下公式搜索下一個有效值:
=C11+MATCH(0;OFFSET($B$11:$B$1100;C11;0);0)
將它放在第二行,並使用智能副本填充列的其余部分。 當沒有更多唯一的指向時,此公式將輸出#N / D錯誤。 我們將在下一欄中利用這一點。
D欄:
現在我們只需要獲取C列指出的值:
=IFERROR(INDEX($A$11:$A$1100; C11); "")
使用智能副本填充列。 這是輸出唯一列表。
我在下面的excel文件中粘貼了我使用的內容。 這將從范圍L11:L300
獲取唯一值,並從V列V11開始填充它們。 在這種情況下,我在v11中有這個公式並將其向下拖動以獲得所有唯一值。
=INDEX(L$11:L$300,MATCH(0,COUNTIF(V$10:V10,L$11:L$300),0))
要么
=INDEX(L$11:L$300,MATCH(,COUNTIF(V$10:V10,L$11:L$300),))
這是一個數組公式
你也可以這樣做。
創建以下命名范圍:
nList = the list of original values
nRow = ROW(nList)-ROW(OFFSET(nList,0,0,1,1))+1
nUnique = IF(COUNTIF(OFFSET(nList,nRow,0),nList)=0,COUNTIF(nList, "<"&nList),"")
使用這3個命名范圍,您可以使用下面的公式生成唯一值的有序列表。 它將按升序排序。
IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-?),nUnique,0)),"")
您需要將唯一有序列表的第一個元素上方的單元格行號替換為“?” 字符。
例如。 如果您的唯一有序列表在單元格B5中開始,則公式將為:
IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-4),nUnique,0)),"")
我很驚訝這個解決方案尚未出現。 我認為這是最簡單的之一
為數據提供標題並將其放入動態命名范圍(即,如果您的數據位於col A
)
=OFFSET($A$2,0,0,COUNTA($A:$A),1)
然后創建一個數據透視表,使源成為您的命名范圍。
只需將標題放入行部分,您將擁有唯一值,您可以使用內置功能對任何方式進行排序。
我最近遇到了同樣的問題,終於搞清楚了。
使用您的列表,這里是我的Excel與公式的粘貼。
我建議在列表中間的某個位置編寫公式,例如,在我的示例的單元格C6
中,然后將其復制並將其粘貼到列中,公式應自動調整,而無需重新鍵入。
具有唯一不同公式的唯一單元格位於第一行。
使用你的清單(“紅色”,“藍色”,“紅色”,“綠色”,“藍色”,“黑色”); 結果如下:( 我沒有足夠高的級別來發布圖像,所以希望這個txt版本有意義 )
[C列:唯一列表公式]
=A3
=IF(ISERROR(MATCH(A4,A$3:A3,0)),A4,"")
=IF(ISERROR(MATCH(A5,A$3:A4,0)),A5,"")
=IF(ISERROR(MATCH(A6,A$3:A5,0)),A6,"")
=IF(ISERROR(MATCH(A7,A$3:A6,0)),A7,"")
=IF(ISERROR(MATCH(A8,A$3:A7,0)),A8,"")
這只適用於值是有序的,即所有“紅色”在一起而所有“藍色”在一起等等。假設您的數據在A列中的A列開始 - (不要從第1行開始) B2輸入1 in b3 type = if(A2 = A3,B2,B2 + 1)向下拖動公式直到數據結束所有“紅色”將為1,所有“藍色”將為2全部為“綠色”將3等
在C2中輸入1,2,3等等,在D2 = OFFSET($ A $ 1,MATCH(c2,$ B $ 2:$ B $ x,0),0)中 - 其中x是最后一個單元向下拖動,只會顯示唯一值。 - 進行一些錯誤檢查
對於適用於多行和多列值的解決方案,我發現以下公式非常有用,來自http://www.get-digital-help.com/2009/03/16/unique-values-from-multiple-在get-digital.help.com上的columns-using-array- formula / Oscar甚至可以通過可視化的示例逐步完成。
1)給出標簽tbl_text的值范圍
2)在這種情況下,將以下數組公式用CTRL + SHIFT + ENTER應用於單元格B13。 更改$ B $ 12:B12以引用您輸入此公式的單元格上方的單元格。
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
3)復制/向下拖動直到你得到N / A.
如果將所有數據放在相同的列中並使用以下公式示例公式: =IF(C105=C104,"Duplicate","Not a Duplicate")
腳步
Not a Duplicate
示例公式: =IF(C105=C104,"Duplicate","Not a Duplicate")
我使用了totymedli的代碼,但發現它在使用大范圍時會出現問題(正如其他人指出的那樣),所以我對其代碼進行了優化。 如果有人有興趣使用VBScript獲取唯一值但是在更新時發現totymedli的代碼很慢,請嘗試:
Function listUnique(rng As Range) As Variant
Dim val As String
Dim elements() As String
Dim elementSize As Integer
Dim newElement As Boolean
Dim i As Integer
Dim distance As Integer
Dim allocationChunk As Integer
Dim uniqueSize As Integer
Dim r As Long
Dim lLastRow As Long
lLastRow = rng.End(xlDown).row
elementSize = 1
unqueSize = 0
distance = Range(Application.Caller.Address).row - rng.row
If distance <> 0 Then
If Cells(Range(Application.Caller.Address).row - 1, Range(Application.Caller.Address).Column).Value = "" Then
listUnique = ""
Exit Function
End If
End If
For r = 1 To lLastRow
val = rng.Cells(r)
If val <> "" Then
newElement = True
For i = 1 To elementSize - 1 Step 1
If elements(i - 1) = val Then
newElement = False
Exit For
End If
Next i
If newElement Then
uniqueSize = uniqueSize + 1
If uniqueSize >= elementSize Then
elementSize = elementSize * 2
ReDim Preserve elements(elementSize - 1)
End If
elements(uniqueSize - 1) = val
End If
End If
Next
If distance < uniqueSize Then
listUnique = elements(distance)
Else
listUnique = ""
End If
End Function
選擇具有重復值的列然后轉到數據選項卡,然后選擇數據工具選擇刪除重復選擇1)“繼續當前選擇”2)單擊刪除重復....按鈕3)單擊“全選”按鈕4)單擊好
現在你得到了唯一的價值表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.