计算excel中的不同值 - 频率函数

时间:2009-09-15 05:32:01

标签: excel-vba excel-formula vba excel

我的任务是计算excel中列中不同字符串的数量。之后的Google快速搜索产生了here的以下公式:

= SUM(IF(频率(匹配(B2:B10,B2:B10,0),匹配(B2:B10,B2:B10,0))> 0,1))

考虑数据:

一个 乙 C d 一个 乙 Ë ç

现在,match函数将返回一个数组(因为第一个参数是一个数组):

1 2 3 4 1 2 7 3

到目前为止一切顺利。我不明白的是FREQUENCY函数在这里是如何工作的,特别是它如何处理复制的bin(例如bin 1在上面的数据中被复制)。频率函数的结果是:

2 2 2 1 0 0 1 0 0

由于

塔拉斯

2 个答案:

答案 0 :(得分:2)

编辑:我意识到您的解决方案是如何运作的 - 经过修改以反映这一点。

FREQUENCY正在搜索搜索阵列中您的分档中的条目。以下是它的工作原理:

搜索数组:1 2 3 4 1 2 7 3

Bins:1 2 3 4 1 2 7 3

Bin 1 =>有两个1 = => 2

Bin 2 =>有两个2'=> 2

Bin 3 =>有两个3 = => 2

Bin 4 =>有一个4 => 1

Bin 1重复=> 1已经计数=> 0

Bin 2重复=> 2已经计数=> 0

Bin 7 =>有一个7 => 1

Bin 3重复=> 3已经计数=> 0

似乎解决方案似乎正在利用FREQUENCY怪癖,也就是说,它不会对同一个bin进行两次计数,因为可能期望值为1的第二个bin为非零同样。但这就是它的工作原理 - 因为它只计算第一个bin的出现次数而不是重复的bin,值大于零的行数将为你提供不同的条目数。

这是您可能会觉得有用的替代方法。它可用于计算不同值的数量:

假设你的字符串范围是B2:B10。填写另一栏

=(MATCH(B2,B$2:B2,1)-(ROW(B2)-ROW(B$2)))>0

该行应在您向下复制时更改,因此第二行应为:

=(MATCH(B3,B$2:B3,1)-(ROW(B3)-ROW(B$2)))>0

如果当前行包含字符串的第一个实例(如果你给它几分钟,你应该能够解决它正在做的事情),那么这就是TRUE。因此,如果您使用COUNTIF()计算TRUE的数量,那么您应该获得不同字符串的数量。

答案 1 :(得分:0)

您可以使用vba例程:

Sub Uniques()

    Dim rng As Range
    Dim c As Range
    Dim clnUnique As New Collection

    Set rng = Range("A1:A8")

    On Error Resume Next
    For Each c In rng
        clnUnique.Add c.Value, CStr(c.Value)
    Next c
    On Error GoTo 0

    MsgBox "Number of unique values = " & clnUnique.Count

End Sub

如果您需要显示唯一结果,您可以循环访问该集合并在工作表上写入值。