李鼎文 徐昌欣 郭偉
中圖分類號(hào):C37 文獻(xiàn)標(biāo)識(shí):A 文章編號(hào):1674-1145(2018)8-203-04
摘要 本文介紹了某公司考勤加班統(tǒng)計(jì)的規(guī)則、原始考勤數(shù)據(jù)進(jìn)行預(yù)先數(shù)據(jù)處理的方法,文中依據(jù)考勤規(guī)則進(jìn)行了統(tǒng)計(jì),介紹了相應(yīng)的統(tǒng)計(jì)代碼,并通過(guò)Ⅶ編寫(xiě)的程序?qū)崿F(xiàn)自動(dòng)統(tǒng)計(jì),最后文章介紹了應(yīng)用效果。
關(guān)鍵詞 考勤管理 加班時(shí)間統(tǒng)計(jì) 數(shù)據(jù)處理 VB
目前,企業(yè)在進(jìn)行考勤管理的過(guò)程中,一般采用了考勤機(jī)來(lái)對(duì)考勤進(jìn)行記錄,并進(jìn)行一系列考勤情況統(tǒng)計(jì),比如遲到早退人員統(tǒng)計(jì)、曠工人數(shù)統(tǒng)計(jì)、請(qǐng)假情況統(tǒng)計(jì)、加班情況統(tǒng)計(jì)等,其中加班情況統(tǒng)計(jì)是經(jīng)常進(jìn)行的一種。在有的中小企業(yè)中,只有考勤機(jī)記錄的初始記錄,沒(méi)有進(jìn)一步的考勤統(tǒng)計(jì)分析軟件,怎樣利用考勤初始記錄,進(jìn)行考勤加班統(tǒng)計(jì),是中小企業(yè)常常面對(duì)的問(wèn)題。本人在工作中,利用VB編寫(xiě)小程序,通過(guò)對(duì)考勤初始數(shù)據(jù)的進(jìn)行預(yù)處理,然后對(duì)加班情況進(jìn)行統(tǒng)計(jì),取代了手工進(jìn)行考勤加班計(jì)算的狀況,減輕了考勤統(tǒng)計(jì)人員的工作量,并提高了工作的準(zhǔn)確性。本人將考勤加班統(tǒng)計(jì)的方法、部分源碼及計(jì)算過(guò)程整理出來(lái),以饗讀者。
一、考勤加班統(tǒng)計(jì)規(guī)則的設(shè)定
為方便進(jìn)行考勤管理,必須首先設(shè)定考勤規(guī)則,讓員工有考勤依據(jù),方能準(zhǔn)確的打卡,知道自己的考勤情況。某企業(yè)中,對(duì)考勤加班統(tǒng)計(jì)規(guī)則設(shè)計(jì)如下:
1.平時(shí)上班時(shí)間,每天5點(diǎn)半以后算下班,6點(diǎn)之后刷卡算加班。
2.節(jié)假日全天可算加班。
3.平時(shí)上班時(shí)間,加班超過(guò)2.5個(gè)小時(shí)以上,給予一次餐補(bǔ)。
4.節(jié)假日加班,一次加班時(shí)間超過(guò)3個(gè)小時(shí),給予一次餐補(bǔ),7小時(shí)以上,兩次餐補(bǔ)封頂。二、考勤原始數(shù)據(jù)處理某企業(yè)中,考勤刷卡的原始數(shù)據(jù)如下圖所示,該數(shù)據(jù)是由考勤機(jī)的記錄導(dǎo)出的excel數(shù)據(jù)。
原始數(shù)據(jù)包括部門、姓名、考勤號(hào)、刷卡時(shí)間、記錄狀態(tài)、機(jī)器號(hào)等六個(gè)數(shù)據(jù)項(xiàng)。在進(jìn)行考勤加班統(tǒng)計(jì)之前,需要對(duì)原始數(shù)據(jù)進(jìn)行三個(gè)方面的預(yù)處理:1.去掉一次刷卡記錄下來(lái)的多次刷卡記錄。2.標(biāo)注是正常上班時(shí)間還是節(jié)假日。3.取出正常上班時(shí)間超出18:00的刷卡數(shù)據(jù),做為加班統(tǒng)計(jì)的依據(jù)。
1.去掉多次刷卡數(shù)據(jù),將刷卡數(shù)據(jù)間隔小于5分鐘的數(shù)據(jù)去掉,即原始數(shù)據(jù)的間隔小于0.08的,刪除后面的數(shù)據(jù)。代碼如下:
For i=1 To totalnum-1 Step 1
If sheet ds.Cells(i,3)=sheet ds.Cells(i+1,3)And Year(sheet ds.Cells(i,4))=Year(sheet ds.Cells(i+1,4))And Month(sheet ds.Cells(i,4))=Month(sheet ds.Cells(i+1,4))And Day(sheet ds.Cells(i,4))=Day(sheet ds.Cells(i+1,4))And Round((Hour(sheet ds.Cells(i+1,4))-Hour(sheet ds.Cells(i,4))+(Minute(sheet ds.Cells(i+1,4))-Minute(sheet ds.Cells(i,4)))/6f), 2)<=0.08 Then
p=p+1
Else
sheet_ds1.Cells(i-p,1)=sheet ds.Cells(i,2)
sheet_ds1.Cells(i-p,2)=sheet ds.Cells(i,4)
sheet_ds1.Cells(i-p,3)=sheet ds.Cells(i,5)
shret_ds1.Cells(i-p,4)=sheet ds,Cells(i,3)
p=0
2.對(duì)原始數(shù)據(jù)標(biāo)注是平時(shí)上班時(shí)間還是節(jié)假日。首先通過(guò)人機(jī)界面確定哪些是休息日,再逐一標(biāo)注,如果是平時(shí)刷卡數(shù)據(jù)第五列標(biāo)注為0,如果是節(jié)假日刷卡數(shù)據(jù)第五列標(biāo)注為1。代碼如下:
Do While sheet so.Cells(totalnum,3) 統(tǒng)計(jì)記錄條數(shù)
totalnum=totalnum+1
Loop
totalnum=totalnum+1
For i=2 To tatalnum Step 1
sheet ds.Cells(i-1,1)=sheet so.Cells(i,1)
sheet ds.Cers(i-1,2)=sheet so.Cells(i,2)
sheet ds.Cells(i-1,3)=sheet so.Cells(i,3)
sleet ds.Cells(i-1,4)=sheet so.Cells(i,4)
sheet ds.Cells(i-1,5)=0
Forj=1 Tok-1Step 2
If Day(sheet so.Cells(i,4)=a(j)Then
sheet ds.Cells(i-1,5)=1
End If
Next j
Next i
3.取出正常上班時(shí)間超出18:00的刷卡數(shù)據(jù)。
If sheet_ds1. Cells(i,3)=0 And Hour(sheet_ds1.Cells(i,2))>=18Then '平時(shí)刷卡時(shí)間過(guò)了18:00的記錄
sheet ds2.Cells(i-p,1)=sbeet_ds1.Cells(i,1)
sheet ds2.Cells(i-p,2)=sheet_ds1.Cells(i,2)
sheet ds2.Cells(i-p,3)=sheet_ds1.Cells(i,3)
sheet ds2.Cells(i-p,7)=sheet_ds1.Celis(i,4)
totalnum1=totalnum1+1
Else
p=p+1
End If
End If
Next i
三、依據(jù)統(tǒng)計(jì)規(guī)則對(duì)預(yù)處理后的數(shù)據(jù)進(jìn)行計(jì)算
1.以考勤號(hào)為關(guān)鍵字,統(tǒng)計(jì)當(dāng)日休息時(shí)段刷卡的次數(shù),及將刷卡次數(shù)累加計(jì)入第四列。
For i=1 To totalnum1 Step 1 '計(jì)算打卡記錄數(shù)
If(Day(sheet_ds 2.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
sheet ds2.Cells(i,4)=b
b=1
End If
Next i
2.依據(jù)刷卡次數(shù)區(qū)分奇數(shù)次和偶數(shù)次刷卡,并按平時(shí)加班及休息日加班分別對(duì)加班時(shí)間進(jìn)行統(tǒng)計(jì),并計(jì)算餐補(bǔ)。這一共有三種情況:
(1)正常上班時(shí)間、休假時(shí)間的偶數(shù)次打卡,此時(shí)計(jì)算兩次刷卡記錄之差即為加班時(shí)間。然后分別按照正常上班時(shí)間和休假時(shí)間的餐補(bǔ)計(jì)算規(guī)則,統(tǒng)計(jì)餐補(bǔ)數(shù)量即可。即正常上班時(shí)加班時(shí)間超過(guò)2.5小時(shí),給予一次餐補(bǔ),休假時(shí)間一次加班時(shí)間超過(guò)3小時(shí),給予一次餐補(bǔ),7小時(shí)以上給予兩次餐補(bǔ),將餐補(bǔ)結(jié)果計(jì)入第6列。
For i=1 To totalnum1 Step 1 '統(tǒng)計(jì)加班時(shí)間If sheet_ds2.Cells(i,4)And(sheet_ds2.Cells(i,4)Mod2=0)Then '正常上班時(shí)間、休假時(shí)間,偶數(shù)次打卡
sheet ds2.Cells(i,5)=0
sheet ds2.Cells(i,6)=0
For j=0 To sheet ds2.Cells(i,4)-2 Step 2
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)
If Round((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.5 Andsheet ds2.Cells(i,3)=0 Then '統(tǒng)計(jì)餐補(bǔ)
sheet_ds2.Cells(i,6)=i
Else
If Round((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)>=7 Andsheet_ds2.Cells(i,3)=1 Then
sheet_ds2.Cells(i,6)=2
End If
If Round((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)>3 AndRound((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)<7 Andsheet_ds2.Cells(i,3)=1 And sheet_ds2.Cells(i,6)<2 Then'統(tǒng)計(jì)餐補(bǔ)
sheet_ds2.Cells(i,6)=sheet_ds2.Cells(i,6)+1
End If'
End If.
Next j
(2)正常上班時(shí)間奇數(shù)次打卡,此時(shí)計(jì)算最后一次刷卡與17:30之差即為加班時(shí)間,然后依據(jù)加班時(shí)間和餐補(bǔ)規(guī)則計(jì)算餐補(bǔ)。
If sheet_ds2.Cells(i,4)And sheet_ds2.Cells(i,3)=0 And(sheet_ds2.Cell(i,4)Mod2=1)Then' 正常上班時(shí)間,奇數(shù)次打卡
sheet_ds2.Cells(i,5)=0
sheet_ds2.Cells(i,6)=0
sheet_ds2.Cells(i,5)=Round/(Hour(sheet_ds2.Cells(i-sheet_ds2.Cells(i,4)+1,2))-17+(Minute(sheet_ds2.Cells(i-sheet_ds2.Cells(i,4)+1,2))-30)/60),2)
If sheet_ds2.Cells(i,5)>2.5 Then'統(tǒng)計(jì)餐補(bǔ)
sheet_ds2.Cells(i,6)=1
End If
If shell_ds2.Cells(i,4)>1 Then
For j=0 To sheet_ds2.Cells(i,4)-3 Step 2
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)
If Round((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)>2.5 Then統(tǒng)計(jì)餐補(bǔ)
sheet_ds2.Cells(i,6)=1
End If
Next j
End If
End If
(3)休假時(shí)間奇數(shù)次打卡,此時(shí)計(jì)算第一次刷卡與最后一次刷卡之差即為加班時(shí)間,然后依據(jù)加班時(shí)間和餐補(bǔ)規(guī)則計(jì)算餐補(bǔ)即可。
If sheet_ds2.Cells(i,4)And sheet_ds2.Cells(i,3)=1 And(sheet_ds2.Cells(i,4)Mod 2=1)Then '休假時(shí)間,奇數(shù)次打卡
sheet_ds2.Cells(i,6)=0
sheet_ds2.Cells(i,5)=Round((Hour(sheet_ds2.Cells(i,2))-Hour(sheet_ds2.Cells(i-sheet_ds2.Cells(i,4)+1,2))+(Minute)sheet_ds2.Cells(i,2))-Minute(sheet_ds2.Cells(i-sheet_ds2.Cells(i,4)+1,2)))/60),2)
If sheet_ds2.Cells(i,5)>3 And sheet_ds2.Cells(i,5)<7 And sheet_ds2.Cells(i,6)<2 Then '統(tǒng)計(jì)餐補(bǔ)
sheet_ds2.Cells(i,6)=sheet_ds2.Cells(i,6)+1
Else
If sheet_da2.Cells(i,5)>=7 Then
sheet_ds2.Cells(i,6)=2
End If
End If
End If
End If
Next i
四、依據(jù)得到的結(jié)果,制作報(bào)表計(jì)算每日加班時(shí)間和當(dāng)月加班總時(shí)間,及每日餐補(bǔ)數(shù)和該月餐補(bǔ)數(shù)。程序如下:
pk=2
For i=1 To totalnum1 Step 1'制作報(bào)表
If sheet ds2.Cells(i,4)Then
sheet_ds3.Cells(pk,1)=sheet_ds2.Cells(i,1)
sheet_ds3.Cells(pk,2)=sheet_ds2.Cells(i,7)
sheet_ds3.Cells(pk,3)=DateSerial(Year(sheet_ds2.Cells(i,2)),Month(sheet_ds2.Cells(i,2)),Day(sheet_ds2.Cells(i,2)))
sheet_ds3.Cells(pk,4)=sheet-ds2.Cells(i,5)
sheet_ds3.Cells(pk,5)=sheet_ds2.Cells(i,6)
pk=pk+1
End If
Next i
totaladd=sheet_ds3.Cells(2,4)
totalcount=sheet_ds3.Cells(2,5)
For i=2 To pk+1 Step1
if(sheet_ds3.Celts(i,2)=sheet_ds3.Cells(i+1,2))Then
totladd=tataladd+sheet_ds3.cells(i+1,4)
totalcount=totalcount+sheet_ds3.Cells(i+1,5)
Else
sheet_ds3.Cells(i,6)=totaladd
sheet_ds3.Cells(i,7)=totalcount
totaladd=sheet_ds3.Cells(i+1,4)
totalcount=sheet_ds3.Cells(i,1,5)
End If
Next i
End If
五、運(yùn)行效果
(一)程序界面
通過(guò)人工輸入休息日,來(lái)區(qū)分正常上班時(shí)間和節(jié)假日日期,點(diǎn)擊加班統(tǒng)計(jì)即可進(jìn)行統(tǒng)計(jì)計(jì)算。
1.統(tǒng)計(jì)過(guò)程。
通過(guò)不斷建立Worksheet,逐層遞進(jìn)得進(jìn)行計(jì)算,最后得到最后的統(tǒng)計(jì)結(jié)果。
(1)標(biāo)注是平時(shí)工作日還是節(jié)假日。
(2)去掉時(shí)間間隔小于5分鐘的數(shù)據(jù)并取出正常工作日18:00以后的數(shù)據(jù)。
(3)計(jì)算當(dāng)日刷卡次數(shù),并統(tǒng)計(jì)加班時(shí)間及餐補(bǔ)。
(4)最終統(tǒng)計(jì)結(jié)果。
六、應(yīng)用效果
該統(tǒng)計(jì)軟件已經(jīng)在某公司穩(wěn)定運(yùn)行了一段時(shí)間,減輕了考勤統(tǒng)計(jì)人員的工作量,提高了統(tǒng)計(jì)的準(zhǔn)確性,保障了公司的考勤管理工作的穩(wěn)定運(yùn)行,取得了較好的管理效能。
參考文獻(xiàn):
[1]唐勇.RFID身份識(shí)別考勤系統(tǒng)設(shè)計(jì)[J].2013(6).
[2]劉宇.基于WEB的企業(yè)定制考勤系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].2013(11).
[3]楊洋.基于-NET的人事考勤管理系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)[J].2011(6).