![](/img/trans.png)
[英]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.