根据时间和特定日期分配值(2个不同的变量)

时间:2016-09-21 01:28:34

标签: excel if-statement nested-if

我正在尝试根据工作表中记录的时间和日期将特定的工作班次字母分配给新列。

我创建了2个新字段,使计算更容易。

  • 使用我的“日期”列(“m / dd / yyyy”),我创建了一个名为“WeekDay”的列,它基本上显示每个记录的日期,其数字为1到7 (1 =星期一5 =星期五等)。
  • 使用我的“时间”栏(“hh:mm AM / PM”),我创建了一个名为“Day of Day”的列,根据时间显示0到24之间的数字 我的记录(即:5:40 AM = 5)

我想要使用的工作班次如下:

  • 班次 - 周一至周五6至14小时。
  • B班次 - 周一至周五14至22小时。
  • C班次 - 周一至周五22至6小时。
  • WD(周末日)轮班 - 周六和周日从6到18小时。
  • WN(周末之夜)轮班 - 太阳和太阳从18到6小时。

以下是我所做的,代码可以工作,但仅适用于A,B和C的移位。我无法使其工作,因此,它还包括WD和WN。

=IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<14,OR([@WeekDay]=1,[@WeekDay]=2,[@WeekDay]=3,[@WeekDay]=4,[@WeekDay]=5)),"A",
IF(AND([@[Hour of Day]]<22,[@[Hour of Day]]>=14,OR([@WeekDay]=1,[@WeekDay]=2,[@WeekDay]=3,[@WeekDay]=4,[@WeekDay]=5)),"B",
IF(AND([@[Hour of Day]]>=22,[@[Hour of Day]]<6,OR([@WeekDay]=1,[@WeekDay]=2,[@WeekDay]=3,[@WeekDay]=4,[@WeekDay]=5)),"C",
IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<18,OR([@WeekDay]=6,[@WeekDay]=7)),"WD",
IF(AND([@[Hour of Day]]>18,[@[Hour of Day]]>0,[@[Hour of Day]]<6,OR([@WeekDay]=6,[@WeekDay]=7)),"WN","C")))))

2 个答案:

答案 0 :(得分:0)

您上一次的IF状况有问题。你有小时&gt; 18和小时&lt; 6永远不会满足。你需要将它分成两个if语句。如果Day = 6或7且Hour> 18,然后是WN,否则如果Day = 7或1并且小时&lt; 6,然后

=IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<14,OR([@Weekday]=1,[@Weekday]=2,[@Weekday]=3,[@Weekday]=4,[@Weekday]=5)),"A",
IF(AND([@[Hour of Day]]<22,[@[Hour of Day]]>=14,OR([@Weekday]=1,[@Weekday]=2,[@Weekday]=3,[@Weekday]=4,[@Weekday]=5)),"B",
IF(AND([@[Hour of Day]]>=22,[@[Hour of Day]]<6,OR([@Weekday]=1,[@Weekday]=2,[@Weekday]=3,[@Weekday]=4,[@Weekday]=5)),"C",
IF(AND([@[Hour of Day]]>=6,[@[Hour of Day]]<18,OR([@Weekday]=6,[@Weekday]=7)),"WD",
IF(AND([@[Hour of Day]]>=18,OR([@Weekday]=6,[@Weekday]=7)),"WN",
IF(AND([@[Hour of Day]]<6,OR([@Weekday]=1,[@Weekday]=7)),"WN","C"))))))

更新

考虑到@Jaquez指出的原始配方中的缺陷,我制定了这个公式。

=IF((FLOOR((([@Weekday]*24+[@[Hour of Day]]-6)+7*24)/24,1))<6,CHOOSE(ROUNDUP([@[Hour of Day]]/8,0),"A","B","C"),IF((MOD([@S2],24))<12,"WD","WN"))

我正计算从一周开始的小时数,并将其抵消6,以消除C天的重叠。然后我使用模式将班次分为工作日的8小时班次和周末的12班班次。

匆忙这样做,如果您需要更详细的解释,请告诉我。

答案 1 :(得分:0)

就像@eshwar提到的那样,主要的问题是AND(Hour>=22,Hour<6)永远不会成真。将其更改为OR(Hour<6,Hour>=22)并且您主要在那里。但如果您按照下面的说明进行操作,则可以完全删除它以消除混淆。

首先,相反重复自己,我会将一周中的某一天拉到父IF中以简化逻辑。而不是针对每个可能的值检查工作日,只需检查是否Weekday<=5并且您已经节省了更多。

这也会使父Weekday>=6的{​​{1}}部分中出现[value_if_false],因为在那里的任何内容已经是周末,您只需检查时间是否为{ {1}} IF

这为AND(Hour>=6,Hour<18)留下了同样的原始问题,即"WD"而不是"WN",但由于这又是唯一剩下的选项,因此您也可以省略它OR(Hour<6,Hour>=18)部分AND

我已经使用缩进来显示嵌套:

"WN"

产生这个:

[value_if_false]

希望这种格式化和简洁性使其更容易理解,减少逻辑错误的可能性。

更新:无法放手!

这涵盖了Shift C每周五晚上到周六工作的情况,而Shift WN周日晚上工作到周一:

=IF(WeekDay<=5,
    IF(AND(Hour_of_Day>=6,Hour_of_Day<14),"A",
       IF(AND(Hour_of_Day>=14,Hour_of_Day<22),"B","C")),
    IF(AND(Hour_of_Day>=6,Hour_of_Day<18),"WD","WN"))

产生这个:

    1   2   3   4   5   6   7
0   C   C   C   C   C   WN  WN
1   C   C   C   C   C   WN  WN
2   C   C   C   C   C   WN  WN
3   C   C   C   C   C   WN  WN
4   C   C   C   C   C   WN  WN
5   C   C   C   C   C   WN  WN
6   A   A   A   A   A   WD  WD
7   A   A   A   A   A   WD  WD
8   A   A   A   A   A   WD  WD
9   A   A   A   A   A   WD  WD
10  A   A   A   A   A   WD  WD
11  A   A   A   A   A   WD  WD
12  A   A   A   A   A   WD  WD
13  A   A   A   A   A   WD  WD
14  B   B   B   B   B   WD  WD
15  B   B   B   B   B   WD  WD
16  B   B   B   B   B   WD  WD
17  B   B   B   B   B   WD  WD
18  B   B   B   B   B   WN  WN
19  B   B   B   B   B   WN  WN
20  B   B   B   B   B   WN  WN
21  B   B   B   B   B   WN  WN
22  C   C   C   C   C   WN  WN
23  C   C   C   C   C   WN  WN