经典算法
人事系统中计算员工工龄
2016-12-05 22:44:35

在Access开发的人事系统中,经常需要计算职员/员工的工龄,一般是根据离职日期(或当天日期)与入职日期对比来计算工龄,但有时不想显示为年,或月,或天,而是希望表现为 工龄为:多少年多少月。

这个代码和函数同样适用Excel. 

这就需要使用VBA来做个自定义函数了

  

实现方法:

  1. 首先在模块中增加一个自定义函数,VBA代码如下:

'

''=============================================================================================

''函数名称: GetWorkMonth  (计算工龄)  版本:1.01

''调用示例: GetWorkMonth(入职日期,离职日期)

''           gf_MsgBox(#2016/01/01#,Date())

''

''输入参数: (必需)datHireDate    Variant      入职日期

''           (必需)datDisDate     Variant      离职日期

''返    回: String

''适应版本: 97,2000,XP,2003,2007,2010,2013,2016 compatible

''作    者: 王宇虹   整理:王宇虹

''关 键 字: 工龄

''推荐指数: 3

''难度等级: 1

''适应场合: 人事系统中计算员工工龄

''说    明: 如果人事表员工有状态,可以不用离职日期来判断,可以用离职状态来判断

''=============================================================================================

''GUID: 72179DB9-68A6-4BBD-9609-1782023ABAC9 编码:1223233325 创建:2013/02/26 更新:2013/02/26

''=============================================================================================

Public Function GetWorkMonth(datHireDate As Variant, datDisDate As Variant) As String  '用date 类型有空值传递不过来 出错

    If Nz(datHireDate) <= #1/1/1900# Then  '如果入职日期为空,则直接返回00年00月

     GetWorkMonth = "00年00月"

    Else

     If Nz(datDisDate) < #1/1/1900# Then  '如果离职日期为空,则用当前日期来算工龄

        GetWorkMonth = Format(Fix(DateDiff("m", datHireDate, Date) / 12), "00") & "年" & Format((DateDiff("m", datHireDate, Date) Mod 12), "00") & "月"

     Else   '如果离职日期不为空,用离职日期与入职日期来计算工龄

        GetWorkMonth = Format(Fix(DateDiff("m", datHireDate, datDisDate) / 12), "00") & "年" & Format((DateDiff("m", datHireDate, datDisDate) Mod 12), "00") & "月"

     End If

    End If

End Function

2. 然后在查询中使用这个函数

  工龄: GetWorkMonth([入职日期],[离职时间])