簡體   English   中英

使用多個條件對唯一值求和

[英]Sum unique values with multiple criteria

在此輸入圖像描述

你好,
我需要一個等效公式來根據某些標准對唯一值求和。 我想要的結果是在E欄。 有兩個標准(第一列在D列,第二列, B列必須">10"

現在我使用這個公式: {=SUM(IF(FREQUENCY(IF($A$2:$A$10=D2,IF($B$2:$B$10>10,MATCH($B$2:$B$10,$B$2:$B$10,0))),ROW($B$2:$B$10)-ROW($B$2)+1),$B$2:$B$10))}

這個公式的問題在於它無法在VBA使用FormulaArray進行設置。我明白我可以使用evaluate來提取結果,但我想要的是在E列的每個單元格上都有一個公式,可以計算出正確的。

謝謝 !

在我找到一個可行的方法之前,我不得不嘗試幾種方法,但我已經弄清楚了。

將這些功能粘貼到模塊中:

Public Function SumIfIf(rgeData As Range, matchCriteria As String, numCompCriteria As String) As Double

    Dim c As Range, arr_Distinct() As String, x As Long, totalOut As Double, str_ConcatRgeRow As String
    ReDim arr_Distinct(0)

    totalOut = 0
    If InStr("<>=", Left(numCompCriteria, 1)) = 0 Then numCompCriteria = "=" & numCompCriteria

    For Each c In rgeData.Columns(1).Cells
        str_ConcatRgeRow = c.Value & c.Offset(0, rgeData.Columns.Count - 1).Value
        If Not IsInArray(arr_Distinct, str_ConcatRgeRow) Then
            ReDim Preserve arr_Distinct(UBound(arr_Distinct) + 1)
            arr_Distinct(UBound(arr_Distinct)) = str_ConcatRgeRow
            If Evaluate(c.Value = matchCriteria) And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & numCompCriteria & ")") Then
                totalOut = totalOut + c.Offset(0, rgeData.Columns.Count - 1).Value
            End If
        End If
    Next c

    SumIfIf = totalOut

End Function

Function IsInArray(arrToCheck As Variant, valToFind As Variant) As Boolean
    Dim x As Long
    IsInArray = False
    For x = 1 To UBound(arrToCheck)
        If arrToCheck(x) = valToFind Then IsInArray = True
    Next x
End Function

對於您的示例,您可以像這樣使用它:

SumIfIf截圖

用法

SumIfIf(rgeData As Range,matchCriteria As String,numCompCriteria As String)

rgeData =任意行數和至少2列的范圍

功能匹配:

  • 最左邊的列與'matchCriteria'完全匹配,和

  • 匹配'numCompCriteria'的最右列

...接着:

  • 返回numCompCriteria匹配的總和

  • 其中[matchCriteria] + [numCompCriteria]是唯一的。

matchCriteria =要精確匹配的文本或數字標識符

numCompCriteria =一個數字標識符,特定為以><=開頭的字符串,就像您為SumIf工作表函數指定簡單條件一樣。

  • numCompCriteria示例: "=10""<=10""10"

我正處於當天的屏幕時間限制; 如果您想進一步解釋,請告訴我。 在此期間,希望這可以解決您的問題。 :)

+1到問題的挑戰,其中有被我需要東西我工作過的獎金!


更新,進一步到@ BOB的問題:

進行比較的代碼行是這樣的:

If Evaluate(c.Value = matchCriteria) And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & numCompCriteria & ")") Then

所以根據您的需要,有幾種方法可以改變它。

快速而骯臟,如果您的新標准是永久性的,請將以上行替換為:

If Evaluate(c.Value = matchCriteria) _
    And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & ">10" & ")") _
    And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & "<=35" & ")") _
    Then

請注意,這將不再使用numCompCriteria的值,但您仍需要指定某些內容,或者從函數聲明中刪除該參數。 或者,調整它為新條件添加更多參數。

按照該模式,您可以添加所有您喜歡的標准。 它在這里使用的方式,“ Evaluate ”返回True或False。 您可以演示:

debug.print Evaluate ("=(10>35)")

並在上面的代碼中

c.Offset(0, rgeData.Columns.Count - 1).Value

返回最右列的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM