ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 764|回复: 7

[求助] 关于考勤统计的问题vba

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-2-12 18:30 | 显示全部楼层 |阅读模式
规则:上班时间8点45之前打卡
下班17:00 之后打卡
找出异常的记录
1、迟到早退的打卡记录
2、当天早上或下班没有打卡的记录
异常记录提取出来放在一个新表里
谢谢各位帮忙。

例子.rar

8.52 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2019-2-12 18:41 | 显示全部楼层
先判断姓名,再判断日期,接着判断时间,最后输出结果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-13 11:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ccsc006 于 2019-2-13 11:21 编辑

迟到早退问题可以判断出来了。
现在的问题是如何判断漏打卡。我建立了个数组比如叫aa1 ,如果数组的值有1和4就说明没有漏打卡,否则要标记出来。
请教各位,如何做个循环判断出这个数组没有1或4呢。谢谢啦

1good考勤分析.rar

44.5 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2019-2-13 13:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1.gif


例子.rar (17.36 KB, 下载次数: 2)

Option Explicit

Sub a()
Dim cnn As New cConnection
Dim rs As New cRecordset
Dim sql$, arr, i%, R%
R = Sheet1.[B9999].End(3).Row
arr = Sheet1.Range("A1:E" & R)
cnn.CreateNewDB ":memory:"
sql = "create table T1 (姓名,日期,打卡时间)"
cnn.Execute sql
cnn.BeginTrans
For i = 2 To UBound(arr)
    sql = "INSERT INTO T1 VALUES('" _
        & arr(i, 2) & "','" & arr(i, 4) & "','" & Format(arr(i, 5), "HH:MM:SS") & "')"
    cnn.Execute sql
Next
cnn.CommitTrans
Sheet2.Activate
Cells.Clear
sql = "select 姓名,日期,打卡时间," _
        & "CASE WHEN SUBSTR(打卡时间,1,8)=SUBSTR(打卡时间,10,8) THEN  '缺打卡时间'" _
        & " WHEN SUBSTR(打卡时间,1,8)>'08:45:00' AND SUBSTR(打卡时间,10,8)>'17:00:00' THEN  '迟到'" _
        & " WHEN SUBSTR(打卡时间,1,8)<'08:45:00' AND SUBSTR(打卡时间,10,8)<'17:00:00' THEN  '早退'" _
        & " WHEN SUBSTR(打卡时间,1,8)>'08:45:00' AND SUBSTR(打卡时间,10,8)<'17:00:00' THEN  '迟到&早退' end As 异常" _
         & " from (SELECT 姓名,日期,MIN(打卡时间)||'|'||MAX(打卡时间) AS 打卡时间 from T1 GROUP BY 姓名,日期)" _
        & " where 异常 is not null"
rs.OpenRecordset sql, cnn
Range("A2").CopyFromRecordset rs.GetADORsFromContent
Cells.Font.Size = 12
Set cnn = Nothing
Set rs = Nothing
End Sub




TA的精华主题

TA的得分主题

发表于 2019-2-13 13:05 | 显示全部楼层
代码审核中,先传个附件

如果符合你的要求,按我签名档下载两个控件,因为用到了内存数据库 sqlite

1.gif

例子.rar (17.36 KB, 下载次数: 8)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-13 14:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-2-13 15:22 | 显示全部楼层
本帖最后由 mzbao 于 2019-2-13 15:25 编辑
  1. Sub test()
  2.     Dim d, arr(), temp, temp1, tempArr(), brr(), i%, j%, sName$, dDate As Date
  3.    
  4. '    On Error Resume Next
  5.     With ThisWorkbook.Worksheets("考勤")
  6.         arr = .Range("A13:B" & .Cells(Rows.Count, 1).End(xlUp).row).Value
  7.     End With
  8.    
  9.     Set d = CreateObject("Scripting.Dictionary")
  10.     For i = 1 To UBound(arr)
  11.         sName = arr(i, 1)
  12.         dDate = DateValue(arr(i, 2))
  13.         If TimeValue(arr(i, 2)) < #2:00:00 AM# Then dDate = dDate - 1
  14.         d(sName & "@" & dDate) = d(sName & "@" & dDate) & "," & arr(i, 2)
  15.     Next
  16.     If d.Count = 0 Then Exit Sub
  17.     temp = d.keys
  18. '    Debug.Print d.Count, UBound(temp)
  19.     ReDim tempArr(1 To d.Count, 1 To 10)
  20.     For i = 0 To UBound(temp)
  21.         tempArr(i + 1, 1) = temp(i)
  22.         temp1 = Split(d(temp(i)), ",")
  23.         For j = 1 To UBound(temp1)
  24.             tempArr(i + 1, j + 1) = temp1(j)
  25.         Next
  26.     Next
  27.    
  28.     Dim rArr(), k%, txt$, n%, nTxt$
  29.     ReDim rArr(1 To 1)
  30.     For i = 1 To UBound(tempArr)
  31.         txt = "": nTxt = ""
  32.         For j = 2 To UBound(tempArr, 2)
  33.             If tempArr(i, j) = 0 Then Exit For
  34.             n = sd(TimeValue(tempArr(i, j)))
  35.             nTxt = nTxt & "," & n
  36.             If n = 2 Then txt = txt & "," & "迟到[" & TimeValue(tempArr(i, j)) & "]"
  37.             If n = 3 Then txt = txt & "," & "早退[" & TimeValue(tempArr(i, j)) & "]"
  38.         Next j
  39.         If InStr(nTxt, 2) = 0 And InStr(nTxt, 1) = 0 Then txt = txt & "," & "上班未打卡"
  40.         If InStr(nTxt, 3) = 0 And InStr(nTxt, 4) = 0 Then txt = txt & "," & "下班未打卡"
  41.         
  42.         If Len(txt) Then
  43.             k = k + 1
  44.             ReDim Preserve rArr(1 To k)
  45.             rArr(k) = tempArr(i, 1) & txt
  46.         End If
  47.     Next i
  48.     ThisWorkbook.Worksheets("Sheet1").Range("A2").Resize(k) = Application.Transpose(rArr)
  49. End Sub

  50. Function sd(sj As Date)
  51.     Select Case sj
  52.         Case #12:00:00 AM# To #2:00:00 AM#
  53.             sd = 4
  54.         Case #2:01:00 AM# To #8:45:00 AM#
  55.             sd = 1
  56.         Case #8:45:01 AM# To #11:59:59 AM#
  57.             sd = 2
  58.         Case #12:00:00 PM# To #4:59:59 PM#
  59.             sd = 3
  60.         Case #5:00:00 PM# To #11:59:59 PM#
  61.             sd = 4
  62.     End Select
  63. End Function
复制代码

1good考勤分析.rar

55.75 KB, 下载次数: 15

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-13 15:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个也厉害。感谢感谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-24 20:05 , Processed in 0.057596 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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