【问题标题】:SumProduct over sets of cells (not contiguous)SumProduct 在一组单元格上(不连续)
【发布时间】:2010-03-09 23:00:41
【问题描述】:

我有一个用于 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 worksheet-function


【解决方案1】:

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

一种可能的解决方案是将CHOOSE() 函数嵌入到您的SUMPRODUCT 中(这个技巧实际上对于vlookup、查找条件最大值等非常方便)。

示例: 假设您的数据有 8 个观测值并且位于两列(B 列和 C 列),但您不想包含一些观测值(不包括第 4 行和第 5 行中的观测值)。那么SUMPRODUCT的代码是这样的……

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

我实际上是在飞行中想到这个的,所以我不知道它的局限性,而且你可以看到它并不那么漂亮。

希望这会有所帮助! :)

【讨论】:

  • 我必须尝试一下 Choose() 语句,看看它是如何工作的,因为这是我第一次听说它。仅限2010 Excel及以上版本吗,你知道吗?
  • 谢谢! CHOOSE 是我需要在一组不连续的值上使用 LARGE :-) 例如添加三个中的前两个:LARGE(CHOOSE({1,2,3},J54,N54,U54),1)+LARGE(CHOOSE({1,2,3},J54,N54,U54),2 )
【解决方案2】:

使用熟练的 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。 IE。订单很重要。
  • 您可以通过执行 gvNSUMPRODUCT(n,ranges) 之类的操作来扩展该函数以包含 n 次乘法。
  • 如果有奇数个单元格(不是范围),则返回 #VALUE 错误。

【讨论】:

  • 所以我想我会接受这个答案,并且只需要保留当前的方法或在我使用 VBA 自动执行此操作时添加一个部分,该 VBA 还将每个分组添加到 Total 区域...
  • 我试过了,还是不行。
【解决方案3】:

注意sumproduct(a, b) = sumproduct(a1, b1) + sumproduct(a2, b2),其中范围 a 分为范围 a1 和 a2(b 也类似)

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多