基于数据处理技术的考勤加班时间统计
作者:未知中图分类号:C37文献标识:A文章编号:1674-1145(2018)8-203-04摘要本文介绍了某公司考勤加班统计的规则、原始考勤数据进行预先数据处理的方法,文中依据考勤规则进行了统计,介绍了相应的统计代码,并通过Ⅶ编写的程序实现自动统计,最后文章介绍了应用效果。
关键词考勤管理加班时间统计数据处理VB
目前,企业在进行考勤管理的过程中,一般采用了考勤机来对考勤进行记录,并进行一系列考勤情况统计,比如迟到早退人员统计、旷工人数统计、请假情况统计、加班情况统计等,其中加班情况统计是经常进行的一种。在有的中小企业中,只有考勤机记录的初始记录,没有进一步的考勤统计分析软件,怎样利用考勤初始记录,进行考勤加班统计,是中小企业常常面对的问题。本人在工作中,利用VB编写小程序,通过对考勤初始数据的进行预处理,然后对加班情况进行统计,取代了手工进行考勤加班计算的状况,减轻了考勤统计人员的工作量,并提高了工作的准确性。本人将考勤加班统计的方法、部分源码及计算过程整理出来,以飨读者。
一、考勤加班统计规则的设定
为方便进行考勤管理,必须首先设定考勤规则,让员工有考勤依据,方能准确的打卡,知道自己的考勤情况。某企业中,对考勤加班统计规则设计如下:
1.平时上班时间,每天5点半以后算下班,6点之后刷卡算加班。
2.节假日全天可算加班。
3.平时上班时间,加班超过2.5个小时以上,给予一次餐补。
4.节假日加班,一次加班时间超过3个小时,给予一次餐补,7小时以上,两次餐补封顶。二、考勤原始数据处理某企业中,考勤刷卡的原始数据如下图所示,该数据是由考勤机的记录导出的excel数据。
原始数据包括部门、姓名、考勤号、刷卡时间、记录状态、机器号等六个数据项。在进行考勤加班统计之前,需要对原始数据进行三个方面的预处理:1.去掉一次刷卡记录下来的多次刷卡记录。2.标注是正常上班时间还是节假日。3.取出正常上班时间超出18:00的刷卡数据,做?榧影嗤臣频囊谰荨?
1.去掉多次刷卡数据,将刷卡数据间隔小于5分钟的数据去掉,即原始数据的间隔小于0.08的,删除后面的数据。代码如下:
Fori=1Tototalnum-1Step1
Ifsheetds.Cells(i,3)=sheetds.Cells(i+1,3)AndYear(sheetds.Cells(i,4))=Year(sheetds.Cells(i+1,4))AndMonth(sheetds.Cells(i,4))=Month(sheetds.Cells(i+1,4))AndDay(sheetds.Cells(i,4))=Day(sheetds.Cells(i+1,4))AndRound((Hour(sheetds.Cells(i+1,4))-Hour(sheetds.Cells(i,4))+(Minute(sheetds.Cells(i+1,4))-Minute(sheetds.Cells(i,4)))/6f),2)=18Then'平时刷卡时间过了18:00的记录
sheetds2.Cells(i-p,1)=sbeet_ds1.Cells(i,1)
sheetds2.Cells(i-p,2)=sheet_ds1.Cells(i,2)
sheetds2.Cells(i-p,3)=sheet_ds1.Cells(i,3)sheetds2.Cells(i-p,7)=sheet_ds1.Celis(i,4)
totalnum1=totalnum1+1
Else
p=p+1
EndIf
EndIf
Nexti
三、依??统计规则对预处理后的数据进行计算
1.以考勤号为关键字,统计当日休息时段刷卡的次数,及将刷卡次数累加计入第四列。
Fori=1Tototalnum1Step1'计算打卡记录数
If(Day(sheet_ds2.Cells(i,2)))=(Day(sheet_ds2.Cells(i+1,2)))And(Manth(sheet_ds2.Cells,2)))=(Month(sheet_ds2.Cells(i+1,2)))And(Year(sheet_ds2.Cells(i,2)))=(Year(sheet_ds2.Cells(i+1,2)))And(sheet_ds2.Cells(i,7)=sheet_ds2.Cells(i+1,7))Then
b=b+1
Else
sheetds2.Cells(i,4)=b
b=1
EndIf
Nexti
2.依据刷卡次数区分奇数次和偶数次刷卡,并按平时加班及休息日加班分别对加班时间进行统计,并计算餐补。这一共有三种情况:
(1)正常上班时间、休假时间的偶数次打卡,此时计算两次刷卡记录之差即为加班时间。然后分别按照正常上班时间和休假时间的餐补计算规则,统计餐补数量即可。即正常上班时加班时间超过2.5小时,给予一次餐补,休假时间一次加班时间超过3小时,给予一次餐补,7小时以上给予两次餐补,将餐补结果计入第6列。
Fori=1Tototalnum1Step1'统计加班时间Ifsheet_ds2.Cells(i,4)And(sheet_ds2.Cells(i,4)Mod2=0)Then'正常上班时间、休假时间,偶数次打卡
sheetds2.Cells(i,5)=0
sheetds2.Cells(i,6)=0
Forj=0Tosheetds2.Cells(i,4)-2Step2
sheet_ds2.Cells(i,5)=Round((sheet_ds2.Cells(i,5)+Hour(sheet_ds2.Cells(i-j,2))-Hour(sheet_ds2.Cells(i-j-1,2))+(Minute(sheet_ds2.Cells(i-j,2))-Minute(sheet_ds2.Cells(i-j-1,2)))/60),2)
IfRound((HOUr(sheet_ds2.Cells(i-j,2))-Hoor(sheet_ds2.Cells(i-j-1,2))+(Minute(sheet_ds2.Cells(i-j,2))-Minute(sheet_ds2.Cells(i-j-1,2)))/60),2)>2.5Andsheetds2.Cells(i,3)=0Then'统计餐补
sheet_ds2.Cells(i,6)=i
Else
IfRound((Hour(sheet_ds2.Cells(i-j.2))-Hour(sheet_ds2.Cells(i-j-1,2))+(Minute(sheet_ds2.Cells(i-j,2))-Minute(sheet_ds2.Cells(i-j-1,2)))/60),2)>=7Andsheet_ds2.Cells(i,3)=1Then
sheet_ds2.Cells(i,6)=2
EndIf
IfRound((Hour(sheet_ds2.Cells(i-j,2))-Hour(sheet_ds2.Cells(i-j-1,2))+(Minute(sheet_ds2.Cells(i-j,2))-Minute(sheet_ds2.Cells(i-j-1,2)))/60),2)>3AndRound((Hour(sheet_ds2.Cells(i-j,2))-Hour(sheet_ds2.Cells(i-j-1,2))+(Minute(sheet_ds2.Cells(i-j,2))-Minnee(sheet_ds2.Cells(i-j-1,2)))/60),2)