【问题标题】:Excel - Using COUNTIF/COUNTIFS across multiple sheets/same columnExcel - 在多个工作表/同一列中使用 COUNTIF/COUNTIFS
【发布时间】:2019-11-17 08:07:28
【问题描述】:

我正在尝试跨多个工作表“计数”I 列(在本例中)中某个对象的数量。第 I 列中的值是公式的结果(如果重要)。到目前为止,我有:

=COUNTIF('Page M904'!I:I,A13)+COUNTIF('Page M905'!I:I,A13)+COUNTIF('Page M906'!I:I,A13)

这行得通,但我要扫描 20 页内容。我想避免有一个页面长的公式。

我试过了

=COUNTIFS('Page M904:Page M906'!I:I,A13)=COUNTIF('Page M904:Page M906'!I:I,A13)

但这会导致#VALUE

我认为

=COUNTIFS('Page M904'!I:I,A14,'Page M905'!I:I,A14,'Page M906'!I:I,A14)

是对COUNTIFS 的误用,因为我得到0 应该是35。

我试图避免在此应用程序中使用 VBA。但如果必须,那就必须 :) 提前感谢您的时间和帮助。

【问题讨论】:

  • 'Page M904:Page M906'!I:I - 很好的尝试,但不幸的是 Countif 不支持 3-D 参考..
  • I am trying to avoid using VBA. But if has to be, then it has to be:) - 你可以为此编写非常简单的用户定义函数。
  • =COUNTIFS('Page M904'!I:I,A14,'Page M905'!I:I,A14,'Page M906'!I:I,A14) 返回 0,因为在该措辞中它变为 IF...AND,而不是您想要的 IF...OR
  • 谢谢大家。 UDF 对我来说实际上是新的,但 20 年后我仍然是一个菜鸟;)这里的每个人都对初学者级问题的洞察力和容忍度都很棒:D
  • 您可以通过命名这些工作表的列来稍微简化公式。对 Page M904 的列 IM904i。所以'Page M904'!I:I 变成了M904i。但仍然有 20 多个这样的命名。

标签: excel vba


【解决方案1】:

这可以通过以下技术在没有 VBA 的情况下解决。

在此示例中,我计算了 A:A 范围内的所有三 (3),表 Page M904Page M905Page M906

在单个连续范围内列出所有工作表名称,如下例所示。这里列出在D3:D5 范围内。

然后通过在单元格B2 中查找值,可以使用以下公式在单元格B4 中找到结果:

=SUMPRODUCT(COUNTIF(INDIRECT("'"&D3:D5&"'!A:A"), B2))

【讨论】:

  • 感谢 Søren,但我将使用 VBA/UDF 方法。我不知道 UDF,但现在我知道了,而且看起来更简单了。我绝对感谢您的帮助。 :D
【解决方案2】:

我试图避免使用 VBA。 但如果必须是,那么它必须是:)

有一个非常简单的 UDF:

Function myCountIf(rng As Range, criteria) As Long
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        myCountIf = myCountIf + WorksheetFunction.CountIf(ws.Range(rng.Address), criteria)
    Next ws
End Function

并这样称呼它:=myCountIf(I:I,A13)


附:如果您想排除某些工作表,可以添加If 声明:

Function myCountIf(rng As Range, criteria) As Long
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        If ws.name <> "Sheet1" And ws.name <> "Sheet2" Then
            myCountIf = myCountIf + WorksheetFunction.CountIf(ws.Range(rng.Address), criteria)
        End If
    Next ws
End Function

UPD:

我有四张“参考”表需要排除在扫描/搜索之外。他们目前是工作簿中的最后四个

Function myCountIf(rng As Range, criteria) As Long
    Dim i As Integer

    For i = 1 To ThisWorkbook.Worksheets.Count - 4
        myCountIf = myCountIf + WorksheetFunction.CountIf(ThisWorkbook.Worksheets(i).Range(rng.Address), criteria)
    Next i
End Function

【讨论】:

  • 我有四个“参考”表,我需要将它们排除在扫描/搜索之外。它们目前是工作簿中的最后四个,并将保留在该位置。可以更改该代码以排除这四张纸吗?
  • 愚蠢的问题......我如何让 UDF 工作。我收到#NAME? 错误。宏已启用。
  • 您应该创建新模块并将 UDF 放入其中。如何创建模块见此图:webum.by/images/blog/2013/05/excel-vba-access-bd/…
  • 我的第一反应是“你说的这个‘模块’是什么?”但我看到了图片,跟着它工作了!非常感谢和回应。
【解决方案3】:

我的第一篇文章... UDF 我设法快速编译。 用法: 正常选择 3D 范围并将其括在引号中,如下所示...

=CountIf3D("'StartSheet:EndSheet'!G16:G878";"Criteria")

建议将工作表相邻,以避免意外结果。

Public Function CountIf3D(SheetstoCount As String, CriteriaToUse As Variant)

     Dim sStarSheet As String, sEndSheet As String, sAddress As String
     Dim lColonPos As Long, lExclaPos As Long, cnt As Long

    lColonPos = InStr(SheetstoCount, ":") 'Finding ':' separating sheets
    lExclaPos = InStr(SheetstoCount, "!") 'Finding '!' separating address from the sheets

    sStarSheet = Mid(SheetstoCount, 2, lColonPos - 2) 'Getting first sheet's name
    sEndSheet = Mid(SheetstoCount, lColonPos + 1, lExclaPos - lColonPos - 2) 'Getting last sheet's name

    sAddress = Mid(SheetstoCount, lExclaPos + 1, Len(SheetstoCount) - lExclaPos) 'Getting address

        cnt = 0
   For i = Sheets(sStarSheet).Index To Sheets(sEndSheet).Index
        cnt = cnt + Application.CountIf(Sheets(i).Range(sAddress), CriteriaToUse)
   Next

   CountIf3D = cnt

End Function

【讨论】:

    【解决方案4】:

    我想做同样的事情,我有一个解决方法,使用频率和索引函数似乎不那么复杂。我使用这部分函数来对多张纸进行平均,同时排除所有的 0。

    =(FREQUENCY(Start:End!B1,-0.000001)+INDEX(FREQUENCY(Start:End!B1,0),2))
    

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多