[英]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(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.