我有一个包含 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 ?
我同意这样的评论“熟练的excel-fu也许可以实现,但即使可以做到,它也不太可能比你原来的解决方案更具可读性”
一个可能的解决方案是将
CHOOSE()
函数嵌入到 SUMPRODUCT
中(这个技巧实际上对于 vlookups、查找条件最大值等非常方便)。
示例: 假设您的数据有 8 个观测值,位于两列(B 列和 C 列)中,但您不想包含某些观测值(不包括第 4 行和第 5 行中的观测值)。然后
SUMPRODUCT
代码看起来像这样......
=SUMPRODUCT(CHOOSE({1,2},A1:A3,A6:A8),CHOOSE({1,2},B1:B3,B6:B8))
我实际上是临时想到的,所以我不知道其局限性,正如你所看到的,它并不那么漂亮。
希望这有帮助! :)
使用高超的 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
一些注意事项:
请注意
sumproduct(a, b) = sumproduct(a1, b1) + sumproduct(a2, b2)
,其中范围 a 分为范围 a1 和 a2(与 b 类似)
创建一个中间表来汇总您用于计算总和积的数据可能会有所帮助。这也将使计算更容易遵循。
您可以将公式分解为:
=sum(a1*a2,b1*b2,c1*c2)/sum(a2,b2,c2)
使用您提供的单元格,它看起来像这样:
=sum(D2*D32,D64*D94,D126*D156,D188*D218)/SUM(D32,94,D156,D218)