如何求各编号对应的值中,非重复值的数量?果果大佬高阶技巧处女秀

职领office达人学院第817个原创技巧
职领office达人学院社群里有小伙伴提到这样一个问题:求各编号对应的值中,非重复值的数量?
这道题的解法有很多,可以用powerquery,也可以用powerpivot的非重计数,但是小伙伴说希望用函数解决,除了使用复杂数组公式的方法外,还可以用以下两种方法解决:
  1.COUNT+UNIQUE+FILTER函数嵌套  
公式如下:
E2=COUNT(UNIQUE(FILTER($B$2:$B$15,$A$2:$A$15=D2)))
公式含义:
(1)FILTER($B$2:$B$15,$A$2:$A$15=D2)用于筛选,筛选条件为第二个参数$A$2:$A$15=D2,筛选结果为A2:A8,返回的结果为第一个参数$B$2:$B$15中对应的单元格区域的值,即B2:B8的值{1,1,1,2,1,3,4}
(2)UNIQUE用于对B2:B8单元格的值去重,去重结果为{1,2,3,4}
(3)COUNT用于对{1,2,3,4}计数,结果为4
该公式的逻辑思路比较清晰,先根据条件进行匹配筛选,然后去重,最后计数,但由于UNIQUE和FILTER是只有在Office365预览体验版中才可以使用的函数,较低版本无法享受这项福利,所以还可以使用下面的第二种方法。
  2.VBA自定义函数  

(1)思路:将单元格区域的值,通过参数传递给变量,通过条件筛选和字典功能,进行非重计数。
(2)代码和注释:

'定义函数名为“非重计数”,定义函数有两个参数,分别为x和y,其中x表示要匹配的单元格,本例中x为D2单元格,y表示一个两列的区域,其中第一列负责和x进行匹配,第二列进行非重计数,本例中y为$A$2:$B$15单元格区域

Public Function非重计数(x As Range,y As Range)

'声明数组arry和zd(名称随便起的,arry是数组类型,用来装y的值,zd是字典的首字母)

Dim arry(),zd

'将参数y所表示的单元格区域$A$2:$B$15的值赋给二维数组arry

arry=y

'定义字典的固定语句

Set zd=CreateObject("Scripting.Dictionary")

'使用for循环遍历匹配,UBound(arry)表示arry长度,即14

For i=1 To UBound(arry)

'如果数组arry的第一列(即A列的单元格)的值和D2单元格的值相同,那么

If arry(i,1)=x.Value Then

'字典赋值,赋值过程为zd("1")="",zd("1")="",zd("1")="",zd("2")="",zd("1")="",zd("3")="",zd("4")="",结果是给1,2,3,4这四个名称赋了值,即zd下面名称的数量为4

zd(arry(i,2))=""

End If

Next

'将zd的名称数量返回,作为函数的运算结果

非重计数=zd.Count

End Function

(3)代码使用方法:
(0)

相关推荐