我有一组单元格,其中包含表示各种语句的字符串。如果它具有(例如)ABC,ABD或ABQ,我需要它来唯一地计数单元格,但是一个单元格可以读取" ABC ABD AMN"而这只需要计算一次。订单不标准。
在查看时我只发现使用" CountIf(ABC)+ CountIf(ABD)+ CountIf(ABQ)的建议,但这会使多个单元格重复计算。
然后,CountIfs(ABC,ABD,ABQ)仅计算包含所有这些的单元格。我可以使用什么方法来唯一地计算细胞而不进行重复计算?
Set j = .Range(Cells(s, 8), Cells(e, 8))
.Cells(s - 1, 8).Value = Application.WroksheetFunction.CountIfs(j, "* ABC*", j, "*ABD*", j, "*ABQ*")
所以输入单元格可能是
[ACD AQM AFD ABD]
[ABM ARQ ABQ ABC]
[AAA ABE ARQ]
并且输出将是2.因为两个单元格中至少有一个所需的短语(ABC,ABD,ABQ)。 CountIf会错误地给出0. CountIf + CountIf会错误地给出3。
答案 0 :(得分:2)
你想要这样的东西:
Set j = .Range(.Cells(s, 8), .Cells(e, 8))
With Application.WorksheetFunction
.Cells(s - 1, 8).Value = .COUNTIF(j,"*ABC*") + .COUNTIF(j,"*ABD*") - .COUNTIFS(j,"*ABC*",j,"*ABD*")
End With
答案 1 :(得分:2)
这样的事情会做到这一点,如果你正在使用非常大的数据列,可能需要进行优化。我们的想法是针对每个ABC,ABD或ABQ检查每个单元格,如果在单元格中找到匹配值,则提前退出循环。这样可以防止对可能在多个标准上匹配的单元格进行重复计算。
Option Explicit
Sub foo()
Dim rng As Range
Dim i As Long
Dim word, words, val, vals
words = CountedWords
Set rng = Range("A1:A3") 'Modify as needed
vals = Application.Transpose(rng.Value)
For Each val In vals
For Each word In words
If InStr(val, word) Then
i = i + 1
Exit For
End If
Next
Next
MsgBox i
End Sub
Function CountedWords()
CountedWords = Array("ABC", "ABD", "ABQ") 'Modify as needed
End Function