Excel: 不为零但需要停止到今天的动态总和偏移量
Excel: Dynamic Sum offset when not zero but needs to stop until today
当达到像今天这样的某个月份时,我正在努力如何限制我的公式的范围。在我的公式中,它继续总结今天几个月后的下四个月。正如在我的例子中,我想总结零之后的前 4 个月,但只是直到今天的月份。如果不到 4 个月,假设到今天的月份还剩下 3 个月,那么它应该只添加剩余的三个月。
我需要限制宽度,但它应该总是四个,只有当它小于当前月份时它应该小于四个月。
Jan
Feb
Mar
Apr
Jun
Jul
Aug
Oct
Nov
Dec
0
0
2
3
4
5
6
7
2
3
---> 1st period= 14 2nd period= 13
0
0
0
0
0
0
2
1
4
2
---> 1st period= 3 2nd Period= 0
下图效果更佳
例如
前四个月:
=IFERROR(SUM(OFFSET(INDIRECT(CELL("address",
INDEX(A2:N2,MATCH(TRUE,INDEX(A2:N2<>0,),0)))),0.0.1.4))," ")
后四个月:
=IFERROR(SUM(OFFSET(INDIRECT(CELL("address",
INDEX(A2:N2,MATCH(TRUE,INDEX(A2:N2<>0,),0)))),0.0.1.8))
-SUM(OFFSET(INDIRECT(CELL("address",
INDEX(A2:N2,MATCH(TRUE,INDEX(A2:N2<>0,),0)))),0.0.1.4))," ")
这两个公式都超出当前月份并捕获所有超出的日期,如 11 月、12 月等,我不知道如何将它保持在 4 个月,只有在剩余月份少于 4 个月时才调整它
非常感谢您的帮助!
对于第一行的第一个句点,使用:
=SUMPRODUCT($A2:$L2*(COLUMN($A2:$L2)>=AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)-1))*(COLUMN($A2:$L2)<AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)))*($A:$L<TODAY()))
并向右下方复制
如果第一行包含实际格式化的日期而不是文本,则公式将起作用
第一行第一个时期的解释:
$A2:$L2
returns 给定范围内的值数组:
{0,0,1,3,4,6,5,5,5,10,4,3}
AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)
returns 大于0的最小列号:
3
4*(COLUMN(A2)-1)
变为 4*(1-1)
和 returns:
0
所以表达式 AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)-1)
变成 3+0
和 returns:
3
比较 COLUMN($A2:$L2)>=AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)-1)
变为 {1,2,3,4,5,6,7,8,9,10,11,12}>=3
和 returns 布尔数组:
{F,F,T,T,T,T,T,T,T,T,T,T,T}
类比第二个表达式 COLUMN($A2:$L2)<AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2))
变为 {1,2,3,4,5,6,7,8,9,10,11,12}<7
和 returns:
{T,T,T,T,T,T,F,F,F,F,F,F}
第三个表达式 $A:$L<TODAY()
将第一行中的日期与今天的日期进行比较,10 月 27 日将 return:
{T,T,T,T,T,T,T,T,T,T,F,F}
所以最后的表达式我们得到 {0,0,1,3,4,6,5,5,5,10,4,3}*{F,F,T,T,T,T,T,T,T,T,T,T,T}*{T,T,T,T,T,T,F,F,F,F,F,F}*{T,T,T,T,T,T,T,T,T,T,F,F}
结果为:
{0,0,1,3,4,6,0,0,0,0,0,0}
从中SUMPRODUCT
总结:
14
当达到像今天这样的某个月份时,我正在努力如何限制我的公式的范围。在我的公式中,它继续总结今天几个月后的下四个月。正如在我的例子中,我想总结零之后的前 4 个月,但只是直到今天的月份。如果不到 4 个月,假设到今天的月份还剩下 3 个月,那么它应该只添加剩余的三个月。 我需要限制宽度,但它应该总是四个,只有当它小于当前月份时它应该小于四个月。
Jan | Feb | Mar | Apr | Jun | Jul | Aug | Oct | Nov | Dec | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 2 | 3 | 4 | 5 | 6 | 7 | 2 | 3 | ---> 1st period= 14 2nd period= 13 |
0 | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 4 | 2 | ---> 1st period= 3 2nd Period= 0 |
下图效果更佳
例如
前四个月:
=IFERROR(SUM(OFFSET(INDIRECT(CELL("address",
INDEX(A2:N2,MATCH(TRUE,INDEX(A2:N2<>0,),0)))),0.0.1.4))," ")
后四个月:
=IFERROR(SUM(OFFSET(INDIRECT(CELL("address",
INDEX(A2:N2,MATCH(TRUE,INDEX(A2:N2<>0,),0)))),0.0.1.8))
-SUM(OFFSET(INDIRECT(CELL("address",
INDEX(A2:N2,MATCH(TRUE,INDEX(A2:N2<>0,),0)))),0.0.1.4))," ")
这两个公式都超出当前月份并捕获所有超出的日期,如 11 月、12 月等,我不知道如何将它保持在 4 个月,只有在剩余月份少于 4 个月时才调整它
非常感谢您的帮助!
对于第一行的第一个句点,使用:
=SUMPRODUCT($A2:$L2*(COLUMN($A2:$L2)>=AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)-1))*(COLUMN($A2:$L2)<AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)))*($A:$L<TODAY()))
并向右下方复制
如果第一行包含实际格式化的日期而不是文本,则公式将起作用
第一行第一个时期的解释:
$A2:$L2
returns 给定范围内的值数组:{0,0,1,3,4,6,5,5,5,10,4,3}
AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)
returns 大于0的最小列号:3
4*(COLUMN(A2)-1)
变为4*(1-1)
和 returns:0
所以表达式
AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)-1)
变成3+0
和 returns:3
比较
COLUMN($A2:$L2)>=AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2)-1)
变为{1,2,3,4,5,6,7,8,9,10,11,12}>=3
和 returns 布尔数组:{F,F,T,T,T,T,T,T,T,T,T,T,T}
类比第二个表达式
COLUMN($A2:$L2)<AGGREGATE(15,6,COLUMN($A2:$L2)/($A2:$L2>0),1)+4*(COLUMN(A2))
变为{1,2,3,4,5,6,7,8,9,10,11,12}<7
和 returns:{T,T,T,T,T,T,F,F,F,F,F,F}
第三个表达式
$A:$L<TODAY()
将第一行中的日期与今天的日期进行比较,10 月 27 日将 return:{T,T,T,T,T,T,T,T,T,T,F,F}
所以最后的表达式我们得到
{0,0,1,3,4,6,5,5,5,10,4,3}*{F,F,T,T,T,T,T,T,T,T,T,T,T}*{T,T,T,T,T,T,F,F,F,F,F,F}*{T,T,T,T,T,T,T,T,T,T,F,F}
结果为:{0,0,1,3,4,6,0,0,0,0,0,0}
从中
SUMPRODUCT
总结:14