我有一个数据表,我想要计算列中所有出现的单词。但该列可以包含以逗号分隔的多个单词。
False Negative
False Negative, False Positive
这是一个例子。结果列只能包含以下表达式:
False Negative
False Positive
Positive
所以我想要一个基于上面例子的结果列:
False Negative 2
False Positive 1
这样我可以根据值制作图表。
我不擅长Excel,但我知道如何输入表达式而不是如何编写逻辑。
由于
修改
我不希望短语“误报”在“正面”上计算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