您知道Excel中通过公式“计算”唯一值列表的方法吗?
例如:一个垂直范围中包含的值"red"
,"blue"
,"red"
,"green"
,"blue"
,
,我想有作为的结果,,,+ 2,最终其他空白单元格。 "black"
"red
"blue"
"green"
"black"
我已经找到了一种将SMALL或LARGE与INDEX结合使用来获得计算出的排序列表的方法,但是我也希望在不使用VBA的情况下也具有这种计算出的排序列表。
您知道Excel中通过公式“计算”唯一值列表的方法吗?
例如:一个垂直范围中包含的值"red"
,"blue"
,"red"
,"green"
,"blue"
,
,我想有作为的结果,,,+ 2,最终其他空白单元格。 "black"
"red
"blue"
"green"
"black"
我已经找到了一种将SMALL或LARGE与INDEX结合使用来获得计算出的排序列表的方法,但是我也希望在不使用VBA的情况下也具有这种计算出的排序列表。
Answers:
这是一个老歌,有一些解决方法,但是我想出了一个更短,更简单的公式比我遇到的任何其他,这对路过的任何人都可能有用。
我已将颜色列表命名为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”;的说明 “蓝色”; “红”; “绿色”; “蓝色”; “黑色”}:
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
返回第k个排序值,通过计算所有的较小的值的出现已经存在(阵列#2的总和)。MATCH
查找第k个排序值的第一个索引(数组#1中的索引)。IFERROR
只隐藏#N/A
错误在底部的细胞,当排序的唯一列表是完整的。要知道您有多少个独特商品,可以使用以下常规公式:
=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
IF(ISBLANK(Colors), 0,1)
到#1数组和中来解决SUM()
。
C1
。标头不应与任何值匹配。筛选列表是一个不同的问题,具有不同的解决方案,因此可能要提出一个问题。如果您不需要对它进行排序,则可以使用这样的公式=IFERROR(INDEX(Colors,MATCH(0,COUNTIF(C$1:C1,Colors)+(Colors="blue"),0)),"")
。
好吧,我有两个主意给你。希望他们中的一员能带您到需要去的地方。请注意,第一个方法忽略了将其作为公式进行操作的请求,因为该解决方案并不理想。我认为我确定简单的方法确实对您不起作用; ^)。
此解决方案适用于以下警告:
以下是解决方案的摘要:
这是一个分步示例:
希望这可以帮助....
IF
仅当您选择较小范围时,步骤6.1中使用的才起作用。我用一种改进的算法做了一个新的答案,该算法不存在这些问题,不需要连续或排序的输入列表。
我在VBA中为您创建了一个函数,因此您现在可以轻松地做到这一点。
如您在本教程中所见,创建一个VBA代码模块(宏)。
Module
在Insert
。Excel Macro-Enabled
在Save 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
只需输入=listUnique(range)
一个单元格即可。唯一的参数是range
普通的Excel范围。例如:A$1:A$28
或H$8:H$30
。
range
必须是列。range
开始位置的同一行中。它适用于其中具有空单元格的列。同样,如果将单元格(调用该函数)置于不应该输出的地方,则该函数不会输出任何内容(不是错误),就像我在上一个示例的“ 2.增长”部分中所做的那样。
一种round回的方法是将Excel电子表格加载到Google电子表格中,使用Google的UNIQUE(range)函数-可以完全满足您的要求-然后将Google电子表格保存回Excel格式。
我承认这对于Excel用户来说不是一个可行的解决方案,但是这种方法对任何需要该功能并能够使用Google电子表格的人都是有用的。
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); "")
使用智能副本填充列。这是输出唯一列表。
您也可以这样做。
创建以下命名范围:
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)),"")
我最近遇到了同样的问题,终于解决了。
使用您的列表,这是我的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,"")
对于适用于多个行和列中的值的解决方案,我发现以下公式非常有用:http://www.get-digital-help.com/2009/03/16/unique-values-from-multiple- get-digital.help.com上的“使用数组公式的列” /“奥斯卡”甚至通过可视化的示例逐步进行了介绍。
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。
我使用了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
自2018年秋季以来,Microsoft Excel的订阅版本(Office 365 / Microsoft 365应用)包含所谓的动态数组功能(在Office 2016/2019非订阅版本中尚不可用)。
这些功能之一是UNIQUE
将为所选范围提供一组唯一值的功能。
例
在以下示例中,输入值在range内A1:A6
。该UNIQUE
函数被键入到cell中C1
。
=UNIQUE(A1:A6)
如您所见, UNIQUE
函数将自动溢出必要的单元格范围,以显示所有唯一值。这由周围的蓝色细框表示C1:C4
。
由于该UNIQUE
功能会自动溢出必要的行数,因此您应该在下方留出足够的空间C1
。如果没有足够的空间,则会出现#SPILL
错误。
如果要引用该UNIQUE
函数的结果,则可以仅引用包含该UNIQUE
函数的单元格并添加一个哈希#
符号。
=C1#
也可以在几列中检查唯一值。在这种情况下,UNIQUE函数将提供所有行,其中行内单元格的组合是唯一的:
如果要显示唯一列而不是唯一行,则必须将[by_col]
参数设置为TRUE
(默认为FALSE
,这意味着您将收到唯一行)。
您还可以通过将参数设置为来显示仅出现一次的值:[exactly_once]
TRUE
=UNIQUE(A1:A6;;TRUE)