假设两个列表都从 A1 开始,把这个公式放在 Sheet2 的单元格 D2 中:
=IF(C2=0,0,IF(C2=INDEX(Sheet1!$B$2:$E$7,B2,(A2-1)*2+1),1,2))
然后选择范围 C2:C13 并打开条件格式菜单。根据公式添加 3 条新规则。第一个公式是:
=D2=1
并将格式设置为红色填充。第二个公式是:
=D2=2
并将格式设置为黄色填充。第三个公式是:
=D2=0
并将格式设置为未填充(这与未选择格式不同)。如果没有人要手动更改范围的格式,则最后一条规则不是绝对必要的。还是……
请注意,条件格式的每个公式都是在没有任何会锁定引用的 $ 的情况下编写的。因此,$C$2:$C$13 范围内的每个单元格都会将该公式相对于它自己的位置进行转换。单元格 C2 将“查看”单元格 D2,单元格 C3 将查看单元格 D3,C4 将查看 D4,依此类推。您当然可以隐藏 D 列,条件格式仍然有效。
您也可以在不使用额外列的情况下完成此操作。只需相应地编辑适用于单元格 D2 的公式并在您的规则中使用它。像这样的东西应该可以工作:
=IF(C2=0,0,IF(C2=INDEX(Sheet1!$B$2:$E$7,B2,(A2-1)*2+1),1,2))=1
=IF(C2=0,0,IF(C2=INDEX(Sheet1!$B$2:$E$7,B2,(A2-1)*2+1),1,2))=2
=IF(C2=0,0,IF(C2=INDEX(Sheet1!$B$2:$E$7,B2,(A2-1)*2+1),1,2))=0
公式详情(在 cmets 中询问)
B2 代表行。在 INDEX 函数的上下文中,它表示 INDEX 函数必须“查看”范围的哪一行(我们在这里看到的公式中的$B$2:$E$7)。如果 B2 为 1,它将考虑范围的第一行(在我们的例子中为第 2 行)。如果是 2,它将考虑第二行(在我们的例子中是第 3 行)。
(A2-1)*2+1 代表列。在 INDEX 函数的上下文中,它表示 INDEX 函数必须“查看”范围的哪一列(我们在这里看到的公式中的$B$2:$E$7)。如果结果为 1,它将考虑范围的第一列(在我们的例子中是 B 列)。如果是 2,它将考虑第二列(在我们的例子中是 C 列)。
关于(A2-1)*2+1:让我们稍微改变一下,以便在我解释它时更容易可视化:
1+(A2-1)*2
我们可以将公式分为两部分:1 作为我们的起点(第一列)和(A2-1)*2+1,它根据周的变化处理列的变化。在单元格 A2 中,我们找到周数。在第一张表中,我们每周有 2 列。因此,当周移动 1 时,我们的目标列将不得不移动 2。我们不能只将周表乘以 2,因为从第一周开始的移动计为 2,而不是实际值。在第一周,我们将没有轮班。因此,我们的班次必须为 0;但我们不能只使用 0,因为范围内没有“零列”。因此,我们需要将起始值 1 与移位相加。这样第一周我们将有:
1+(1-1)*2
1+(0)*2
1+0
1
$B$2:$E$7 范围的第一列(即 B 列)。第二周我们将有:
1+(2-1)*2
1+(1)*2
1+2
3
$B$2:$E$7 范围的第三列(即 D 列)。
整个公式IF(C2=INDEX(Sheet1!$B$2:$E$7,B2,(A2-1)*2+1),1,2) 基本上检查 C2 中的值是否与给定周的第一列相同。如果它是相同的值,则返回 1,否则返回 2(基本上假设该值将等于给定周的第二列中的值)。
报告您遇到的任何问题或错误。如果根据您的判断,此答案(或任何其他答案)是您问题的最佳解决方案,您有权接受它(link)。