要求: 1、当年入职在15号前算一个月出勤,16号后入职则当月不算出勤月; 2、如果累计病事假不超过15天,不扣除出勤月分数,如果超过15天(含),扣除一个月出勤。
一、计算出勤月数 E7:=MIN(12,DATEDIF($D7,DATE($C$4,12,31),"M")+IF(DAY($D7)<=15,1,0)) 函数说明 1、min 函数表达式=min(number1,number2,...) 用途:从多个数或者一个与区域里找出最小值。 2、datedif 函数表达式=datedif(start_date,end_date,unit) 用途:计算两个日期之间的整年数参数用"Y"、整月数参数用"M"、天数参数用"D"。 3、if 函数表达式:=if(logical_test,value_if_true,value_if_false) 用途:如果合同类别没有填时返回空值,有填写合同类别,用函数组合计算流水号。 4、day 函数表达式:=day(serial_number) 用途:将日期中的天取出来。 5、嵌套公式说明 公式段1:IF(DAY($D7)<=15,1,0) 如果入职在15号前,加1个月,如果是16号后加0个月。 公式段2:DATEDIF($D7,DATE($C$4,12,31),"M") 计算入职日期到计算年终奖这一年的12月31号,共计出勤了多少个月。 MIN(12,公式段2+公式段1) 如果超过12个月按12个月算,没有超过12个月显示实际工作月份数。
二、请假扣除月数 G7:=ROUNDUP(INT($F7/15)/2,0) 1、int 函数表达式:=int(number) 把数值或者公式计算的结果取整数。 2、roundup 函数表达式:=roundup(number,num_digits) 用途:将数值或者公式计算结果,保留指定小数位,并向上舍入。 由于超过半个月要扣一个月。比如45天是1.5个月,要扣2个月,而44天则不足1.5月,只扣1个月。 所以我们先把日期计算出有多少个15天(不足15天的通过int舍弃小数部分)。再/2,只可能有两种结果:完全除尽、位数是0.5。所以,这个时候要用向上舍入的roundup函数来实现。 3、嵌套公式说明 巧妙利用int舍弃和roundup向上舍入,以15天作为单元,来计算扣除年终奖的月数。 |