簡體   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