【问题标题】:In Excel, can I sum a column of cells based on whether or not a given value is in each of the rows?在 Excel 中,我可以根据给定值是否在每一行中对一列单元格求和吗?
【发布时间】:2020-03-29 15:36:03
【问题描述】:

在 Excel 中,是否有数组公式或其他东西可以缩短下面的公式?这只是一个经过 12 行的示例。实际的公式会有数千行,这就是为什么我想找到一种方法来缩短这个公式。除了下面的内容之外,我还考虑并尝试了 SUMIF 和 SUMPRODUCT,但我还没有找到一种方法来检查多列中的指定值,然后对多行执行此操作,就像 FOR 循环一样。以下公式在单元格 J3 中。我附上了电子表格示例的图像。

=SUM(
IF(ISNUMBER(MATCH($I$3,$B3:$E3,0)),$F3,0),
IF(ISNUMBER(MATCH($I$3,$B4:$E4,0)),$F4,0),
IF(ISNUMBER(MATCH($I$3,$B5:$E5,0)),$F5,0),
IF(ISNUMBER(MATCH($I$3,$B6:$E6,0)),$F6,0),
IF(ISNUMBER(MATCH($I$3,$B7:$E7,0)),$F7,0),
IF(ISNUMBER(MATCH($I$3,$B8:$E8,0)),$F8,0),
IF(ISNUMBER(MATCH($I$3,$B9:$E9,0)),$F9,0),
IF(ISNUMBER(MATCH($I$3,$B10:$E10,0)),$F10,0),
IF(ISNUMBER(MATCH($I$3,$B11:$E11,0)),$F11,0),
IF(ISNUMBER(MATCH($I$3,$B12:$E12,0)),$F12,0),
IF(ISNUMBER(MATCH($I$3,$B13:$E13,0)),$F13,0),
IF(ISNUMBER(MATCH($I$3,$B14:$E14,0)),$F14,0))

【问题讨论】:

    标签: excel array-formulas sumifs sumproduct


    【解决方案1】:

    像这样使用 SUMPRODUCT:

    =SUMPRODUCT($F$3:$F$14*(MMULT(N($B$3:$E$14=I3),TRANSPOSE(COLUMN($B$3:$E$14)^0))>0))
    

    这是一个数组公式,退出编辑模式时需要用Ctrl-Shift-Enter确认,而不是Enter。

    【讨论】:

    • 看起来很完美,斯科特。谢谢你。我没有看到在我试图找到这个解决方案的任何其他线程中提到的 MMULT 或 TRANSPOSE。话虽如此,我得到了一个价值!如果我尝试使用您的公式,则会出错。你认为可能是什么问题?它应该与Excel的版本有关吗?我工作时只有 Excel 2013。
    • 您是根据完整数据还是测试数据得出的?
    • 关于我分享的测试数据。我仍在运行查询以获取完整数据的电子表格。
    • 确保数字不是看起来像数字的文本。不知道为什么它对我有用,而不是你。
    • 我进行了验证以确保它们是数字。你的娱乐看起来很到位,我很感激,所以我会继续调整它并努力看看有什么不对劲的地方。再次感谢。我不擅长乘法矩阵,我需要这样做,所以如果没有别的,你让我朝着正确的方向思考。
    【解决方案2】:

    改进的解决方案

    =SUMPRODUCT($F$3:$F$14,CEILING(((($B$3:$B$14=$I3)+($C$3:$C$14=$I3)+($D$3:$D$14=$I3)+($E$3:$E$14=$I3))/4),1))
    

    想法:4 是每周的行数。使用 ceiling() 规范化值,而不是 int() n sqrt()。

    扩展说明:只需添加另一个行条件并将行数调整为 4。


    过去的解决方案(供参考)

    =SUMPRODUCT($F$3:$F$14,INT(SQRT(INT(SQRT(($B$3:$B$14=$I3)+($C$3:$C$14=$I3)+($D$3:$D$14=$I3)))+($E$3:$E$14=$I3))))
    

    应该这样做。

    idea : 当 $B$3:$B$14=$I3 部分正在创建一个 0 n 1 的数组时,INT() n SQRT() 函数“强制”“+”总和变为 1,即使有同月有超过 1 场比赛。

    请分享它是否有效。 (:

    p/s :(扩展说明)剖析 int() 和 sqrt() 函数后,您可以看到 sqrt(3)=1.73205 、 sqrt(2)1.414213 、 sqrt(1)=1 及其 int () 产生相同的值 (1) 。因此,假设您想添加更多行,只需在一个 int(sqrt(__)) 函数中递归地使用 'bundle' 3 行。

    【讨论】:

    • 这也有效。而且由于它不需要 TRANSPOSE,因此不需要 CSE。谢谢。
    • 感谢您的善意验证。我添加了一些注释以供将来参考。 /(^_^)
    • 是的,乍一看我不知道你在做什么,但后来我明白了。它非常有创意,并且在您添加第 16 列之前一直有效,此时需要添加另一组 INT(SQRT())。我喜欢它,我不应该有那么多专栏,即使在我未来的项目中也是如此。
    • 我已经添加了改进的公式.. 不需要 int/sqrt,只需将行数从 4 更改为 16 并添加其他行条件。
    猜你喜欢
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多