【发布时间】:2017-09-25 06:28:24
【问题描述】:
我正在 Excel 中构建一个日程安排工具。这包括具有开始和结束日期的任务列表,以及可以分配给每个任务的人员。
为了能够将此数据输出到我们的预算系统中,我需要能够计算在给定月份内预订的员工时间的百分比(所有任务的总和)。
我可以使用以下公式计算员工在给定月份内完成单个给定任务的可用时间:
=SUM(INDEX(WorkdayArrayMonCol,MATCH(B2,WorkdayArrayDateCol)):INDEX(WorkdayArrayFriCol,MATCH(C2,WorkdayArrayDateCol))*TRANSPOSE('Staff Profile'!$B$13:$B$17))
这非常适合单个任务,但我需要一个可以跨一系列任务工作的等效项。
我的尝试目前看起来像这样:
=IFERROR(MMULT(MMULT(TRANSPOSE(ROW(INDEX(WorkdayArrayMonCol,MATCH(B2:B12,WorkdayArrayDateCol)):INDEX(WorkdayArrayFriCol,MATCH(C2:C12,WorkdayArrayDateCol)))^0),INDEX(WorkdayArrayMonCol,MATCH(B2:B12,WorkdayArrayDateCol)):INDEX(WorkdayArrayFriCol,MATCH(C2:C12,WorkdayArrayDateCol))),'Staff Profile'!$B$13:$B$17),0)
+ctrl+shift+enter
公式使用索引/匹配查找B2:B12 (task start date) and C2:C12 (task end date):
如果任务超出当前月份的范围,则使用0 (0/01/1900)。这些搜索表WorkdayArray
有 6 列,日期、星期一、星期二.... 到星期五,然后返回日期范围的二维数组,其中包含要对每个工作日中有多少在该范围内求和的值。这是准确捕捉公共假期所必需的。
然后将此二维数组乘以工作人员的工作可用性,即'Staff Profile'!$B$13:$B$17,5 个值中的每一个为 0>=>1,表示周一至周五。例如,如果他们在周二工作半天,而在一周的其余时间工作一整天,这 5 个单元格将看起来像 {1,0.5,1,1,1}。
使用此处发布的技术:How to use an array formula to return an array of sums in Excel 我已设法将其压缩为一个向量,但我无法将其总结为最终总数。
使用上面的公式,输出为{8.5;4;2;2;0;0;0;0;0;0;1},这是每个任务的可用工作日,但是我尝试使用链接的MMULT 技术对这些结果数据求和,SUMPRODUCT、SUM 或@987654336 @keep 导致返回相同的数据:{8.5;4;2;2;0;0;0;0;0;0;1}
由于要在每个财政月 (y) 重复此计算,因此在每个工作人员 (x) 中使用 (z) 表作为 x、y 和 z 中的每一个来进行 3D excel 表示是不可行的大得不切实际。我宁愿不使用 VBA,而且我已经足够接近,似乎应该可以使用公式。
非常感谢!
编辑:Zac 要求的单页版本(相同公式,调整参考):
单张版:
.
我选择了 11 个单元格来说明数组结果(我想要的是输出这些值之和的公式,17.5)。
【问题讨论】:
-
您能否提供一个可能包含虚拟数据的工作表样本?这将有助于测试公式。您拥有的仅显示 2 列
-
@Zac 我已经上传了一张单张变体的屏幕截图,希望对您有所帮助。从我阅读的内容来看,链接到外部文件似乎违反了这里的政策,我没有看到附加文件的本地方式。
-
我不认为没有 VBA 是可行的。但在这里我有一个较短的公式(不是数组公式)供您尝试,来自
cell E2:=IFERROR(SUM(MMULT(OFFSET($K$1,MATCH(B2,WorkdayArrayDateCol,0),1,MATCH(C2,WorkdayArrayDateCol,0)-MATCH(B2,WorkdayArrayDateCol,0)+1,5),$S$3:$S$7)),0)
标签: excel multidimensional-array excel-formula