仅使用公式在Excel中获取唯一值

Pat*_*rez 75 excel excel-formula

您是否知道在Excel中通过公式"计算"唯一值列表的方法?

例如:一个范围包含的值"red","blue","red","green","blue", ,我想有作为的结果,,,+ 2,最终其他空白单元格. "black"
"red"blue""green""black"

我已经找到了一种方法来使用SMALL或LARGE结合INDEX来获得计算出的排序列表,但是我想在不使用VBA的情况下进行这种计算排序.

Dre*_*man 53

好的,我有两个想法给你.希望他们中的一个能让你到达你需要去的地方.请注意,第一个忽略了作为公式执行此操作的请求,因为该解决方案并不漂亮.我想我确保简单的方法对你不起作用; ^).

使用"高级筛选"命令

  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的值现在应为"黑色","蓝色","绿色","红色","","".

    希望这可以帮助....


    deP*_*kin 29

    这是一个古老的,有一些解决方案,但我想出了一个比我遇到的任何其他更短更简单的公式,它可能对任何路过的人都有用.

    我已经命名了颜色列表Colors(A2:A7),并且放在单元格C2中数组公式是这个(固定的):

    =IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C$1:C1,Colors)),COUNTIF(Colors,"<"&Colors),0)),"")
    
    Run Code Online (Sandbox Code Playgroud)

    用于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返回第k个排序值,通过计算所有的较小的值的出现已经存在(的阵列#2之和).
    4. MATCH 找到第k个排序值的第一个索引(数组#1中的索引).
    5. IFERROR只隐藏的#N/A错误在底部细胞,排序唯一列表完成时.

    要了解您拥有多少独特物品,您可以使用以下常规公式:

    =SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
    
    Run Code Online (Sandbox Code Playgroud)


    tot*_*dli 22

    我为您在VBA中创建了一个函数,因此您现在可以轻松地完成此操作.
    本教程中所示,创建一个VBA代码模块(宏).

    1. Alt+F11
    2. 点击ModuleInsert.
    3. 粘贴代码.
    4. 如果Excel说,你的文件格式不超过宏保存为友好Excel Macro-EnabledSave As.

    源代码

    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
    
    Run Code Online (Sandbox Code Playgroud)

    用法

    只需进入=listUnique(range)一个单元格.唯一的参数是range普通的Excel范围.例如:A$1:A$28H$8:H$30.

    条件

    • range必须是列.
    • 调用该函数的第一个单元格必须位于range启动的同一行.

    例行情况

    1. 输入数据和通话功能.
      输入数据和通话功能
    2. 成长它.
      成长它
    3. 瞧.
      瞧

    空细胞盒

    它适用于包含空单元格的列.如果你将单元格(调用函数)覆盖到应该没有输出的位置,函数也不会输出任何内容(不是错误),就像我在上一个例子中的"2. Grow it"部分所做的那样.

    空细胞盒

    • 谢谢@totymedli.我的问题是关于在没有vba的情况下这样做. (4认同)

    yoy*_*oyo 17

    一种迂回的方式是将Excel电子表格加载到Google电子表格中,使用Google的UNIQUE(范围)功能 - 这完全符合您的要求 - 然后将Google电子表格保存回Excel格式.

    我承认这对Excel用户来说不是一个可行的解决方案,但这种方法对于任何想要该功能且能够使用Google电子表格的人都很有用.

    • UNIQUE*是一个公式,并像其他任何一样自动更新. (3认同)