Excel 2017 年公式 - 按月平均数据,同时可过滤
Excel 2017 Formula - Average data by month, while being filterable
我不是 VBA 编码员,如果可能的话我更喜欢 excel 公式,最简单的解决方案就是最好的解决方案。
Test workbook screenshot
如您所见,我有很多可过滤的列。
我正在尝试检索 L 列的平均值,但我希望针对 G3:R3 中的正确月份计算数据。
结果计算需要在筛选时重新计算,在客户、站点、状态、工作类型等之间
我在另一个 sheet 中引用生成的单元格,这让我大致了解了趋势,因为在每个 sheet 中按月过滤不是一种选择。
=AVERAGE(IF(MONTH(E9:E1833)=1,(J9:J1833)))
这个不更新过滤后的数据。
=SUM(IF(MONTH(E9:E1833)=1,J9:J1833,0)) /SUM(IF(MONTH(E9:E1833)=1,1))
这个不更新过滤后的数据。
我尝试了 5 种不同的 SUBTOTAL 公式,其中一些带有 OFFSET,其中 none 产生的结果与我手动检查时得到的结果相同。
每部作品sheet超过150000行,最大的29148行。数据追溯到 2005 年。
有人能帮我找到解决办法吗?
一个可能的解决方案是创建一个辅助列,如果该行可见,则为 returns 1
,如果该行不可见(或空白),则为 returns 0
.这允许您的公式有更多的自由度。
例如,如果您要在列 X
中创建辅助列,请将其键入单元格 X9
并向下拖动:
= SUBTOTAL(103,A9)
现在您可以创建自定义平均公式,例如:
= SUMPRODUCT((MONTH(E9:E1833)=1)*(X9:X1833)*(J9:J1833))/
SUMPRODUCT((MONTH(E9:E1833)=1)*(X9:X1833))
不是很漂亮,但它完成了工作。 (注意这是一个数组公式,所以你必须按键盘上的 Ctrl+Shift+Enter而不是在键入此公式后仅 Enter。)
使用更多的辅助列,您可以完全避免 SUMPRODUCT
,只需执行一个 AVERAGEIFS
.
即可完成此操作
例如,如果您在单元格 Y9
中键入并向下拖动:
= MONTH(E9)
那么你的公式可以是:
= AVERAGEIFS(J9:J1833,X9:X1833,1,Y9:Y1833,1)
如果没有至少一个辅助函数(如果你想避免 VBA),就没有一种干净的方法来做到这一点。
我不是 VBA 编码员,如果可能的话我更喜欢 excel 公式,最简单的解决方案就是最好的解决方案。
Test workbook screenshot
如您所见,我有很多可过滤的列。
我正在尝试检索 L 列的平均值,但我希望针对 G3:R3 中的正确月份计算数据。
结果计算需要在筛选时重新计算,在客户、站点、状态、工作类型等之间
我在另一个 sheet 中引用生成的单元格,这让我大致了解了趋势,因为在每个 sheet 中按月过滤不是一种选择。
=AVERAGE(IF(MONTH(E9:E1833)=1,(J9:J1833)))
这个不更新过滤后的数据。
=SUM(IF(MONTH(E9:E1833)=1,J9:J1833,0)) /SUM(IF(MONTH(E9:E1833)=1,1))
这个不更新过滤后的数据。
我尝试了 5 种不同的 SUBTOTAL 公式,其中一些带有 OFFSET,其中 none 产生的结果与我手动检查时得到的结果相同。
每部作品sheet超过150000行,最大的29148行。数据追溯到 2005 年。
有人能帮我找到解决办法吗?
一个可能的解决方案是创建一个辅助列,如果该行可见,则为 returns 1
,如果该行不可见(或空白),则为 returns 0
.这允许您的公式有更多的自由度。
例如,如果您要在列 X
中创建辅助列,请将其键入单元格 X9
并向下拖动:
= SUBTOTAL(103,A9)
现在您可以创建自定义平均公式,例如:
= SUMPRODUCT((MONTH(E9:E1833)=1)*(X9:X1833)*(J9:J1833))/
SUMPRODUCT((MONTH(E9:E1833)=1)*(X9:X1833))
不是很漂亮,但它完成了工作。 (注意这是一个数组公式,所以你必须按键盘上的 Ctrl+Shift+Enter而不是在键入此公式后仅 Enter。)
使用更多的辅助列,您可以完全避免 SUMPRODUCT
,只需执行一个 AVERAGEIFS
.
例如,如果您在单元格 Y9
中键入并向下拖动:
= MONTH(E9)
那么你的公式可以是:
= AVERAGEIFS(J9:J1833,X9:X1833,1,Y9:Y1833,1)
如果没有至少一个辅助函数(如果你想避免 VBA),就没有一种干净的方法来做到这一点。