计数如果A或B但没有加倍计数

我有一组单元格,它们有指示各种语句的string。 如果它有(例如)ABC,ABD或ABQ,我需要它对这些单元格进行唯一的计数,但是一个单元格可以读取“ABC ABD AMN”,并且只需要计数一次。 订单不标准。

当我看到我只发现build议使用“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*") 

所以input单元可能是

  [ACD AQM AFD ABD] [ABM ARQ ABQ ABC] [AAA ABE ARQ] 

输出将是2.因为两个单元格至less有一个必要的短语(ABC,ABD,ABQ)。 CountIfs会错误地给出0. CountIf + CountIf会错误地给3。

你想要这样的东西:

 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 

像这样的事情会做到这一点,如果你正在处理非常大的数据列,可能需要优化。 这个想法是针对ABC,ABD或ABQ中的每一个检查每个单元格,如果在单元格中find匹配的值,则提前退出循环。 这应该防止对可能符合多个条件的单元格进行重复计数。

 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