您好,
我需要一个等效公式来根据某些标准对唯一值求和。
我想要的结果是在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))}
此公式的问题在于,无法在FormulaArray
中使用VBA
进行设置。我知道我可以使用evaluate
来提取结果,但我想要的只是在列E
的每个单元格上都有一个公式,可以计算出正确的。
谢谢!
答案 0 :(得分:3)
在我找到一个有效的方法之前,我必须尝试几种方法,但我已经弄明白了。
将这些功能粘贴到模块中:
ON
对于您的示例,您可以像这样使用它:
<强>用法强>:
SumIfIf(rgeData As Range,matchCriteria As String,numCompCriteria As String)
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
=任意行数和至少2列的范围该功能匹配:
与“matchCriteria”完全匹配的最左侧列,
- 的最右列
匹配'numCompCriteria'
......然后:
- 的总和
返回
rgeData
匹配其中
numCompCriteria
是唯一的。
[matchCriteria] + [numCompCriteria]
=要完全匹配的文本或数字标识符
matchCriteria
=一个数字标识符,特定为以&gt; 或&lt; 或 = 开头的字符串,就像您指定的那样numCompCriteria
工作表函数的简单标准。
SumIf
的示例:numCompCriteria
,"=10"
,"<=10"
我正处于当天的屏幕时间限制;如果您想进一步解释,请告诉我。在此期间,希望这可以解决您的问题。 :)
对于挑战的问题,+1,其中还有只是我正在努力的东西所需的奖励!
更新,继续@ BOB的问题:
进行比较的代码行是这样的:
"10"
因此,根据您的需求,您可以通过几种方式进行更改。
快速而肮脏,如果您的新标准是永久性的,请将以上行替换为:
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
”返回True或False。您可以演示:
Evaluate
并在上面的代码中
debug.print Evaluate ("=(10>35)")
返回最右列的值。