用多个标准求和唯一值

在这里输入图像说明

你好,
我需要一个等价的公式来根据一些标准对唯一值进行求和。 我想要的结果是在E列。 有2个标准(第一列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列的每个单元格上有一个公式,可以计算出正确。

谢谢 !

在find一个可行的方法之前,我不得不尝试几个方法,但是我知道了。

将这些函数粘贴到一个模块中:

 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作为范围,matchCriteria作为string,numCompCriteria作为string)

rgeData =任意数量的行和至less2列的范围

该function匹配:

  • 与“matchCriteria”完全匹配的最左边一列

  • 与“numCompCriteria”匹配的最右边一列

…接着:

  • 返回numCompCriteria匹配的总和

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

matchCriteria =文本或数字标识符,要准确匹配

numCompCriteria =一个数字标识符,具体指定为以><=开头的string,就像您将为SumIf工作表函数指定简单条件一样。

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

我在一天的屏幕时间限制; 让我知道你是否想要进一步的解释。 同时希望这可以解决你的问题。 🙂

+1的问题挑战,这正是我正在工作的东西所需要的奖金!


更新,进一步给@鲍勃的问题:

比较的代码行是这样的:

 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 

返回最右侧列的值。