用到的函数:WORKDAY、COUNTIFS

WORKDAY是计算“经过n天周六日和假期后的日期”,但我们的节假日经常需要补班所以某些周六日是需要作为“工作日”的。

因此利用countifs来计算workday公式计算得出的结果日期中包含多少天补班。

然后进行简单减法(减去多出来的那几天补班),反推出更适合中国宝宝体质的“返回在指定的若干个工作日之前/之后的日期”

注,这种方式有两个小问题:

1、补班后才休假,这种方式计算会错误,如果不多可以单独判断标记出来,进行修改,最为简便;

2、另外,这种办法计算,补班当天是包含在工作日里的

因为发现以上问题,后面加了个VBA方式的,可以解决上面两个问题

(下方列子为:初始日期(A列)经过2个工作日后是哪一天(D列)))

工作日公示时间的计算 Java_计算逻辑

 把公式拆解了一下:

工作日公示时间的计算 Java_工作日公示时间的计算 Java_02

注:留言有小伙伴发现返回日期不一定是工作日,原因在于补班是在休假前就会出现。

工作日公示时间的计算 Java_工作日公示时间的计算 Java_03

公式我没办法解决了,vba不太会写,但还是努力思考了一下。

但有潜在问题:如果日期列表列出来的不全,那么计算有可能会出错。

计算逻辑:“当天”向后计算经过 n个工作日时,经过lm天,然后“当天"+m

基础准备:需要一张列明所有日期,且标注当天是不是节假日的表格

判断是不是节假日的计算方式可以参考我的 :

工作日公示时间的计算 Java_excel_04

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