【问题标题】:Excel - rolling average across columns without zeros, no arrayExcel - 跨列的滚动平均值,没有零,没有数组
【发布时间】:2017-12-08 16:44:31
【问题描述】:

我目前正在使用此公式计算过去 3 个月或 6 个月内 12 列的滚动平均分数。

=SUM(SUMIFS($E$54:P54,$E$54:P54,LARGE(IF($E$54:P54>0,$E$54:P54),{1,2,3})))

这是一个数组公式,通过CTRL + SHIFT + ENTER输入。

现在的问题是我需要将我的工作簿部署在较旧的机器和那些老式办公计算机上(我们正在谈论 windows XP 和 Office 2003...),我发现阵列正在杀死整个工作簿。现在,我已经采取措施通过 VBA 加速工作簿(禁用事件、手动公式计算等),但我需要一种方法将上述数组公式转换为不计算零或空的非数组公式单元格作为平均值的一部分。

我在下面尝试了这个,但无法让它与零/空单元格一起使用。 =SUM(OFFSET($E68,0,COUNT($E68:$P68)-IF(COUNT($E68:$P68)>3,3,COUNT($E68:$P68)),1,IF(COUNT($E68:$P68)>3,3,COUNT($E68:$P68))))

下面附上示例数据的图片。

【问题讨论】:

    标签: arrays excel excel-formula vba


    【解决方案1】:

    由于平均值是“总和”除以“计数”,这可以使用非数组公式的简单性来完成。该公式避免了包含零和空白单元格:

    =IF(SUM(A2:C2)>0,SUM(A2:C2)/(COUNT(A2:C2)-COUNTIF(A2:C2,0)),0)。

    如果该行仅填充了零值,则将实际数值平均值显示为零,这是正确的。如果您想避免在单元格中显示零平均值,请使用这个稍微不同的公式:

    =IF(SUM(A3:C3)>0,SUM(A3:C3)/(COUNT(A3:C3)-COUNTIF(A3:C3,0)),"")。

    当然,您需要调整 6 个月和 YTD 平均值的单元格范围;这些公式处理 3 个月的范围。

    【讨论】:

    • 这是滚动月份计算吗?看来我必须每个月手动调整到范围?
    • 该公式适用于从第二季度开始并向下复制的 3 个月平均值。对于 6 个月的平均值: =IF(SUM(A2:F2)>0,SUM(A2:F2)/(COUNT(A2:F2)-COUNTIF(A2:F2,0)),"") 在 R2 中并复制下。对于 YTD 平均值:S2 中的 =IF(SUM(A2:L2)>0,SUM(A2:L2)/(COUNT(A2:L2)-COUNTIF(A2:L2,0)),"") 并向下复制。
    • 我没有注意到您的示例从“E”列开始。当我测试我的公式时,我从电子表格中的“A”列开始复制了您的示例。只需调整范围引用以适合您的数据实际驻留,E2:P2。
    • 这些公式在确定过去 3/6 个月的意义上不是“滚动”的,而只是计算 3 或 6 个单元格范围的平均值。这样,我必须每月将公式从 A3:C3 调整为 B3:D3 等,以获得最新的 3 个月滚动。我正在寻找的是一种计算 12 个单元格范围内最后 3/6 个单元格的平均值的方法,不计算零。
    【解决方案2】:

    对于过去 3 个月的范围平均值:=SUM(OFFSET($A3,0,COUNT($A3:$L3)-IF(COUNT($A3:$L3)>3,3,COUNT($A3: $L3)),1,IF(COUNT($A3:$L3)>3,3,COUNT($A3:$L3))))/(COUNT(OFFSET($A3,0,COUNT($A3:$ L3)-IF(COUNT($A3:$L3)>3,3,COUNT($A3:$L3)),1,IF(COUNT($A3:$L3)>3,3,COUNT($A3: $L3))))-COUNTIF(OFFSET($A3,0,COUNT($A3:$L3)-IF(COUNT($A3:$L3)>3,3,COUNT($A3:$L3)), 1,IF(COUNT($A3:$L3)>3,3,COUNT($A3:$L3))),0))

    过去 6 个月的平均值:SUM(OFFSET($A2,0,COUNT($A2:$L2)-IF(COUNT($A2:$L2)>6,6,COUNT($A2:$L2 )),1,IF(COUNT($A2:$L2)>6,6,COUNT($A2:$L2))))/(COUNT(OFFSET($A2,0,COUNT($A2:$L2) -IF(COUNT($A2:$L2)>6,6,COUNT($A2:$L2)),1,IF(COUNT($A2:$L2)>6,6,COUNT($A2:$L2 ))))-COUNTIF(OFFSET($A2,0,COUNT($A2:$L2)-IF(COUNT($A2:$L2)>6,6,COUNT($A2:$L2)),1, IF(COUNT($A2:$L2)>6,6,COUNT($A2:$L2))),0))

    这些很长,但它们从原始非数组公式中排除了零值单元格。假设数据从 A2:L2 行开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      相关资源
      最近更新 更多