Excel - 计算行和逗号分隔单元格中的出现次数

时间:2014-04-13 11:50:18

标签: excel expression

我有一个数据表,我想要计算列中所有出现的单词。但该列可以包含以逗号分隔的多个单词。

False Negative
False Negative, False Positive

这是一个例子。结果列只能包含以下表达式:

False Negative
False Positive
Positive

所以我想要一个基于上面例子的结果列:

False Negative 2
False Positive 1

这样我可以根据值制作图表。

我不擅长Excel,但我知道如何输入表达式而不是如何编写逻辑。

由于

修改

我不希望短语“误报”在“正面”上计算1。它需要查找逗号。

1 个答案:

答案 0 :(得分:2)

从您的示例中,您似乎想要计算数据中某些短语的出现次数,而不仅仅是单词。如果是这种情况,并且短语是非排他性的,则以下公式可能有效:

Rng是列的范围,例如$ A $ 1:$ A $ 100 G1包含感兴趣的短语,例如误报

=SUMPRODUCT((LEN(Rng)-LEN(SUBSTITUTE(Rng,G1,"")))/LEN(G1))

并根据需要填写。

请注意,上面的"正"的数量将计为2,因为"正"是误报的一部分。如果你想要不同的东西,你需要告诉我们你想要的东西。

编辑由于您现在指示您想要将False Positive计为Positive的实例,我将提供用户定义函数,该函数会检查以确保有问题的短语以逗号分隔。

要输入此用户定义函数(UDF), alt-F11 将打开Visual Basic编辑器。 确保在Project Explorer窗口中突出显示您的项目。 然后,从顶部菜单中选择“插入/模块” 将下面的代码粘贴到打开的窗口中。

要使用此用户定义函数(UDF),请输入类似

的公式
=FindPhrase(Rng,G1)

在某个单元格中。

Option Explicit
Function FindPhrase(SearchRange As Range, Phrase As String) As Long
    Dim RE As Object, MC As Object
    Dim sPat As String
    Dim V As Variant
    Dim I As Long, J As Long

V = SearchRange

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .ignorecase = True
    .Pattern = "(?:^|,\s*)" & Phrase & "(?:\s*,|$)"
End With

For I = 1 To UBound(V, 1)
    If RE.test(V(I, 1)) Then J = J + 1
Next I

FindPhrase = J

End Function

EDIT2 如果每个单元格中可以有多个短语实例,并且您想要单独计算它们,那么,在上面,更改

.Pattern = "(?:^|,\s*)Positive(?=(?:\s*,|$))"

或使用以下不同的UDF(也可以很容易地适应只计算单个实例,并且运行速度可能比第一个快):

Option Explicit
Function FindPhrase2(SearchRange As Range, Phrase As String) As Long
    Dim V As Variant
    Dim I As Long, J As Long, K As Long
    Dim aStrings As Variant

V = SearchRange
For I = 1 To UBound(V)
    aStrings = Split(V(I, 1), ",")
        If IsArray(aStrings) Then
            For J = 0 To UBound(aStrings)
                If Trim(aStrings(J)) = Trim(Phrase) Then K = K + 1
            Next J
        Else
            If Trim(aStrings) = Trim(Phrase) Then K = K + 1
        End If
Next I

FindPhrase2 = K

End Function