簡體   English   中英

僅使用公式在Excel中獲取唯一值

[英]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的情況下進行這種計算排序。

好的,我有兩個想法給你。 希望他們中的一個能讓你到達你需要去的地方。 請注意,第一個忽略了作為公式執行此操作的請求,因為該解決方案並不漂亮。 我想我確保簡單的方法對你不起作用; ^)。

使用“高級篩選”命令

  1. 選擇列表(或將您的選擇放在列表中的任何位置,如果對話框出現抱怨Excel不知道您的列表是否包含標題,請單擊“確定”)
  2. 選擇數據/高級過濾器
  3. 選擇“過濾列表,就地”或“復制到其他位置”
  4. 點擊“僅限唯一記錄”
  5. 點擊確定
  6. 你完成了。 將在原地或新位置創建唯一列表。 請注意,您可以記錄此操作以創建一行VBA腳本來執行此操作,然后可以將其推廣到其他情況下(例如,沒有上面列出的手動步驟)。

使用公式(請注意,我正在使用Locksfree解決方案,最終得到一個沒有洞的列表)

此解決方案將適用於以下警告:

  • 必須對列表進行排序(升序或降序無關緊要)。 實際上這是非常准確的,因為要求實際上所有類似的項目必須是連續的,但排序是達到該狀態的最簡單方法。
  • 需要三個新列(兩個用於計算的新列和一個用於新列表的新列)。 第二和第三列可以組合,但我會將其作為練習留給讀者。

    以下是解決方案的摘要:

    1. 對於列表中的每個項目,計算其上方的重復項數。
    2. 對於唯一列表中的每個位置,計算下一個唯一項的索引。
    3. 最后,使用索引創建僅包含唯一項的新列表。

    這是一個循序漸進的例子:

    1. 打開一個新的電子表格
    2. 在a1:a6中輸入原始問題中給出的示例(“紅色”,“藍色”,“紅色”,“綠色”,“藍色”,“黑色”)
    3. 對列表進行排序:將選擇放在列表中,然后選擇排序命令。
    4. 在B列中,計算重復項:
      1. 在B1中,輸入“= IF(COUNTIF($ A $ 1:A1,A1)= 1,0,COUNTIF(A1:$ A $ 6,A1))”。 請注意,單元格引用中的“$”非常重要,因為它將使下一步(填充列的其余部分)變得更加容易。 “$”表示絕對引用,因此當復制/粘貼單元格內容時,引用將不會更新(與將更新的相對引用相對)。
      2. 使用智能副本填充B列的其余部分:選擇B1。 將鼠標移到選區右下角的黑色方塊上。 單擊並向下拖動到列表底部(B6)。 當您發布時,公式將被復制到B2:B6並更新相對引用。
      3. B1:B6的值現在應為“0,0,1,0,0,1”。 請注意,“1”條目表示重復。
    5. 在C列中,創建唯一項的索引:
      1. 在C1中,輸入“= Row()”。 你真的只想要C1 = 1但是使用Row()意味着即使列表沒有從第1行開始,這個解決方案也能正常工作。
      2. 在C2中,輸入“= IF(C1 + 1 <= ROW($ B $ 6),C1 + 1 + INDEX($ B $ 1:$ B $ 6,C1 + 1),C1 + 1)”。 當索引到達列表末尾時,“if”用於停止生成#REF。
      3. 使用智能副本填充C3:C6。
      4. C1:C6的值應為“1,2,4,5,7,8”
    6. 在D列中,創建新的唯一列表:
      1. 在D1中,輸入“= IF(C1 <= ROW($ A $ 6),INDEX($ A $ 1:$ A $ 6,C1),”“)”。 並且,當索引超出列表末尾時,“if”用於停止#REF情況。
      2. 使用智能副本填充D2:D6。
      3. D1:D6的值現在應為“黑色”,“藍色”,“綠色”,“紅色”,“”,“”。

    希望這可以幫助....

  • 這是一個老人,有一些解決方案,但我提出了一個比我遇到的任何其他更短更簡單的公式 ,它可能對任何路過的人都有用。

    我已經命名了顏色列表Colors (A2:A7),並且放在單元格C2中數組公式是這個( 固定 ):

    =IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C$1:C1,Colors)),COUNTIF(Colors,"<"&Colors),0)),"")
    

    使用Ctrl+Shift+EnterC2中輸入公式,然后將C2復制到C3:C7

    樣本數據說明{“紅色”; “藍色”; “紅色”; “綠色”; “藍色”; “黑色”}:

    1. COUNTIF(Colors,"<"&Colors)返回一個數組(#1),其數值小於數據{4; 1; 4; 3; 1; 0}中的每個項目(黑色= 0項更小,藍色= 1項,紅色= 4項)。 這可以轉換為每個項目的排序值
    2. 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}中,它表示“黑色”,並且所有出現的“藍色”已經存在。
    3. SUM通過計算已存在的所有較小值的出現次數(數組#2的總和)來返回第k個排序值。
    4. MATCH找到第k個排序值的第一個索引(數組#1中的索引)。
    5. 當排序的唯一列表完成時, IFERROR僅隱藏底部單元格中的IFERROR #N/A錯誤。

    要了解您擁有多少獨特物品,您可以使用以下常規公式

    =SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
    

    我為您在VBA中創建了一個函數,因此您現在可以輕松地完成此操作。
    本教程中所示,創建一個VBA代碼模塊(宏)。

    1. Alt + F11
    2. 單擊Insert Module
    3. 粘貼代碼。
    4. 如果Excel表示您的文件格式不是宏友好的,則將其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$28H$8:H$30

    條件

    • range必須是列。
    • 調用函數的第一個單元格必須位於range開始的同一行中。

    例行情況

    1. 輸入數據和通話功能。
      輸入數據和通話功能
    2. 成長它。
      成長它
    3. 瞧。
      瞧

    空細胞盒

    它適用於包含空單元格的列。 如果你將單元格(調用函數)覆蓋到應該沒有輸出的位置,函數也不會輸出任何內容(不是錯誤),就像我在上一個例子中的“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

    B2單元格中嘗試此公式

    =IFERROR(INDEX($A$2:$A$7,MATCH(0,COUNTIF(B$1:$B1,$A$2:$A$7),0),1),"")
    

    單擊F2並按Ctrl + Shift + Enter

    在此輸入圖像描述

    您可以使用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)
    

    然后創建一個數據透視表,使源成為您的命名范圍。

    只需將標題放入行部分,您將擁有唯一值,您可以使用內置功能對任何方式進行排序。

    使用數據透視表可能不算只使用公式,但到目前為止大多數其他建議似乎更實用:

    SO1429899的例子

    我最近遇到了同樣的問題,終於搞清楚了。

    使用您的列表,這里是我的Excel與公式的粘貼。

    我建議在列表中間的某個位置編寫公式,例如,在我的示例的單元格C6中,然后將其復制並將其粘貼到列中,公式應自動調整,而無需重新鍵入。

    具有唯一不同公式的唯一單元格位於第一行。

    使用你的清單(“紅色”,“藍色”,“紅色”,“綠色”,“藍色”,“黑色”); 結果如下:( 我沒有足夠高的級別來發布圖像,所以希望這個txt版本有意義

    • [A欄:原始清單]
    • [B欄:唯一清單結果]
    • [C列:唯一列表公式]

      1. 紅色,紅色, =A3
      2. 藍色,藍色, =IF(ISERROR(MATCH(A4,A$3:A3,0)),A4,"")
      3. red ,, =IF(ISERROR(MATCH(A5,A$3:A4,0)),A5,"")
      4. 綠色,綠色, =IF(ISERROR(MATCH(A6,A$3:A5,0)),A6,"")
      5. blue ,, =IF(ISERROR(MATCH(A7,A$3:A6,0)),A7,"")
      6. 黑色,黑色, =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")

    腳步

    1. 對數據進行排序
    2. 添加公式列
    3. 檢查單元格是否等於其上方的單元格
    4. 然后過濾Not a Duplicate
    5. 可選:復制公式列計算的數據並僅粘貼為值(如果您開始刪除數據,則不會開始出錯)
    6. 注意/警告:這僅在您首先對數據進行排序時才有效

    示例公式: =IF(C105=C104,"Duplicate","Not a Duplicate")

    優化的VBScript解決方案

    我使用了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.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM