Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅使用公式在Excel中获取唯一值_Excel_Excel Formula - Fatal编程技术网

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

仅使用公式在Excel中获取唯一值,excel,excel-formula,Excel,Excel Formula,您知道Excel中通过公式“计算”唯一值列表的方法吗 例如:垂直范围包含值“红色”,“蓝色”,“红色”,“绿色”,“蓝色”,“黑色” 因此,我希望有红色、蓝色、绿色、黑色以及另外两个空白单元格 我已经找到了一种使用小或大与索引相结合的方式来获得计算排序列表的方法,但我也希望使用这种计算排序,而不使用VBA。您可以使用COUNTIF来获得该范围内值的出现次数。因此,如果该值在A3中,则范围为A1:A6,然后在下一列中使用if(精确(COUNTIF(A3:$a6,A3),1),A3,“”。对于A4,

您知道Excel中通过公式“计算”唯一值列表的方法吗

例如:垂直范围包含值
“红色”
“蓝色”
“红色”
“绿色”
“蓝色”
“黑色”

因此,我希望有红色、蓝色、绿色、黑色以及另外两个空白单元格


我已经找到了一种使用小或大与索引相结合的方式来获得计算排序列表的方法,但我也希望使用这种计算排序,而不使用VBA。

您可以使用COUNTIF来获得该范围内值的出现次数。因此,如果该值在A3中,则范围为A1:A6,然后在下一列中使用if(精确(COUNTIF(A3:$a6,A3),1),A3,“”。对于A4,它将是IF(精确的(COUNTIF(A4:$a6,A3),1),A4,“”)


这将为您提供一个列,其中所有唯一值都没有任何重复值。好的,我有两个想法给您。希望其中一个可以帮助您找到需要的地方。请注意,第一个忽略了作为公式执行此操作的请求,因为该解决方案并不漂亮。我想我确定简单的方法确实不适合您;^)

使用高级过滤器命令
  • 选择列表(或者将您的选择放在列表中的任意位置,如果弹出对话框抱怨Excel不知道列表是否包含标题,请单击“确定”)
  • 选择数据/高级过滤器
  • 选择“就地筛选列表”或“复制到其他位置”
  • 单击“仅限唯一记录”
  • 单击“确定”
  • 完成。将在原地或新位置创建一个唯一列表。请注意,您可以记录此操作以创建一行VBA脚本来执行此操作,然后可以将其推广到其他情况下(例如,没有上面列出的手动步骤)。 使用公式(请注意,我正在构建无锁解决方案,以无孔列表结束) 此解决方案将使用以下注意事项:
  • 必须对列表进行排序(升序或降序无关紧要)。实际上,这非常准确,因为要求所有相似项必须是连续的,但排序是达到该状态的最简单方法。
  • 需要三个新列(两个新列用于计算,一个新列用于新列表)。第二列和第三列可以合并,但我将把它作为练习留给读者

    以下是解决方案的摘要:

  • 对于列表中的每个项目,计算其上方的重复项数。
  • 对于唯一列表中的每个位置,计算下一个唯一项的索引。
  • 最后,使用索引创建一个只包含唯一项的新列表。 下面是一个逐步的例子:

  • 打开一个新的电子表格
  • 在a1:a6中输入原始问题中给出的示例(“红色”、“蓝色”、“红色”、“绿色”、“蓝色”、“黑色”)
  • 对列表排序:将所选内容放入列表中,然后选择“排序”命令。
  • 在B列中,计算重复项:
  • 在B1中,输入“=IF(COUNTIF($A$1:A1,A1)=1,0,COUNTIF(A1:$A$6,A1))”。请注意,单元格引用中的“$”非常重要,因为它将使下一步(填充列的其余部分)更加容易。“$”表示绝对引用,以便在复制/粘贴单元格内容时,引用不会更新(与将更新的相对引用相反)。
  • 使用智能复制填充B列的其余部分:选择B1。将鼠标移到选择右下角的黑色正方形上。单击并向下拖动到列表底部(B6)。释放时,公式将复制到B2:B6中,并更新相关引用。
  • B1:B6的值现在应该是“0,0,1,0,0,1”。请注意,“1”项表示重复项。
  • 在C列中,创建唯一项的索引:
  • 在C1中,输入“=Row()”。实际上,您只需要C1=1,但使用Row()意味着即使列表不是从第1行开始,该解决方案也可以工作。
  • 在C2中,输入“=IF(C1+1我最近遇到了同样的问题,并最终解决了它

    使用您的列表,这里是一个从我的Excel粘贴公式

    我建议在列表中间的某个地方写这个公式,例如,在我的例子中的Cys< Cult> C6中,然后复制它并在它的上下粘贴,公式应该自动调整,而不需要重新键入它。 唯一具有唯一不同公式的单元格位于第一行

    使用您的列表(“红色”、“蓝色”、“红色”、“绿色”、“蓝色”、“黑色”);以下是结果: (我没有足够高的级别来发布图像,所以希望这个txt版本有意义)

    • [A栏:原始清单]
    • [列B:唯一列表结果]
    • [C列:唯一列表公式]

    • 红色,红色,
      =A3
    • 蓝色,蓝色,
      =IF(iError(匹配(A4,A$3:A3,0)),A4,“”
    • 红色,,
      =IF(iError(匹配(A5,A$3:A4,0)),A5,“”
    • 绿色,绿色,
      =IF(iError(匹配(A6,A$3:A5,0)),A6,“”
    • 蓝色,
      =IF(iError(匹配(A7,A$3:A6,0)),A7,“”
    • 黑色,黑色,
      =IF(iError(匹配(A8,A$3:A7,0)),A8,“”

    假设列A包含您要查找的单个唯一实例的值,并且有一个标题行,我使用以下公式。如果您希望它以不可预测的行数进行缩放,您可以将A772(我的数据结束处)替换为=地址(COUNTA(A:A),1)

    =如果(计数如果(A5:$772澳元,A5)=1,A5,”)

    这将在列中每个值的最后一个实例中显示唯一值,并且不进行任何排序
    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
    
    =IF(ISBLANK(A11);1;IF(COUNTIF($A$11:A11;A11)=1;0;COUNTIF($A11:A$1100;A11)))
    
    =MATCH(0;B11:B1100;0)
    
    =C11+MATCH(0;OFFSET($B$11:$B$1100;C11;0);0)
    
    =IFERROR(INDEX($A$11:$A$1100; C11); "")
    
    =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),"")
    
    IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-?),nUnique,0)),"")
    
    IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-4),nUnique,0)),"")
    
    =OFFSET($A$2,0,0,COUNTA($A:$A),1)
    
    =IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C$1:C1,Colors)),COUNTIF(Colors,"<"&Colors),0)),"")
    
    =SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
    
    =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))
    
        =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)
    
        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
    
    =IFERROR(INDEX($A$2:$A$7,MATCH(0,COUNTIF(B$1:$B1,$A$2:$A$7),0),1),"")
    
    =UNIQUE(A1:A6)
    
    =C1#
    
    =UNIQUE(A1:A6;;TRUE)