【需求】
正常情(qíng)況下,從考勤機中導出的(de)初始數據中,每人每天肯定會多次打卡。
相應的,考勤數據(jù)統計工作(zuò)中,很重要的一件事情就(jiù)是從中剔除“無效”的打卡數據。比如說:
- 從上午多次考勤數據中(zhōng),提取第一次打卡數據;
- 從下午多次考勤數據(jù)中,提取最後(hòu)一次打卡數據。
例如,某人2014年9月18日下(xià)午有2條打卡數據,具(jù)體如下圖:
圖 1 初始考(kǎo)勤數據(jù)示例
處理後,我們(men)要提取“22:41”的考勤數據,並用於下一步的統計,如下圖:
圖 2 提取結果示例
【方法】
Step1:初始數據的初(chū)步處理:
1.1 將日期、時間分割開來,並分兩列存儲:
圖 3 日期、時間分列效果示例
【說明】
- 這個數據數據截取功能(néng);
- 截取日期的公式為:=MID(D3,1,FIND(" ",D3)-1)
-截取時間的公式為(wéi):=MID(D3,FIND(" ",D3)+1,LEN(D3)-FIND(" ",D3))
1.2 判斷(duàn)每條數據屬於上午打卡還是下午打卡:
這個很簡單,直接用分離(lí)出來的(de)打卡時間於12:00去比較即可:
=IF(TIMevalsUE(I4)>=TIMevalsUE("12:00:00"),"下午","上午(wǔ)")
1.3 判斷每條數據屬於上午/下午第幾次打卡:
這個也不(bú)難,屬於表中數據的多條件計數:
=COUNTIFS(A:A,A3,H:H,H3,J:J,J3)
Step1的處理結果如圖3所示。
Step2:從Step1處(chù)理後的(de)數據中(zhōng)剔除“無效數據”並存(cún)儲到另一張表中:
這一步處理起來比較(jiào)繁瑣。如果(guǒ)借助VBA操作,那麽效率會比較好。具體的邏輯也(yě)比較簡單:
※ 按照行依次判斷;
※ 如果重(chóng)複次數(shù)為“1”,則直接取該行(háng)數據,放到目標工作表;
※ 如果重複次數大於“1”,並且是(shì)上午打卡(kǎ),那(nà)麽取(qǔ)當天上午所有打卡數據的第一行數據存儲;
※ 如果重複次數大於(yú)“1”,並且是下午(wǔ)打卡,那麽取當天上午所有(yǒu)打卡數據的最後一行數據存儲;
※ 依據(jù)每次取數結果,判(pàn)斷下次從哪一行開始讀數。
圖 4 上午、下午選取了兩種不同的處理方式
實現Step2的功(gōng)能,具體的代碼如下:
---------------------------------------------------------------------------------------------------------------
Sub 去除重複數據_待改進()
Dim i As Integer '考勤數據源行數循(xún)環變量
Dim j As Integer '確定在考勤數(shù)據源中已經找到了第幾行
Dim k As Integer '確定02-去除無效打卡中(zhōng)已經到(dào)了第幾行
Dim l As Integer '某人、某天上午/下午(wǔ)共打了多少次卡判(pàn)斷
Dim m As Integer
Dim rng_staffcode As Range
Dim rng_date As Range
Dim rng_time As Range
Set rng_staffcode = Worksheets("01-考勤數據源").Range("A3:" & "A" & Range("A65536").End(xlUp).Row)
Set rng_date = Worksheets("01-考勤數據源").Range("H3:" & "H" & Range("A65536").End(xlUp).Row)
Set rng_time = Worksheets("01-考勤數據源").Range("J3:" & "J" & Range("A65536").End(xlUp).Row)
j = 3
k = 2
For i = 3 To Worksheets("01-考(kǎo)勤數據源").Range("A65536").End(xlUp).Row
l = Worksheets("01-考(kǎo)勤數據源").Range("K" & i)
If l > 1 And Worksheets("01-考勤(qín)數據源").Range("J" & i) = "下午" Then
Worksheets("02-去除無效打卡(kǎ)").Range("A" & k) = Worksheets("01-考勤數據(jù)源").Range("A" & i + l - 1) '提取員工編號
Worksheets("02-去除無(wú)效打卡").Range("B" & k) = Worksheets("01-考勤數據源").Range("B" & i + l - 1) '提取姓名
Worksheets("02-去除無效打卡").Range("C" & k) = Worksheets("01-考勤數據源").Range("C" & i + l - 1) '提取部門
Worksheets("02-去除無效(xiào)打卡(kǎ)").Range("D" & k) = Worksheets("01-考勤(qín)數據(jù)源").Range("H" & i + l - 1) '提取日期
Worksheets("02-去除(chú)無效打卡").Range("E" & k) = Worksheets("01-考勤數據源").Range("I" & i + l - 1) '提取時(shí)間
Worksheets("02-去除無效打卡").Range("F" & k) = Worksheets("01-考勤數(shù)據源").Range("J" & i + l - 1) '提取上/下午
k = k + l - 1
i = i + l
ElseIf l > 1 And Worksheets("01-考勤(qín)數據源").Range("J" & i) = "上午" Then
Worksheets("02-去除無效(xiào)打卡").Range("A" & k) = Worksheets("01-考勤數據源").Range("A" & i) '提取員工編號
Worksheets("02-去除無效打卡").Range("B" & k) = Worksheets("01-考勤數據源").Range("B" & i) '提取姓名
Worksheets("02-去除(chú)無(wú)效打卡(kǎ)").Range("C" & k) = Worksheets("01-考勤數據源(yuán)").Range("C" & i) '提(tí)取部門
Worksheets("02-去除無(wú)效打(dǎ)卡").Range("D" & k) = Worksheets("01-考勤(qín)數據(jù)源").Range("H" & i) '提取日期
Worksheets("02-去除無效打卡").Range("E" & k) = Worksheets("01-考勤(qín)數據(jù)源").Range("I" & i) '提取時間
Worksheets("02-去除無效打卡(kǎ)").Range("F" & k) = Worksheets("01-考勤(qín)數據源").Range("J" & i) '提取上/下午
k = k + l - 1
i = i + l
Else
Worksheets("02-去除無效打卡").Range("A" & k) = Worksheets("01-考勤數據源").Range("A" & i) '提取員(yuán)工編號
Worksheets("02-去除無效打卡").Range("B" & k) = Worksheets("01-考勤數據(jù)源").Range("B" & i) '提取姓名
Worksheets("02-去除無效打卡").Range("C" & k) = Worksheets("01-考勤數據源").Range("C" & i) '提取部門
Worksheets("02-去除無效打卡").Range("D" & k) = Worksheets("01-考勤數據源").Range("H" & i) '提取日期
Worksheets("02-去除無效打卡").Range("E" & k) = Worksheets("01-考勤數據源").Range("I" & i) '提取時間
Worksheets("02-去除無效打卡").Range("F" & k) = Worksheets("01-考勤數據源").Range("J" & i) '提取上/下午
k = k + 1
End If
Next i
Worksheets("02-去除無效打卡").UsedRange.Font.Name = "微軟雅黑(hēi)"
Worksheets("02-去除無效打卡").UsedRange.Borders.LineStyle = xlContinuous
Worksheets("02-去除(chú)無效打卡").UsedRange.Columns.AutoFit
Worksheets("02-去除無(wú)效打卡").UsedRange.HorizontalAlignment = xlCenter
Worksheets("02-去除無效(xiào)打卡(kǎ)").UsedRange.VerticalAlignment = xlCenter
End Sub
---------------------------------------------------------------------------------------------------------------
【說(shuō)明(míng)】
- HR寫的代碼,大家將就著用!
- 如果嫌麻煩,可以直接找我要帶著代碼的Excel表。