[英]Excel - Using COUNTIFS to count dates within a certain range across multiple sheets
[英]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 M904
、 Page M905
和Page 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.