Excel VBA之日期篇 4.6 临时工结算无烦恼 月末日期是关键
前景提要
每到年末都是每个公司人员流动比较大的月份,因为这几个月都是人员离职,入职的高峰期,在这样的情况下,公司的某些岗位可能就会出现人手不足的情况,在这样的情况下,一些公司就会不得不招聘一些兼职或者是临时工来临时顶替下,请临时工是比较容易的时候,人才市场有很多临时工,但是在月末结算临时工的工钱的时候,就成为了很多HR比较头疼的问题了,因为临时工进入公司的时候各不相同,同时他们工作的时间也不尽相同,这也导致在财务统计上面非常的头疼,虽然之前我们学了如何通过datediff方法来计算两个日期之间的差距,但是现在的问题就是很多财务都是月底统一出账的,而月底最后一天的日期又不尽相同,那我们应该如何来计算。
方法分析
前面我们已经分析了想要实现这样的效果的最大的问题就是月底最后一天的日期,按照日期来看,有些月份有30天,有些月份有31天,有些月份还有28天,29天的,这也给统计工作带来了烦恼,不可能每次都在代码中将日期写死了,这样并不是一个合格的小脚本,今天就来和大家分享下月底最后一天日期的算法,这里我们需要学习一个日期类的新方法,E0MOTHN方法,他的语法形式是这样的:EOMONTH(start_date,months) ,需要提供两个参数,开始日期,另外一个就是月份数,这个月份数的意思就是,如果你想要得到开始日期当月的最后一天,那就是0,如果想要得到一个月之后的月末最后一天,那就是1,我们来看看案例会更好理解一点。
场景模拟
假设现在我们手上有这样的一份临时工和兼职的入职时间,因为财务都是在月底统一结算工资的,所以这里我们的计算周期都是按照月末最后一天来结算的,前面的7个临时工都是当月结算,当月走人的,后面的7个兼职则是2个月之后走人的,2个月之后一起结算的
我们这里需要使用到E0MOTHN方法,来看看代码
Sub test()
Dim i
For i = 2 To 14
If i < 7 Then
Cells(i, "g") = WorksheetFunction.EoMonth(Cells(i, "f"), 0)
Else
Cells(i, "g") = WorksheetFunction.EoMonth(Cells(i, "f"), 2)
End If
Cells(i, "h") = DateDiff("d", Cells(i, "f"), Cells(i, "g")) & "天"
Next i
End Sub
效果展示下
很轻松就算出了当月的最后一天的日期,以及兼职的天数,完美的实现了我们的要求。
代码解析
这里我们来看看EoMonth的使用方法
If i < 7 Then
Cells(i, "g") = WorksheetFunction.EoMonth(Cells(i, "f"), 0)
Else
Cells(i, "g") = WorksheetFunction.EoMonth(Cells(i, "f"), 2)
End If
前7行,我们假设需要得到当月的最后一天的日期,这里我们需要留意EoMonth最后一个参数,是0,因为是当月的日期,所以这里直接写0 就可以了,不需要在进行叠加了。
而后面7行,我们假设需要计算两个月之后的月末最后一天的日期,因为是2个月,所以EoMonth的的最后一个参数要写成2,这样得到的就是2个月之后的那个月份的最后一天的日期了,比方说2月,2个月之后就是4月,得到的结果就是4月的最后一天的日期,4-30
之后的工作天数就直接使用我们之前学过的datediff方法就可以得到了。