【问题标题】:Count If A or B but with no doublecountingCountif A 或 B 但没有重复计算
【发布时间】:2017-01-20 18:44:29
【问题描述】:

我有一组单元格,其中包含指示各种语句的字符串。如果它具有(例如)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)。 CountIfs 会错误地给出 0。CountIf + CountIf 会错误地给出 3。

【问题讨论】:

  • 您的输入和预期结果的示例会有所帮助。
  • 编辑了它,底部有一个例子。

标签: excel vba


【解决方案1】:

你想要这样的东西:

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),它将扩展到.(ABC)+(ABD)+(ABQ) - (ABC & ABD)-(ABC & ABQ)-(ABD & ABQ)-(ABC & ABD & ABQ).
  • @EmilyAlden 如果这是您解决问题的方法,请单击答案旁边的复选标记标记为正确
【解决方案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

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2011-10-20
    • 2017-04-06
    • 2013-07-12
    相关资源
    最近更新 更多