用到的函数:WORKDAY、COUNTIFS
WORKDAY是计算“经过n天周六日和假期后的日期”,但我们的节假日经常需要补班所以某些周六日是需要作为“工作日”的。
因此利用countifs来计算workday公式计算得出的结果日期中包含多少天补班。
然后进行简单减法(减去多出来的那几天补班),反推出更适合中国宝宝体质的“返回在指定的若干个工作日之前/之后的日期”
注,这种方式有两个小问题:
1、补班后才休假,这种方式计算会错误,如果不多可以单独判断标记出来,进行修改,最为简便;
2、另外,这种办法计算,补班当天是包含在工作日里的
因为发现以上问题,后面加了个VBA方式的,可以解决上面两个问题
(下方列子为:初始日期(A列)经过2个工作日后是哪一天(D列)))
把公式拆解了一下:
注:留言有小伙伴发现返回日期不一定是工作日,原因在于补班是在休假前就会出现。
公式我没办法解决了,vba不太会写,但还是努力思考了一下。
但有潜在问题:如果日期列表列出来的不全,那么计算有可能会出错。
计算逻辑:“当天”向后计算经过 n个工作日时,经过lm天,然后“当天"+m
基础准备:需要一张列明所有日期,且标注当天是不是节假日的表格
判断是不是节假日的计算方式可以参考我的 :
VBA代码:
Sub 测试()
Sheets("Sheet2").Select '数据所在页签(sheet)(我习惯确认页签,不然在别的页签运行会错乱)
d = Range("G2").Value 'G2单元格写了需要计算经过多少个工作日
For i = 2 To 366 '需要计算的开始行(2)到结束行(366)
k = Range("A" & i).Value 'A是日期所在列
n = 0 '后面用来计算经过了几个工作日
m = 0 '后面用来计算经过了几天
Do While n < d
If Range("C" & i + m + 1).Value = "休" Then 'C是日期休假记录所在列,位置和条件可以更改
m = m + 1
n = n + 0
Else
m = m + 1
n = n + 1
End If
Cells(i, 4) = k + m '4是第4列的意思,i指的是第i 行
Loop
Next
End Sub