隐藏列时公式小计 109 在 Excel 中不起作用

Posted

技术标签:

【中文标题】隐藏列时公式小计 109 在 Excel 中不起作用【英文标题】:formula Subtotal 109 when hiding columns does not work in excel 【发布时间】:2015-12-20 22:33:48 【问题描述】:

我在 B 列中有公式,从 E 列开始每隔一列小计。所以列 E、G、I、K、M、O、Q、S 以及最终更多。第4行的公式是

=SUBTOTAL(109,E4,G4,I4,K4,M4,O4,Q4,S4)

当我隐藏其中一列时,B 列中的总数不会调整以减少值。

任何可能导致此问题的想法。看来这应该是直截了当的。我以前使用过小计,它适用于我的其他工作簿。这是一本简单的工作簿,或者看起来如此。工作表上有 55 行,其中 52 行具有此公式。它们都不起作用。这很简单,我敢肯定,我会很尴尬,但我尝试了很多事情都没有成功。

【问题讨论】:

从帮助 ...隐藏列不会影响小计。但是,在垂直范围的小计中隐藏一行确实会影响小计 @chrisneilsen 谢谢克里斯,我忽略了显而易见的问题,但 Dirk 下面的回答确实让我到达了我想去的地方,所以这是一场双赢。 【参考方案1】:

对于SUBTOTAL,请阅读This

SUBTOTAL 函数专为数据列或垂直范围而设计。它不适用于数据行或水平范围。例如,当您使用 101 或更大的 function_num 对水平范围进行小计时,例如 SUBTOTAL(109,B2:G2),隐藏列不会影响小计。但是,在垂直范围的小计中隐藏一行确实会影响小计。

执行此操作的唯一非 VBA 方法(我知道)是像这样使用 CELL

=SUM(E4*(CELL("width",E4)>0),G4*(CELL("width",G4)>0),I4*(CELL("width",I4)>0),K4*(CELL("width",K4)>0),M4*(CELL("width",M4)>0),O4*(CELL("width",O4)>0),Q4*(CELL("width",P4)>0),S4*(CELL("width",S4)>0))

缺点是,您需要执行任何实际操作来重新计算(而小计通过隐藏一行进行重新计算,CELL 不会)。只需输入一个单元格并按回车键(或在选择空单元格时直接删除)或在“公式”选项卡中点击“立即计算”。

它使用隐藏行返回宽度为 0(行和高度相同)的行为,但它在此处检查整个列(逐行隐藏单元格,不会更改宽度)。

此外,您不能在这样的数组中使用它,而且公式看起来也不是很好。但至少,您可以简单地将其复制下来。

【讨论】:

这是完美的,效果很好。它确实需要一些公式工作,但将是完成电子表格返工的一个很好的选择。非常感谢。【参考方案2】:

我建议创建辅助行,例如 E12 - S12

=CELL("Width",E4)

将此代码放在每一列中并隐藏整行

然后在 sum 单元格中,假设 T4 编写此代码

=SUMIF($E$12:$S$12,">0",E4:S4)

此公式的唯一问题是,特定事件“隐藏”、“取消隐藏”未注册为事件,并且未重新计算总和单元格。这可以通过 VBA 和 UIeditor 修复。

您将需要 UIeditor 为您的工作表添加自定义功能区以捕获此特定事件,例如隐藏/取消隐藏列,您需要在此处下载编辑器:http://www.rondebruin.nl/win/s2/win001.htm

然后为您的工作表添加此代码:

<customUI  xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<commands >
    <command 
        idMso="ColumnsHide"
        onAction="Column_Hide_Macro"/>
    <command 
        idMso="ColumnsUnhide"
        onAction="Column_UnHide_Macro"/>
</commands >

所以现在当有人点击隐藏或取消隐藏列宏时“Column_Hide_Macro”或“Column_UnHide_Macro”被激活

然后将此添加到您的电子表格中

Sub column_hide_Macro(control As IRibbonControl, ByRef cancelDefault)
    cancelDefault = False
    alertTime = Now + TimeSerial(0, 0, 0.1)
    Application.OnTime alertTime, "reCalc"
End Sub
Sub column_unhide_Macro(control As IRibbonControl, ByRef cancelDefault)
    cancelDefault = False
    alertTime = Now + TimeSerial(0, 0, 0.1)
    Application.OnTime alertTime, "reCalc"
End Sub
Sub reCalc()
    Application.CalculateFullRebuild
End Sub

将此代码添加到模块中,而不是工作表或工作簿代码!

现在,当您隐藏或取消隐藏列时,您应该每次都重新计算工作表。

干杯...

【讨论】:

【参考方案3】:

例如,在第 12 行中,将“H”放在您不想求和的每一列中。 B4单元格中的公式是

=SUMIFS(E4:S4,E12:S12,"<>H")

【讨论】:

【参考方案4】:

SUBTOTAL 过滤隐藏的行,而不是隐藏的列或单元格。

此行为与允许使用下拉控件隐藏行的自动过滤功能密切相关。

最简单的解决方案是重组工作表并使用隐藏行。

【讨论】:

@Amit 本质上是的,它是最简单的。我现在看到情况确实如此。不幸的是,在此应用程序中,A 列是一个相当长的描述字段,即使使用换行,也不能将其放置在多个列标题中的干净外观中。感谢您抽出宝贵时间回复。

以上是关于隐藏列时公式小计 109 在 Excel 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

VBA Excel小计动态范围不起作用

如何避免在小计范围的第一行添加新行以保护小计公式

表少于 4 列时导出到 excel 后隐藏列 (s-s-rS)

Excel - 汇总然后小计?

EXCEL 中TRIM函数的用法

CountIf 和小计