随时间分配值
Distributing Values Over Time
在这个例子中,我有两列数据:日期和数量。
示例:
(见截图 Link)
我想使用excel公式(如果可能的话)'level load'这些数量并传播它们在给定的时间范围内尽可能均匀地输出,同时保留整数。每个值的理想日期对应给定周的星期四。
想要的结果:
(见截图 Link)
这是可能的,但很难。这是我的两分钱(我可能想多了):
- 假设可以访问最新的 BETA-functions(或下面提到的替代方案);
- 月份依次排列,例如:五月 > 六月 > 七月等
E2
中的公式:
=LET(A,SEQUENCE(EOMONTH(A5,0)-A3,,A3),B,FILTER(A,(WEEKDAY(A)=5)*((DAY(A)/7)-0.1<VLOOKUP(A,A3:B5,2))),C,BYROW(B,LAMBDA(x,SUM(--(MONTH(B)=MONTH(x))))),D,VLOOKUP(B,A3:B5,2),VSTACK(A2:B2,HSTACK(B,FLOOR(D/C,1)+TEXTSPLIT(CONCAT(TAKE(UNIQUE(HSTACK(MONTH(B),RIGHT("0|0|0|0|0|"&REPT("1|",MOD(D,C)),C*2))),,-1)),,"|",1))))
或者(同样冗长,但没有 TEXTSPLIT()
):
=LET(A,SEQUENCE(EOMONTH(A5,0)-A3,,A3),B,FILTER(A,(WEEKDAY(A)=5)*((DAY(A)/7)-0.1<VLOOKUP(A,A3:B5,2))),C,BYROW(B,LAMBDA(x,SUM(--(MONTH(B)=MONTH(x))))),D,VLOOKUP(B,A3:B5,2),VSTACK(A2:B2,HSTACK(B,FLOOR(D/C,1)+MID(CONCAT(TAKE(UNIQUE(HSTACK(MONTH(B),RIGHT("00000"&REPT("1",MOD(D,C)),C))),,-1)),SEQUENCE(COUNT(B)),1))))
如您所知,这是一个延伸(仅证明@Scott 在评论中的观点,即通过 VBA 这可能更容易)。
如果您有 ms365 但无法访问 BETA-functions,您可以使用:
=LET(A,SEQUENCE(EOMONTH(A5,0)-A3,,A3),B,FILTER(A,(WEEKDAY(A)=5)*((DAY(A)/7)-0.1<VLOOKUP(A,A3:B5,2))),C,BYROW(B,LAMBDA(x,SUM(--(MONTH(B)=MONTH(x))))),D,VLOOKUP(B,A3:B5,2),CHOOSE({1,2},B,FLOOR(D/C,1)+MID(CONCAT(INDEX(UNIQUE(CHOOSE({1,2},MONTH(B),RIGHT("00000"&REPT("1",MOD(D,C)),C))),,2)),SEQUENCE(COUNT(B)),1)))
您只需要自己添加标题(因为没有VSTACK()
)。
在这个例子中,我有两列数据:日期和数量。
示例: (见截图 Link)
我想使用excel公式(如果可能的话)'level load'这些数量并传播它们在给定的时间范围内尽可能均匀地输出,同时保留整数。每个值的理想日期对应给定周的星期四。
想要的结果: (见截图 Link)
这是可能的,但很难。这是我的两分钱(我可能想多了):
- 假设可以访问最新的 BETA-functions(或下面提到的替代方案);
- 月份依次排列,例如:五月 > 六月 > 七月等
E2
中的公式:
=LET(A,SEQUENCE(EOMONTH(A5,0)-A3,,A3),B,FILTER(A,(WEEKDAY(A)=5)*((DAY(A)/7)-0.1<VLOOKUP(A,A3:B5,2))),C,BYROW(B,LAMBDA(x,SUM(--(MONTH(B)=MONTH(x))))),D,VLOOKUP(B,A3:B5,2),VSTACK(A2:B2,HSTACK(B,FLOOR(D/C,1)+TEXTSPLIT(CONCAT(TAKE(UNIQUE(HSTACK(MONTH(B),RIGHT("0|0|0|0|0|"&REPT("1|",MOD(D,C)),C*2))),,-1)),,"|",1))))
或者(同样冗长,但没有 TEXTSPLIT()
):
=LET(A,SEQUENCE(EOMONTH(A5,0)-A3,,A3),B,FILTER(A,(WEEKDAY(A)=5)*((DAY(A)/7)-0.1<VLOOKUP(A,A3:B5,2))),C,BYROW(B,LAMBDA(x,SUM(--(MONTH(B)=MONTH(x))))),D,VLOOKUP(B,A3:B5,2),VSTACK(A2:B2,HSTACK(B,FLOOR(D/C,1)+MID(CONCAT(TAKE(UNIQUE(HSTACK(MONTH(B),RIGHT("00000"&REPT("1",MOD(D,C)),C))),,-1)),SEQUENCE(COUNT(B)),1))))
如您所知,这是一个延伸(仅证明@Scott 在评论中的观点,即通过 VBA 这可能更容易)。
如果您有 ms365 但无法访问 BETA-functions,您可以使用:
=LET(A,SEQUENCE(EOMONTH(A5,0)-A3,,A3),B,FILTER(A,(WEEKDAY(A)=5)*((DAY(A)/7)-0.1<VLOOKUP(A,A3:B5,2))),C,BYROW(B,LAMBDA(x,SUM(--(MONTH(B)=MONTH(x))))),D,VLOOKUP(B,A3:B5,2),CHOOSE({1,2},B,FLOOR(D/C,1)+MID(CONCAT(INDEX(UNIQUE(CHOOSE({1,2},MONTH(B),RIGHT("00000"&REPT("1",MOD(D,C)),C))),,2)),SEQUENCE(COUNT(B)),1)))
您只需要自己添加标题(因为没有VSTACK()
)。