|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 sunya_0529 于 2014-11-1 18:53 编辑
sdong7 发表于 2014-11-1 13:31
千万别吝啬鲜花哦!!!!!
作为新任版主,代表论坛感谢你的积极参与和分享,希望我们一起努力,将HR版块的学习氛围带动起来。
建议不要多次刷回复,我们回的帖子重质不重量,按下来对于负责任、有内容、有创新等的回帖都将给予一定的财富奖励,当然,对于恶意灌水的也将给予处分,以维护论坛的健康发展。
回到楼主的这个问题,你的字典解决方案思路不错,代码执行效率也较快。只是对于报表结果的输出上,需要再下点功夫。
下面是我用常规的方法写的代码,供你和楼主参考——
- Option Explicit
- Sub ShowReport()
- On Error Resume Next '错误处理
- Dim k As Range, arrR(1 To 9999, 5), n$, d As Date, t As Date, i&, n1$, d1 As Date, t1 As Date
- With ActiveSheet
- .[P2:U9999].ClearContents '清空结果显示区域
- For Each k In .Range("C2:C" & .[C2].End(xlDown).Row)
- n = k.Value '获取当前记录的登记号码
- d = CDate(Left(k.Offset(0, 1), 10)) '获取当前记录的日期
- t = CDate(Right(k.Offset(0, 1), 8)) '获取当前记录的时间
- If InStr(k.Offset(0, 1), "下午") > 0 And CInt(Mid(k.Offset(0, 1), 15, 2)) <> 12 Then t = t + TimeSerial(12, 0, 0)
- If n <> n1 Then
- i = i + 1
- arrR(i, 0) = k.Offset(0, -1).Value '姓名
- arrR(i, 1) = k.Offset(0, 6).Value '打卡方式
- arrR(i, 2) = d '日期
- arrR(i, 3) = t '签到时间1
- Else
- If d = d1 Then
- If t - t1 > TimeSerial(0, 30, 0) Then
- Select Case k.Offset(0, 6).Value
- Case "生产"
- If t < TimeSerial(20, 0, 0) Then arrR(i, 4) = t '签到时间2
- Case "清洁工"
- If t < TimeSerial(16, 0, 0) Then arrR(i, 4) = t
- Case "办公室"
- If t < TimeSerial(13, 0, 0) Then arrR(i, 4) = t
- End Select
- End If
- arrR(i, 5) = t '签到时间3
- If t - arrR(i, 3) < TimeSerial(0, 30, 0) Or t - arrR(i, 4) < TimeSerial(0, 30, 0) Then arrR(i, 5) = ""
- Else
- i = i + 1
- arrR(i, 0) = k.Offset(0, -1).Value '姓名
- arrR(i, 1) = k.Offset(0, 6).Value '打卡方式
- arrR(i, 2) = d '日期
- arrR(i, 3) = t '签到时间1
- End If
- End If
- n1 = n '储存上条记录的登记号码
- d1 = d '储存上条记录的日期
- t1 = t '储存上条记录的时间
- Next
- .[P2].Resize(UBound(arrR), 6) = arrR
- End With
- End Sub
复制代码
|
|