office_tools 版 (精华区)

发信人: redfox (食人族), 信区: OA
标  题: Excel:工龄的计算
发信站: 哈工大紫丁香 (2000年06月17日22:44:57 星期六), 站内信件

   “工龄”是人事管理和劳资管理中经常涉及到的一项重要内容,员工的升迁
、薪资和各种福利想必都与之有关吧!这个东东可千万不能算错,不然会有人来找
麻烦哟!
    若只需要大致计算出几名员工的工龄或许按按计算器就能搞定了,但若需要准
确计算出成百上千名员工的工龄,恐怕就……没关系,别忘了你手头还有强大的
Excel!
    在Excel里,将两个日期值相减,即可得出其中间隔的天数(以序列数表示)
,但这个数字并不是我们所需要的最终结果。你能说,“XXX的工龄是3721天”吗
?当然不行。所以,我们需要的是“XX年XX月XX天”这样的格式,而不是单纯的“
XXXX天”。
    既然要求已经提出来了,那么该如何进行计算呢?有朋友可能要说了,这还不
简单?把前面得到的天数除以365,不就是年数了?其余数除以30,不就是月数了
?再剩下的,就是天数嘛。当然,这样的算法可以大致计算出我们需要的数字,但
不准确。因为,一年并不都是365天,一个月也并不都是30天,所以这种算法存在
着相当的误差,而在某些特殊的日期下,误差可能相差一个月!不信的话自己试试

    想要算得既快又准,在Excel里还真不是三五个公式就能解决的,以至于有了
下面这个自定义的公式Elapsed()。源代码(已加注释)已在文末附上,了解
VBA的朋友可以看看,不知道VBA的朋友大可按说明“复制”——“粘贴”后,放到
脑后去好了。下面先来讲一讲它的用法。
    Elapsed(StartDate , EndDate,ReturnType)带有三个参数:依次为开始
日期,结束日期和返回类型。大家只需在使用时依次给出相应参数值,函数就会自
动计算出以年,月,天表示的两日期间间隔的天数。ReturnType有三个参选项,1
表示返回年数,2表示月数,3表示天数,因为每次只能选择其中一种参选项,所以
别指望Elapsed()一次就为你干完所有的活儿!
    介绍完Elapsed(),我们再来看看具体的计算方法吧:
    假设已有一工作表中记录了各员工的入公司日期,需要计算截止今日时的工龄
期,我们可以先用公式计算今日的日期值,这样的话到了明天也就不必重算了。我
们往C2单元格中输入公式“=TODAY()”,这是取计算机的当前系统日期值。
    假设各员工的入公司日期都记录在C列中,则我们通过D、E、F三列来分别计算
工龄的年数、月数和天数。以第六行的“张三”为例,D6、E6、F6中的公式分别为
“=Elapsed($C6,$C$2,1)”、“=Elapsed($C6,$C$2,2)”、“=Elapsed($C6,
$C$2,3)”。接着在G6中用公式将上面计算的结果转换成易于理解的文本形式。这
个公式就可以自由发挥了,您可以按自己的喜好进行设置。如:“=IF(D6=0,
IF(E6=0,"未满一个月",E6&"个月"),IF(E6=0,D6&"年整",D6&"年"&"零"&E6&"个月
"))”——这个公式舍弃了不常用到的“天数”,并对0年或0个月这样较特殊的计
算结果进行了更人性化的转换。

    最后要做的,就是将D6、E6、F6、G6抹黑,往下拖曳,进行公式的复制。
    到此,所有员工的工龄全部都计算完毕了!

附代码如下:
Function Elapsed(StartDate As Date, EndDate As Date, ReturnType As 
Integer)
Dim StartYear As Integer '定义变量用以参数中开始日期的计算
Dim StartMonth As Integer
Dim StartDay As Integer
Dim EndYear As Integer '定义变量用以参数中结束日期的计算
Dim EndMonth As Integer
Dim EndDay As Integer
StartYear = Year(StartDate) '从参数中取得开始日期和结束日期的年数,月数,
天数
StartMonth = Month(StartDate)
StartDay = Day(StartDate)
EndYear = Year(EndDate)
EndMonth = Month(EndDate)
EndDay = Day(EndDate)

If EndDay < StartDay Then '如果结束日期参数中的天数小于开始日期参数的天
数,则...
EndDay = EndDay + (DateSerial(EndYear, EndMonth + 1, EndDay) _
- DateSerial(EndYear, EndMonth, EndDay))
EndMonth = EndMonth - 1 '...从月数中借1后再进行减运算,从而得到相差天数
End If
If EndMonth < StartMonth Then '如果结束日期参数中的月数小于开始日期参数
的月数,则..
EndMonth = EndMonth + 12
EndYear = EndYear - 1 '...从年数中借1后再进行减运算,从而得到相差月数
End If
Select Case ReturnType '如果没有以上特殊情况,则直接进行相减的运算
Case 1 '返回年数
Elapsed = EndYear - StartYear
Case 2 '返回月数
Elapsed = EndMonth - StartMonth
Case 3 '返回天数
Elapsed = EndDay - StartDay
End Select


End Function

    在你的工作簿中打开VBA编辑器,新建一个模块,将以上代码输入即可! 


--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.224.229]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.420毫秒