Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2566|回复: 6

[已解决]如何对打卡机倒出的数据标注“正常”、“迟到”、“早退”、“未打卡”

[复制链接]
发表于 2016-12-21 14:59 | 显示全部楼层 |阅读模式
各位大侠,现在公司要求打卡上班,实行早九晚五制,早上9点上班,下午17点下班,12点至14点为休息时间。
我想把从打卡机里导出的数据重新导入一个新的表,并标注出上下午“早退”、“迟到”、“正常”“未打卡”的情况。详见附件。
万分感谢!!
最佳答案
2016-12-22 11:12
请查收附件,结果输出在另外一个表中,输出了两个结果一个是中间过程,即将时间去对应匹配,另外一个是你要的最终结果,其实两个For语句可以合并成一个,即直接输出你要的结果,这个你自己可以修改,我这样编写的目的在于你能理解中间的处理过程。另外这样做其实还是有问题,比如我一天就打两次卡,12:10:00一次,下午17:00:00一次,我的程序会认为造成没有打卡,中午下班打了卡,下午上班未打卡,下午下班正常,但实际情况可能是上午这个人休息,中午的12:10:00可能是下午的上班打卡!具体情况你自己斟酌!
  1. Sub 打卡数据转换()
  2.     Dim dc As Object
  3.     Dim arr, i As Integer, n As Integer, brr(), m As Integer, x As Integer
  4.     Dim 日期 As Date, 时间 As Date, 早上 As Date, 中下 As Date, 午上 As Date, 晚下 As Date
  5.     Set dc = CreateObject("Scripting.Dictionary")
  6.     早上 = #9:00:00 AM#
  7.     中下 = #12:00:00 PM#
  8.     午上 = #2:00:00 PM#
  9.     晚下 = #5:00:00 PM#
  10.     With Sheet1
  11.         n = .Cells(.Rows.Count, 1).End(xlUp).Row
  12.         arr = .Range("A2:D" & n)
  13.     End With
  14.     For i = 1 To n - 1
  15.         日期 = Application.Text(arr(i, 4), "yyyy-m-d")
  16.         时间 = Application.Text(arr(i, 4), "hh:mm:ss")
  17.         If Not dc.Exists(arr(i, 3) & "_" & 日期) Then
  18.             m = m + 1
  19.             dc.Add arr(i, 3) & "_" & 日期, m
  20.             ReDim Preserve brr(1 To 7, 1 To m)
  21.             brr(1, m) = arr(i, 1)
  22.             brr(2, m) = arr(i, 2)
  23.             brr(3, m) = 日期
  24.             Select Case 时间
  25.                 Case Is < 早上
  26.                     brr(4, m) = 时间
  27.                 Case Is < 中下
  28.                     brr(4, m) = 时间
  29.                 Case Is < 午上
  30.                     brr(5, m) = 时间
  31.                 Case Is < 晚下
  32.                     brr(6, m) = 时间
  33.                 Case Is >= 晚下
  34.                     brr(7, m) = 时间
  35.             End Select
  36.         Else
  37.             x = dc(arr(i, 3) & "_" & 日期)
  38.             Select Case 时间
  39.                 Case Is < 早上
  40.                     brr(4, x) = 时间
  41.                 Case Is < 中下
  42.                     If brr(4, x) = "" Then brr(4, x) = 时间 Else brr(5, x) = 时间
  43.                 Case Is < 午上
  44.                     If brr(5, x) = "" Then brr(5, x) = 时间 Else brr(6, x) = 时间
  45.                 Case Is < 晚下
  46.                     If brr(6, x) = "" Then brr(6, x) = 时间 Else brr(7, x) = 时间
  47.                 Case Is >= 晚下
  48.                     brr(7, x) = 时间
  49.             End Select
  50.         End If
  51.     Next
  52.     Sheet2.Range("A2").Resize(m, 7) = Application.WorksheetFunction.Transpose(brr)
  53.     For i = 1 To m
  54.         If brr(4, i) = "" Then
  55.             brr(4, i) = "未打卡"
  56.         ElseIf brr(4, i) <= 早上 Then
  57.             brr(4, i) = "正常"
  58.         Else
  59.             brr(4, i) = "迟到"
  60.         End If
  61.         
  62.         If brr(5, i) = "" Then
  63.             brr(5, i) = "未打卡"
  64.         ElseIf brr(5, i) < 中下 Then
  65.             brr(5, i) = "早退"
  66.         Else
  67.             brr(5, i) = "正常"
  68.         End If
  69.         
  70.         If brr(6, i) = "" Then
  71.             brr(6, i) = "未打卡"
  72.         ElseIf brr(6, i) <= 午上 Then
  73.             brr(6, i) = "正常"
  74.         Else
  75.             brr(6, i) = "迟到"
  76.         End If
  77.         
  78.         If brr(7, i) = "" Then
  79.             brr(7, i) = "未打卡"
  80.         ElseIf brr(7, i) < 晚下 Then
  81.             brr(7, i) = "早退"
  82.         Else
  83.             brr(7, i) = "正常"
  84.         End If
  85.     Next
  86.     Sheet2.Range("J2").Resize(m, 7) = Application.WorksheetFunction.Transpose(brr)
  87. End Sub
复制代码

2222.zip

15.13 KB, 下载次数: 9

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-12-21 15:16 | 显示全部楼层
本帖最后由 老司机带带我 于 2016-12-21 15:25 编辑

有很多漏打卡的怎么处理?比如王红戈、许广平、左晓林等等,又或者早晨8点50打开,中午1点打卡,下午5点打卡,那中午的1点是算上午的下班时间还是下午的上班时间?这些规则要说清楚!最好自己能模拟一下结果!
回复

使用道具 举报

 楼主| 发表于 2016-12-21 16:30 | 显示全部楼层
老司机带带我 发表于 2016-12-21 15:16
有很多漏打卡的怎么处理?比如王红戈、许广平、左晓林等等,又或者早晨8点50打开,中午1点打卡,下午5点打 ...

漏卡就填“未打卡”,8点50分是提前了,这个算正常,中午1点打卡,如果前面12点左右打过一次卡,那就表示是下午上班打卡,如果前面12点左右没有,下午2点左右又打卡一次,那中午1点就表示是上午下班打卡。模拟效果弄出来了,标注成红色的,见附件。
万分感谢!!

2222.zip

15.65 KB, 下载次数: 7

回复

使用道具 举报

发表于 2016-12-22 11:12 | 显示全部楼层    本楼为最佳答案   
请查收附件,结果输出在另外一个表中,输出了两个结果一个是中间过程,即将时间去对应匹配,另外一个是你要的最终结果,其实两个For语句可以合并成一个,即直接输出你要的结果,这个你自己可以修改,我这样编写的目的在于你能理解中间的处理过程。另外这样做其实还是有问题,比如我一天就打两次卡,12:10:00一次,下午17:00:00一次,我的程序会认为造成没有打卡,中午下班打了卡,下午上班未打卡,下午下班正常,但实际情况可能是上午这个人休息,中午的12:10:00可能是下午的上班打卡!具体情况你自己斟酌!
  1. Sub 打卡数据转换()
  2.     Dim dc As Object
  3.     Dim arr, i As Integer, n As Integer, brr(), m As Integer, x As Integer
  4.     Dim 日期 As Date, 时间 As Date, 早上 As Date, 中下 As Date, 午上 As Date, 晚下 As Date
  5.     Set dc = CreateObject("Scripting.Dictionary")
  6.     早上 = #9:00:00 AM#
  7.     中下 = #12:00:00 PM#
  8.     午上 = #2:00:00 PM#
  9.     晚下 = #5:00:00 PM#
  10.     With Sheet1
  11.         n = .Cells(.Rows.Count, 1).End(xlUp).Row
  12.         arr = .Range("A2:D" & n)
  13.     End With
  14.     For i = 1 To n - 1
  15.         日期 = Application.Text(arr(i, 4), "yyyy-m-d")
  16.         时间 = Application.Text(arr(i, 4), "hh:mm:ss")
  17.         If Not dc.Exists(arr(i, 3) & "_" & 日期) Then
  18.             m = m + 1
  19.             dc.Add arr(i, 3) & "_" & 日期, m
  20.             ReDim Preserve brr(1 To 7, 1 To m)
  21.             brr(1, m) = arr(i, 1)
  22.             brr(2, m) = arr(i, 2)
  23.             brr(3, m) = 日期
  24.             Select Case 时间
  25.                 Case Is < 早上
  26.                     brr(4, m) = 时间
  27.                 Case Is < 中下
  28.                     brr(4, m) = 时间
  29.                 Case Is < 午上
  30.                     brr(5, m) = 时间
  31.                 Case Is < 晚下
  32.                     brr(6, m) = 时间
  33.                 Case Is >= 晚下
  34.                     brr(7, m) = 时间
  35.             End Select
  36.         Else
  37.             x = dc(arr(i, 3) & "_" & 日期)
  38.             Select Case 时间
  39.                 Case Is < 早上
  40.                     brr(4, x) = 时间
  41.                 Case Is < 中下
  42.                     If brr(4, x) = "" Then brr(4, x) = 时间 Else brr(5, x) = 时间
  43.                 Case Is < 午上
  44.                     If brr(5, x) = "" Then brr(5, x) = 时间 Else brr(6, x) = 时间
  45.                 Case Is < 晚下
  46.                     If brr(6, x) = "" Then brr(6, x) = 时间 Else brr(7, x) = 时间
  47.                 Case Is >= 晚下
  48.                     brr(7, x) = 时间
  49.             End Select
  50.         End If
  51.     Next
  52.     Sheet2.Range("A2").Resize(m, 7) = Application.WorksheetFunction.Transpose(brr)
  53.     For i = 1 To m
  54.         If brr(4, i) = "" Then
  55.             brr(4, i) = "未打卡"
  56.         ElseIf brr(4, i) <= 早上 Then
  57.             brr(4, i) = "正常"
  58.         Else
  59.             brr(4, i) = "迟到"
  60.         End If
  61.         
  62.         If brr(5, i) = "" Then
  63.             brr(5, i) = "未打卡"
  64.         ElseIf brr(5, i) < 中下 Then
  65.             brr(5, i) = "早退"
  66.         Else
  67.             brr(5, i) = "正常"
  68.         End If
  69.         
  70.         If brr(6, i) = "" Then
  71.             brr(6, i) = "未打卡"
  72.         ElseIf brr(6, i) <= 午上 Then
  73.             brr(6, i) = "正常"
  74.         Else
  75.             brr(6, i) = "迟到"
  76.         End If
  77.         
  78.         If brr(7, i) = "" Then
  79.             brr(7, i) = "未打卡"
  80.         ElseIf brr(7, i) < 晚下 Then
  81.             brr(7, i) = "早退"
  82.         Else
  83.             brr(7, i) = "正常"
  84.         End If
  85.     Next
  86.     Sheet2.Range("J2").Resize(m, 7) = Application.WorksheetFunction.Transpose(brr)
  87. End Sub
复制代码

2222.rar

25.2 KB, 下载次数: 15

回复

使用道具 举报

 楼主| 发表于 2016-12-22 11:36 | 显示全部楼层
非常感谢!
输出的结果是我想要的结果,但是我自己不会弄,没有学过代码。
有新的数据我就不会添加了 。
本来我以为是编个公式什么的,到时候一拖就行了,
回复

使用道具 举报

发表于 2016-12-22 12:26 | 显示全部楼层
你可以把这个当成是固定的模板,把系统的数据导出后放进去,然后运行这个程序,结果不就出来了吗!
回复

使用道具 举报

 楼主| 发表于 2016-12-22 15:09 | 显示全部楼层
谢谢!!我试了一下,真好用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 20:46 , Processed in 0.379220 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表