问题描述
我正在尝试制作一个动态动态甘特图,其中考虑到我的一些工作日不是完整工作日。例如,如果星期五和星期六都是半工作日,而星期日是非工作日,那么从星期一开始的三个全工作日任务将在星期三完成。但是,如果同一任务在星期五开始,它将在连续的星期二完成。因此,相同的三个完整工作日任务可以在甘特图上填满三到五天。
- 如何在 Google 表格(或 Excel)甘特图上动态执行此操作?我可以做一个函数来接收任务的开始日期,考虑我所有的限制条件(例如,星期五是半天),并计算甘特图中应该填多少天?
- 是否可以使用更高的分辨率,例如 1/3 个工作日的子单位?
解决方法
这是我想出的一个公式,它可以为您提供从开始日期开始一直到右侧的累积“半天”单位。这使得创建条件格式以突出显示项目长度内的单元格变得简单。
=ARRAYFORMULA(IF(B4="",MMULT(N(VLOOKUP(TEXT(F$2:$2,"dddd"),'day guide'!B$3:D$9,3,0)*(F$2:$2>=B4)),N(F$2:$2>=TRANSPOSE(F$2:$2)))))
我会无限期地留下这张表供其他人学习。
,F2 中的公式:
=INDEX(TRANSPOSE(LEFT(TEXT(ROW(INDIRECT(1*(F1&"1/2021")&":"&
EOMONTH(1*(F1&"1/2021"),))),{"d","ddd"}),{2,1})))
D4 中的公式:
=QUERY(B4:B,"where B is not null format B 'dddd'")
E4 中的公式:
=INDEX(VALUE(F1&"1/2021")-1+TRANSPOSE(QUERY(TRANSPOSE(IFNA(IF(QUERY({
QUERY(IF(N(IFNA(SPLIT(REPT(10,DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1),0)*
TRANSPOSE(ROW(
INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021",0))))^0))=0)=0,TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18},"limit "&DAY(EOMONTH(F1&"1/2021",0))&"
offset "&MATCH(TEXT(F1&"1/2021",C12:C18,0)-1))),"select Col1+0"),QUERY(IF(N(IFNA(SPLIT(REPT(10,"select Col1+Col2"),"select Col1+Col2+Col3"),"select Col1+Col2+Col3+Col4"),"select Col1+Col2+Col3+Col4+Col5"),"select Col1+Col2+Col3+Col4+Col5+Col6"),"select Col1+Col2+Col3+Col4+Col5+Col6+Col7"),"select "&TEXTJOIN("+",1,"Col"&ROW(1:8))),"Col"&ROW(1:9))),"Col"&ROW(1:10))),"Col"&ROW(1:11))),"Col"&ROW(1:12))),"Col"&ROW(1:13))),"Col"&ROW(1:14))),"Col"&ROW(1:15))),"Col"&ROW(1:16))),"Col"&ROW(1:17))),"Col"&ROW(1:18))),"Col"&ROW(1:19))),"Col"&ROW(1:20))),"Col"&ROW(1:21))),"Col"&ROW(1:22))),"Col"&ROW(1:23))),"Col"&ROW(1:24))),"Col"&ROW(1:25))),"Col"&ROW(1:26))),"Col"&ROW(1:27))),"Col"&ROW(1:28))),IF(DAY(EOMONTH(F1&"1/2021",0))>=29,"Col"&ROW(1:29))),IFERROR(1/(0^ROW(INDIRECT("3:"&MAX(ROW(A:A)*(A:A<>""))))))),0))>=30,"Col"&ROW(1:30))),0))>=31,"Col"&ROW(1:31))),IFERROR(1/(0^ROW(INDIRECT("3:"&MAX(ROW(A:A)*(A:A<>"")))))))},"offset 1 ",0)>C4:C,F2:AJ2))*1),"select "&TEXTJOIN(",","max(Col"&ROW(INDIRECT("4:"&MAX(ROW(A:A)*(A:A<>""))))-ROW(A3)&")"))),2)
条件格式的自定义公式:
=($A4<>"")*(DAY($B4)<=(F$2*1))*(DAY($E4)>=(F$2*1))
spreadsheet demo
,我想知道您是否可以在执行此操作时避免使用繁重的数组公式。是的,您可以 - 条件格式公式仍然是一个数组公式,但是当您使用相当简单的 sumproduct 在范围内移动时,会自然地计算出越来越多的值:
=and(F$2>=$B4,SUMPRODUCT(vlookup(text($F$2:F$2,indirect("'day guide'!$B$3:$D$9"),false)*($F$2:F$2>=$B4))<=$C4)
我的结束日期公式使用两个计数来总计整天和半天,但只是一个下拉公式:
=ArrayFormula(min(if((countifs(vlookup(text(F$2:AJ$2,'day guide'!$B$3:$D$9,false),column(F$2:AJ$2),"<="&column(F$2:AJ$2),F$2:AJ$2,">="&$B4)
+countifs(vlookup(text(F$2:AJ$2,2,">="&$B4)*2)>=C4,)))