2

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

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

考虑数据:

A B C D A B E C

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

1 2 3 4 1 2 7 3

到现在为止还挺好。我不明白 FREQUENCY 函数在这里是如何工作的,特别是它如何处理被复制的 bin(例如 bin 1 在上述数据中被复制)。频率函数的结果是:

2 2 2 1 0 0 1 0 0

谢谢

塔拉斯

4

2 回答 2

2

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

FREQUENCY 正在搜索数组中从您的 bin 中搜索条目。这是它的工作原理:

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

垃圾箱: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 的数量,那么您应该得到不同字符串的数量。

于 2009-09-15T06:19:59.797 回答
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

如果您需要显示独特的结果,您可以遍历集合并将值写在工作表上。

于 2009-09-15T08:28:51.813 回答