提示:这是7月的第1篇原创文章关于整理『考勤记录』的案例如果你喜欢本文,就分享给你的小伙伴,你的喜欢是我前进的最大动力如果你有任何疑问,可以文章下方留言或后台留言 在HR的日常工作中,统计考勤是其中一项工作。虽然现在有考勤机、钉钉等高科技的手段进行辅助,但是有些考勤机导出的数据会让各位HR们集体吐槽为何如此反人类的设计。
如下图所示,是我一位HR朋友发我的考勤记录(数据已做部分处理),看到这样的一份数据,你是否觉得崩溃呢?
如下图所示,为了便于进行考勤统计,这是期望达到的效果
解决思路:
- 确定目标和思路:
遇到问题首先确定『目标结果』,在思考实现目标的思路
- 观察数据:
确定好思路后,观察数据是否具备一定的规律,怎么才能在这个思路下快速将数据处理成想要的格式。
以本案例为例:
①考勤时间;
②工号;
③姓名以上都是固定的列,工号和姓名的行号会不同,但是每一名员工的考勤数据是占用两行的;
④每天的考勤是储存在一个单元格中,点进去你会发现并未使用换行符,也就意味着打卡时间均为XX:XX5个字符的格式,通过这个来判断打过几次卡:
⑤由于6月是30天,所以第4行是到30号,但是每月天数不同,要考虑到这个问题
- 设计解决方案:
①确定数据范围:
②判断人员和对应考勤数据位置;
③判断该员工当天打卡次数
- 测试和修改思路,直至实现结果
解决方案的代码如下:- Sub CleanData()
- Application.ScreenUpdating = False
- Dim maxRow As Long, maxCol As Long, arr
- Sheet2.Range("2:1048576").Delete
- maxRow = Sheet1.Range("a65536").End(xlUp).Row
- maxCol = Sheet1.Range("IV4").End(xlToLeft).Column
- If Sheet1.Cells(maxRow, "a") = "工 号:" Then
- maxRow = maxRow + 1
- Else
- maxRow = maxRow
- End If
- arr = Sheet1.Range(Sheet1.Cells(5, "A"), Sheet1.Cells(maxRow, maxCol))
- For i = 1 To UBound(arr) Step 2
- If arr(i, 1) = "工 号:" Then
- For k = 1 To maxCol
- If Len(arr(i + 1, k)) > 0 Then
- For j = 1 To Len(arr(i + 1, k)) / 5
- With Sheet2
- Erow = .Range("a65536").End(xlUp).Row + 1
- .Cells(Erow, "A") = arr(i, 3)
- .Cells(Erow, "B") = arr(i, 11)
- .Cells(Erow, "C") = Mid(Sheet1.Range("c3"), 1, 8) & k
- .Cells(Erow, "D") = Mid(arr(i + 1, k), 5 * j - 4, 5)
- .Cells(Erow, "E") = Format(Mid(Sheet1.Range("c3"), 1, 8) & k, "aaaa")
- End With
- Next
- Else
- With Sheet2
- Erow = .Range("a65536").End(xlUp).Row + 1
- .Cells(Erow, "A") = arr(i, 3)
- .Cells(Erow, "B") = arr(i, 11)
- .Cells(Erow, "C") = Mid(Sheet1.Range("c3"), 1, 8) & k
- .Cells(Erow, "E") = Format(Mid(Sheet1.Range("c3"), 1, 8) & k, "aaaa")
- End With
- End If
- Next
- End If
- Next
- Application.ScreenUpdating = True
- End Sub
复制代码 [h3]总结:[/h3]- 现实工作中,不存在完美的数据,清理数据是必备的一项技能
- 遇到问题,首先搞懂自己想要的『结果』是什么,一切思路要紧紧围绕这个结果
- 只要思路清晰,解决的方法有多种,清晰的思路+工具的合理使用,你将不会在为这种问题困扰
|
|