使用多个条件对唯一值求和

时间:2017-11-21 07:43:49

标签: excel vba excel-vba

enter image description here

您好,
我需要一个等效公式来根据某些标准对唯一值求和。 我想要的结果是在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的每个单元格上都有一个公式,可以计算出正确的。

谢谢!

1 个答案:

答案 0 :(得分:3)

在我找到一个有效的方法之前,我必须尝试几种方法,但我已经弄明白了。

将这些功能粘贴到模块中:

ON

对于您的示例,您可以像这样使用它:

SumIfIf Screenshot

  

<强>用法

     

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)")

返回最右列的值。