【问题标题】:SUMIF excluding hidden rows. SUBTOTAL? SUMPRODUCT?SUMIF 不包括隐藏行。小计?总和?
【发布时间】:2016-03-08 08:54:43
【问题描述】:

我有 2 个大型活动表。第一个表是包含日期、持续时间和代码(用于标识事件)的数据表 (tblData)。第二个表是每个事件花费的总时间的汇总表 (tblSummary)。

如何过滤tblData 并更新tblSummary

下面是tblData 的一小部分。请注意,2 级代码有 3 列(L2a,L2b,L2c);这意味着如果我正在寻找 2 级代码“EL”的总持续时间,我必须检查所有 3 列并添加它们的 Duration 次。仅给出下图,总“EL”时间将为9.9

下面是一段tblSummary

对于Total 列,我使用SUMIF (tblData[L2a], [@[Lvl 2 Code]], tblData[Duration]) 来获取代码的总时间,但这包括隐藏行。当我更改 tblData 上的过滤器时,tblSummary 不会更新。

我相信使用SUBTOTAL 是一个死胡同。这将解决隐藏列问题,但由于无法设置标准,我无法将其应用于tblSummary

我是SUMPRODUCT 的新手,但我确实尝试过使用

=SUMPRODUCT(SUBTOTAL(109,tblData[Duration]),--(tblData[L2a]="EL"))

但收到了#VALUE!。我确实按了Ctl + Shift + Enter

【问题讨论】:

    标签: excel excel-formula excel-2010


    【解决方案1】:

    在忽略隐藏行的同时将SUMIF function 的列值条件耦合在一起意味着我们必须在SUBTOTAL function 上强制执行额外的计算层,并通过SUMPRODUCT function 的循环计算来收集聚合。额外的“层”处理将通过OFFSET function¹ 完成。

        

    tblSummarystructured tableTotal列(又名K15)第一行的标准公式是,

    =SUMPRODUCT((SUBTOTAL(103, OFFSET(tblData, ROW(tblData)-ROW(INDEX(tblData, 1, 0)), 0, 1, 1))=1)*(tblData[L2a]=[@[Lvl 2 Code]]), tblData[Duration])
    

    如果表格没有为您执行此操作,请填写。

    当我们过滤 tblData 表的 Date 列以隐藏 2015 年 11 月 24 日、2015 年 11 月 27 日和 2015 年 11 月 28 日时,新的总数显示在tblSummary 表。

        


    ¹ 每当整个工作簿中的任何内容发生变化时,可变函数都会重新计算,而不仅仅是在影响其结果的某些内容发生变化时。 volatile 函数的示例有 INDIRECTOFFSETTODAYNOWRANDRANDBETWEENCELLINFO 工作表函数的一些子函数也会使它们变得易变。

    【讨论】:

    • 正是我想要的!但是我发现了一个小问题。当我将总行添加到 tblSummary 时,公式 SUBTOTAL( 109, [Total]) 返回零?我想使用SUBTOTAL 而不是SUM 来过滤隐藏行。
    • 这确实是一种奇怪的行为,我稍后会进一步研究它。在此期间,请用=AGGREGATE(9, 7, [Total]) 中的AGGREGATE function 替换建议的SUBTOTAL function。实际上,现在我想起来了,SUBTOTAL 旨在忽略其他 SUBTOTAL 结果。 AGGREGATE 可以选择忽略 SUBTOTAL 结果,但也可以接受。
    • 为了确保我理解正确,主要使用 OFFSET 函数,因为它是易变的。因此,如果我希望 tblSummary 包含列 L2aL2bL2c 的所有代码实例,我只会添加 3 个版本的公式,唯一的区别是 ..tblData[L2a]..。比如=SUMPRODUCT(.. ..tblData[L2a]..) + SUMPRODUCT(.. ..tblData[L2b]..) + SUMPRODUCT(.. ..tblData[L2c].. ),对吗?
    • 不,使用它是因为我找不到任何非易失性可以完成这项工作。它使用 SUMPRODUCT 逐行循环计算可见行和折扣隐藏行。要为三列添加 OR 比较,请将 ...*(tblData[L2a]=[@[Lvl 2 Code]]), 替换为 ... *SIGN((tblData[L1]=[@[Lvl 2 Code]])+(tblData[L2a]=[@[Lvl 2 Code]])+(tblData[L2b]=[@[Lvl 2 Code]])), 。如果其中任何一个匹配,则为真,但如果匹配不止一个,则它仍然只为真一次。
    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多