您要查看的是 NETWORKDAYS.INTL。将此与自定义设置结合使用,以确定星期六、星期日的数量以及开始和结束时间之间的天数。你知道你每天有 X 个非工作时间,每个星期六有 Y 个时间。
那么你的公式本质上就变成了
(End time - start time) - X * No. Weekdays - Y * No. Saturdays - No. Sundays - No. Holidays
现在这里会有一些技巧来计算你的日子。但这就是它归结为公式的要点。
首当其冲的公式是:
工作日
NETWORKDAYS.INTL
时间
我通过使用布尔运算避免使用 if 语句,当通过数学运算符发送时,excel 将从 TRUE/FALSE 解析为 1/0。旁注:我在某处读到这也比 IF 语句更快,但无法证明这一点,并且在少量计算中确实无关紧要。
工作日
此公式将返回给定日期的星期几,并将星期几设置为 1。在此解决方案中需要确定结束日期是否为值为 7 的星期六在默认设置中以及选择选项 1 时。公式的格式为:
WORKDAY(Excel Serial date, day 1 of the week)
对于这个解决方案
WEEKDAY(B3,1)
NETWORKDAYS.INTL
此公式将用于计算开始日期和结束日期的特定天数。它可以排除自定义周末或计算自定义周。如果它提供了一个假期日期列表,它们也可以被排除在外。公式的基本格式是:
NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)
输入公式时,它会为您提供周末选择的预定义选项列表。它不会谈论模式。
模式是一个 7 位长的字符串,由 1 或 0 组成。0 代表您要计算的天数,1 是您要忽略的天数。该模式的一个重要部分是第一个条目是星期一。 “1010111”只计算周二和周四。
时间
Excel 将日期存储为整数。 1 代表 1900 年 1 月 1 日,2 代表 1900 年 1 月 2 日,依此类推。时间存储为小数,或者如果您更喜欢一天或 24 小时周期的百分比/分数。因此,与其算出数学来确定一天 X 小时数的百分比是多少,不如让 excel 为我们计算它并让稍后可能会破译公式的人更容易理解这个数字。公式的基本格式是:
TIME(Hours, Minutes, Seconds)
所以如前所述,需要确定 6 个关键组件:
- X - 工作日后的非工作时间
- Y - 星期六之后的非工作时间
- 工作日数
- 周六数
- 星期日数
- 节假日数
1) 确定工作日的非工作时间
根据提供的信息,工作日在 1730 停止并从 0830 开始。有几种计算方法。从 24 小时中减去工作时间或计算一天结束时的非工作时间,然后在一天开始时将它们添加到非工作时间中。
24 - (17.5 - 8.5) = 15
or
(24 - 17.5) + (8.5 - 0) = 15
对于本例,15 将被硬编码到最终公式中
2) 确定周六非工作时间
同上。请注意,我们忽略了星期日,因为它是指定的非工作日,我们已经知道它是 24 小时或 1 天。我们只对周六轮班结束和下一个周一正常工作开始之间的时间感兴趣。所以它真的得到了相同的计算,只是不同的班次结束时间。
24 - (13.5 - 8.5) = 19
or
(24- 13.5) - (8.5 - 0) = 19
对于本例,19 将被硬编码到最终公式中
3) 确定工作日数
根据 NETWORKDAYS.INT 之前的描述并假设假期存储在 F2:F2 范围内,并使用“0000011”模式,公式将如下所示:
=NETWORKDAYS.INTL(B2,B3,"0000011",F2)
对于此示例,公式位于单元格 F6
中
4) 确定周六数
类似 3) 使用“1111101”调整模式以仅选择星期六
=NETWORKDAYS.INTL(B2,B3,"1111101",F2)
对于此示例,公式位于单元格 F7
中
5) 确定星期日的数量
类似 4) 使用“1111110”调整模式以仅选择星期六
=NETWORKDAYS.INTL(B2,B3,"1111110",F2)
对于本例,公式位于单元格 F8
中
6) 确定假期数
要获得假期的数量,没有直接的方法。取而代之的是不计入节假日的所有天数与计入节假日的所有天数之间的差值。
=NETWORKDAYS.INTL(B2,B3,"0000000")-NETWORKDAYS.INTL(B2,B3,"0000000",$F$2:F2)
对于此示例,公式位于单元格 F9
中
现在我想说的是,只需将以上所有内容替换为通用公式,但有几个特殊情况需要注意。您可能还注意到我还没有使用 WEEKDAY 公式。
因此,为了计算 X 将应用的天数,它实际上是天数减 1。负 1 是因为您想要控制天数之间的间隔,而不是天数本身。当结束日是星期六时,这会变得有点棘手,因为那里仍然有一个间隔,但星期六不算作工作日。所以工作日间隔数的真实计数是:
=MAX(0,(F6-1+(WEEKDAY(B3,1)=7)))
我最初有 MAX(0, calc) 以防止天数为负数的可能性。在达到此最终格式后,可能不再需要它,您可能会得到以下但未经测试的结果:
=F6-1+(WEEKDAY(B3,1)=7)
同样的概念需要应用到您的星期六计数。如果您的工作在星期六结束,则不需要减去最后一个星期六之后的非工作时间。你的公式看起来像:
=MAX(0,(F7-(WEEKDAY(B3,1)=7)))
需要进一步测试以确保可以删除 MAX,但如果可以,那么公式将如下所示:
=F7-(WEEKDAY(B3,1)=7)
所以现在了解日期和时间是如何存储的,确定开始结束时间之间的时间差并减去所有非工作时间。
=(B3-B2)-MAX(0,(F6-1+(WEEKDAY(B3,1)=7)))*TIME(15,0,0)-MAX(0,(F7-(WEEKDAY(B3,1)=7)))*TIME(19,0,0)-F8-F9
现在您不想使用辅助单元格,因此您可以将每个单独的公式从 F6 带到 F9 并最终得到:
=(B3-B2)-MAX(0,(NETWORKDAYS.INTL(B2,B3,"0000011",F2)-1+(WEEKDAY(B3,1)=7)))*TIME(15,0,0)-MAX(0,(NETWORKDAYS.INTL(B2,B3,"1111101",F2)-(WEEKDAY(B3,1)=7)))*TIME(19,0,0)-NETWORKDAYS.INTL(B2,B3,"1111110",F2)-(NETWORKDAYS.INTL(B2,B3,"0000000")-NETWORKDAYS.INTL(B2,B3,"0000000",$F$2:F2))
公式看起来不规则,但分解成各个部分后更容易理解。
现在最后一步是让答案在几分钟内显示。有两种选择。
-
您可以将其保留为 Excel 序列日期格式,并将其格式更改为自定义格式 [m]。 [ ] 将强制它进入几分钟并防止溢出到几个小时。它也会四舍五入到最接近的分钟。
-
您可以通过乘以 24*60 将结果转换为分钟,该值将以分钟和分钟的小数为单位。
请注意:
A11 已应用时间格式
A12 已应用常规格式
A14 应用了 [m] 的自定义格式