计算如果A或B但没有双重计数

时间:2017-01-20 18:44:30

标签: excel excel-vba vba

我有一组单元格,其中包含表示各种语句的字符串。如果它具有(例如)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。

2 个答案:

答案 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