繁体   English   中英

Excel - 在多个工作表/同一列中使用 COUNTIF/COUNTIFS

[英]Excel - Using COUNTIF/COUNTIFS across multiple sheets/same column

我正在尝试跨多个工作表“计算”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的误用,因为我在应该是 35 时得到0

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

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

在这个例子中,我计算Page M904Page M905Page M906 A:A范围内的所有三 (3)。

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

在此处输入图片说明

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

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

我试图避免使用 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)


PS如果你想排除一些工作表,你可以添加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

更新:

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

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 我很快就编译好了。 用法:正常选择 3D 范围并用引号括起来,如下所示...

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

建议表相邻以避免意外结果。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM