VBA实战篇|HR们的福利,从此不再为整理考勤记录发狂

论坛 期权论坛 期权     
Excel和VBA大讲堂   2019-7-8 06:06   2220   0
提示:这是7月的第1篇原创文章关于整理『考勤记录』的案例如果你喜欢本文,就分享给你的小伙伴,你的喜欢是我前进的最大动力如果你有任何疑问,可以文章下方留言或后台留言
在HR的日常工作中,统计考勤是其中一项工作。虽然现在有考勤机、钉钉等高科技的手段进行辅助,但是有些考勤机导出的数据会让各位HR们集体吐槽为何如此反人类的设计。
如下图所示,是我一位HR朋友发我的考勤记录(数据已做部分处理),看到这样的一份数据,你是否觉得崩溃呢?


如下图所示,为了便于进行考勤统计,这是期望达到的效果

解决思路:
  • 确定目标和思路:
    遇到问题首先确定『目标结果』,在思考实现目标的思路
  • 观察数据:
    确定好思路后,观察数据是否具备一定的规律,怎么才能在这个思路下快速将数据处理成想要的格式。
    以本案例为例:
    ①考勤时间;
    ②工号;
    ③姓名以上都是固定的列,工号和姓名的行号会不同,但是每一名员工的考勤数据是占用两行的;
    ④每天的考勤是储存在一个单元格中,点进去你会发现并未使用换行符,也就意味着打卡时间均为XX:XX5个字符的格式,通过这个来判断打过几次卡:
    ⑤由于6月是30天,所以第4行是到30号,但是每月天数不同,要考虑到这个问题
  • 设计解决方案:
    ①确定数据范围:
    ②判断人员和对应考勤数据位置;
    ③判断该员工当天打卡次数
  • 测试和修改思路,直至实现结果
解决方案的代码如下:
  1. Sub CleanData()
  2. Application.ScreenUpdating = False
  3. Dim maxRow As Long, maxCol As Long, arr
  4. Sheet2.Range("2:1048576").Delete
  5. maxRow = Sheet1.Range("a65536").End(xlUp).Row
  6. maxCol = Sheet1.Range("IV4").End(xlToLeft).Column
  7. If Sheet1.Cells(maxRow, "a") = "工 号:" Then
  8.     maxRow = maxRow + 1
  9. Else
  10.     maxRow = maxRow
  11. End If
  12. arr = Sheet1.Range(Sheet1.Cells(5, "A"), Sheet1.Cells(maxRow, maxCol))
  13. For i = 1 To UBound(arr) Step 2
  14.     If arr(i, 1) = "工 号:" Then
  15.         For k = 1 To maxCol
  16.             If Len(arr(i + 1, k)) > 0 Then
  17.                 For j = 1 To Len(arr(i + 1, k)) / 5
  18.                     With Sheet2
  19.                         Erow = .Range("a65536").End(xlUp).Row + 1
  20.                         .Cells(Erow, "A") = arr(i, 3)
  21.                         .Cells(Erow, "B") = arr(i, 11)
  22.                         .Cells(Erow, "C") = Mid(Sheet1.Range("c3"), 1, 8) & k
  23.                         .Cells(Erow, "D") = Mid(arr(i + 1, k), 5 * j - 4, 5)
  24.                         .Cells(Erow, "E") = Format(Mid(Sheet1.Range("c3"), 1, 8) & k, "aaaa")
  25.                     End With
  26.                 Next
  27.             Else
  28.                 With Sheet2
  29.                     Erow = .Range("a65536").End(xlUp).Row + 1
  30.                     .Cells(Erow, "A") = arr(i, 3)
  31.                     .Cells(Erow, "B") = arr(i, 11)
  32.                     .Cells(Erow, "C") = Mid(Sheet1.Range("c3"), 1, 8) & k
  33.                     .Cells(Erow, "E") = Format(Mid(Sheet1.Range("c3"), 1, 8) & k, "aaaa")
  34.                 End With
  35.             End If
  36.         Next   
  37.     End If
  38. Next
  39. Application.ScreenUpdating = True
  40. End Sub
复制代码
[h3]总结:[/h3]
  • 现实工作中,不存在完美的数据,清理数据是必备的一项技能
  • 遇到问题,首先搞懂自己想要的『结果』是什么,一切思路要紧紧围绕这个结果
  • 只要思路清晰,解决的方法有多种,清晰的思路+工具的合理使用,你将不会在为这种问题困扰
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP