我正在为我们的工程轮岗制定一个简单的时间表。一些背景信息,我们团队目前有 6 名工程师,必须每周早上 5 点轮岗。此外还有第二班轮岗,每位工程师必须轮岗 2 周。
我有一个范围内的工程师名单,可以使用以下函数自动调整其大小。
=OFFSET(LookupLists!$B$2,0,0,COUNTA(LookupLists!$B:$B)-1,1)
这样,如果我需要在轮换中添加或删除人员,只需从该列表中添加或删除姓名即可。
我在单元格中定义了一个变量,标记为“第二班次的天数”(当前为 10 天或 2 个工作周),这样我就可以轻松修改每个工程师在第二班次上花费的时间。
为了列举第二个轮班计划,我使用了以下函数。
=INDEX(Engineers,MOD(ROUNDDOWN((ROW(A1)-1)/LookupLists!$C$2,0),LookupLists!$D$2)+1)
这将枚举一份为期 X 天的工程师列表,其中 x = 第二班的天数,然后转到“工程师”列表中的下一位工程师。
棘手的部分是凌晨 5 点的时间表。如果工程师上第二班,他们就不属于凌晨 5 点的轮班。我正在寻找某种功能,以便通过“工程师”定义的列表枚举凌晨 5 点的时间表,但如果工程师上第二班,他们的名字将被跳过,列表将移动到下一个值,直到所有 X 名工程师都被考虑在内,列表重新开始。最好这个列表基于一个函数自动生成,当我更新工程师列表或“第二班天数”时,该函数将更新。
日程表示例
所用变量的示例
期望输出的示例
期望输出
答案1
我能够使用以下公式找到更优雅的答案:
=INDEX(Engineers,AGGREGATE(15,6,ROW(Engineers)-1/(Engineers<>Schedule!$D3),MOD((ROWS($1:1)-1),ROWS(Engineers)-1)+1))
我很感谢你的帮助!
答案2
为了解决这个问题,你需要一些辅助列:
:警告:
为了正确可视化,我只使用了两个数据集,分别是杰克&约翰,您需要根据需要扩展它们。
怎么运行的:
插入
1
单元格 M2。单元格 M3 中的公式:
=M2+O$2
。单元格 Q2 中的公式:
=IFERROR(IF(ROW(A1)<=O$2*P$2,ROWS($A$1:A1),NA()),"")
单元格 R2 中的公式:
=INT(((ROW(A1)-1)/5))*5+0
单元格 U2 中的公式:
=VLOOKUP(Q2,M$2:N$7,2)
T2 中的最终数组(CSE)公式:
{=INDEX($N$2:$N$7,SMALL(IF((INDEX($N$2:$N$7,,1)<>$U2),MATCH(ROW($N$2:$N$7),ROW($N$2:$N$7)),""),IF(ROW(A1)<=5,ROWS(T$2:$T2),ROWS(T$2:$T2)-R2)),COLUMNS($A$1:A1))}
注意:
- 使用以下代码在单元格 T2 中完成数组(CSE)公式Ctrl+Shift+Enter。
- 根据需要调整公式中的单元格引用。
- 为了以后整洁,您可以隐藏辅助列。