你知道在Excel中通过公式计算出唯一值列表的方法吗?
例如:一个垂直范围包含值"red"
、"blue"
、"red"
、"green"
、"blue"
、"black"
,我希望结果是"red"
、"blue"
、"green"
、"black"
+最多2个空单元格。
我已经找到了使用SMALL或LARGE结合INDEX获取计算排序列表的方法,但我也想要这个计算排序列表而不使用VBA。
你知道在Excel中通过公式计算出唯一值列表的方法吗?
例如:一个垂直范围包含值"red"
、"blue"
、"red"
、"green"
、"blue"
、"black"
,我希望结果是"red"
、"blue"
、"green"
、"black"
+最多2个空单元格。
我已经找到了使用SMALL或LARGE结合INDEX获取计算排序列表的方法,但我也想要这个计算排序列表而不使用VBA。
好的,我有两个想法。希望其中一个能帮助到你。请注意,第一个想法忽略了将此作为公式解决的请求,因为该解决方案不太美观。我想确保简单的方法真的对你行不通;)。
以下解决方案会有以下注意事项:
以下是解决方案的概述:
以下是逐步示例:
IF
仅在选择紧密范围时有效。我用一个改进的算法做出了新的答案,它没有这些问题,也不需要连续或排序的输入列表。 - ReneSac这是一个老问题,已经有一些解决方案了。但我想出了比我遇到的其他任何解决方案都要简短和简单的公式,对路过的任何人都可能有用。
我将颜色列表命名为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。
带有样本数据{"red"; "blue"; "red"; "green"; "blue"; "black"}的解释:
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},因为“黑色”是排序中的第一个并且在数据中排名最后。在C4中返回{0; 1; 0; 0; 1; 1},它表示“黑色”和所有“蓝色”的出现次数均已存在。SUM
通过计算已经存在的所有较小值的出现次数之和(数组#2的总和),返回第k个排序值。MATCH
找到第k个排序值的第一个索引(数组#1中的索引)。IFERROR
仅用于隐藏底部单元格中的#N/A
错误,当排序后的唯一列表完成时会出现此错误。要知道您有多少个唯一项,可以使用此常规公式:
=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
SUM()
中添加IF(ISBLANK(Colors), 0,1)
来解决。 - AviDC1
中将“A”作为列标题写入。标题不应与任何值匹配。
过滤列表是一个不同的问题,有不同的解决方案,所以也许可以提出一个问题来解决它。如果您不需要排序,可以使用这个公式:=IFERROR(INDEX(Colors,MATCH(0,COUNTIF(C$1:C1,Colors)+(Colors="blue"),0)),"")
。 - dePatinkin我已经为您创建了一个VBA函数,因此现在您可以轻松完成此操作。
按照这个教程所示,创建一个VBA代码模块(宏)。
Insert
中的 Module
.另存为
中选择 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.增加数据”部分所做的那样。
一种迂回的方法是将您的Excel电子表格加载到Google电子表格中,使用Google的UNIQUE(range)函数 - 此函数正好可以实现您想要的功能 - 然后将Google电子表格保存为Excel格式。
我承认这不是Excel用户可行的解决方案,但对于任何想要此功能且能够使用Google电子表格的人来说,这种方法都是有用的。
注意这是一个非常老的问题,但似乎人们仍然难以使用提取唯一项的公式。
以下是一种返回值本身的解决方案。
假设您在A2:A7列中有"red"、"blue"、"red"、"green"、"blue"、"black",那么将以下内容作为数组公式放入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
中的公式
这是一个数组公式
=IF(COUNTIF(A5:$A$772,A5)=1,A5,"")
这将显示该列中每个值的最后一个实例的唯一值,并且不假定任何排序。它利用缺少绝对值来基本上具有递减的“滑动窗口”数据进行计数。当在缩小的窗口中的countif等于1时,那一行就是该值在该列中的最后一个实例。