SumProduct在单元格组(不是连续的)

我有一个用于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可能是可能的,但即使可以做到,也不可能比原来的解决scheme更具可读性。 问题在于,即使在20多年以后,Excel仍然存在不连续的范围。 命名它们将不起作用,数组公式将不起作用,正如你用SUMPRODUCT所看到的那样,它们通常不能用于元组数组函数。 这里最好的select是提出一个自定义函数。

UPDATE

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

 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按列和行列举范围,因此,如果您有一个连续的范围(数据按列组织),则必须select不同的范围:gvSUMPRODUCT(A1:A10,B1:B10)而不是gvSUMPRODUCT(A1:B10)。
  • 该函数通过将前半部分单元格与第二部分乘积相加,然后对这些乘积进行求和:gvSUMPRODUCT(A1,C3,L2,B2,G5,F4)= A1 * B2 + C3 * G5 + L2 * F4。 即命令重要。
  • 你可以通过做一些像gvNSUMPRODUCT(n,ranges)那样的扩展函数来包含n-wise乘法。
  • 如果单元格数量不是奇数(不是范围),则返回#VALUE错误。

我同意这样的评论:“虽然可以做到,但是即使可以做到,也不可能比原来的解决scheme更具可读性”

一个可能的解决scheme是在您的SUMPRODUCTembeddedCHOOSE()函数(这个技巧对于vlookups来说非常方便,可以find条件最大值等等)。

示例:假设您的数据有八个观察值,并且分为两列(B列和C列),但您不想包含一些观察值(不包括第4行和第5行的观察值)。 然后SUMPRODUCT代码看起来像这样…

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

我其实在想这个,所以我不知道这个限制,你可以看到它不是那么漂亮。

希望这可以帮助! 🙂

创build一个中间表来总结您用于计算总和产品的数据可能会有帮助。 这也将使计算更容易遵循。

请注意, sumproduct(a, b) = sumproduct(a1, b1) + sumproduct(a2, b2)其中范围a被分割成范围a1和a2(对于b也是类似的)