SumProduct对多组单元格(不连续)

时间:2010-03-09 23:00:41

标签: excel worksheet-function

我有一个用于4种不同分组的总数据集。其中一个值是平均时间,另一个是计数。对于总计,我必须将它们相乘,然后除以计数的总和。目前我使用:

=SUM(D32*D2,D94*D64,D156*D126,D218*D188)/SUM(D32,D94,D156,D218)

如果我能使它更具可读性,我宁愿使用SumProduct。我试着这样做:

=SUMPRODUCT((D2,D64,D126,D188),(D32,D94,D156,D218))/SUM(D32,94,D156,D218)

但正如你在我的帖子中所说,这不起作用。有没有办法像我想要的那样做SumProduct?

4 个答案:

答案 0 :(得分:7)

我同意评论“有可能使用熟练的excel-fu,但即使可以做到,它也不可能比原始解决方案更具可读性”

一种可能的解决方案是将CHOOSE()函数嵌入到SUMPRODUCT中(这个技巧对于vlookup来说非常方便,可以找到条件最大值等)。

实施例: 假设您的数据有八个观察值,并且分为两列(B列和C列),但您不希望包含一些观察结果(排除第4行和第5行中的观察结果)。然后SUMPRODUCT代码看起来像这样......

=SUMPRODUCT(CHOOSE({1,2},A1:A3,A6:A8),CHOOSE({1,2},B1:B3,B6:B8))

我实际上想到了这一点,所以我不知道这些限制,因为你可以看到它并不那么漂亮。

希望这有帮助! :)

答案 1 :(得分:5)

有可能使用熟练的excel-fu,但即使可以完成,它也不可能比原始解决方案更具可读性。问题是即使在20多年后,Excel仍然会出现不连续的范围。命名它们将无法工作,数组公式将无法工作,正如您在SUMPRODUCT中看到的那样,它们通常不用于元组数组函数。这里最好的选择是提出自定义功能。

更新

你的问题让我思考如何处理不连续的范围。这不是我过去必须处理的事情。当你问这个问题时,我没有时间给出更好的答案,但现在我已经有几分钟了,我已经掀起了一个可以做你想做的自定义功能:

Function gvSUMPRODUCT(ParamArray rng() As Variant)

    Dim sumProd As Integer
    Dim valuesIndex As Integer
    Dim values() As Double

    For Each r In rng()
        For Each c In r.Cells
            On Error GoTo VBAIsSuchAPainInTheAssSometimes
                valuesIndex = UBound(values) + 1
            On Error GoTo 0
            ReDim Preserve values(valuesIndex)
            values(valuesIndex) = c.Value
        Next c
    Next r
    If valuesIndex Mod 2 = 1 Then
        For i = 0 To (valuesIndex - 1) / 2
            sumProd = sumProd + values(i) * values(i + (valuesIndex + 1) / 2)
        Next i
        gvSUMPRODUCT = sumProd
        Exit Function
    Else
        gvSUMPRODUCT = CVErr(xlErrValue)
        Exit Function
    End If

VBAIsSuchAPainInTheAssSometimes:
    valuesIndex = 0
    Resume Next

End Function

一些注意事项:

  • Excel按列计算范围然后按行计算,因此如果您有按列组织数据的连续范围,则必须选择单独的范围:gvSUMPRODUCT(A1:A10,B1:B10)而不是gvSUMPRODUCT(A1:B10)
  • 该功能通过将前半部分单元与第二部分成对相乘然后对这些乘积求和来工作:gvSUMPRODUCT(A1,C3,L2,B2,G5,F4)= A1 * B2 + C3 * G5 + L2 * F4。即订购事宜。
  • 您可以通过执行类似gvNSUMPRODUCT(n,范围)的操作来扩展函数以包含n次乘法。
  • 如果有奇数个单元格(不是范围),则返回#VALUE错误。

答案 2 :(得分:1)

请注意sumproduct(a, b) = sumproduct(a1, b1) + sumproduct(a2, b2)范围a被分为范围a1和a2(以及类似于b)

答案 3 :(得分:0)

创建一个中间表可能会有所帮助,该中间表汇总了用于计算总和乘积的数据。这也可以使计算更容易理解。