ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 打卡记录整理VBA

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-29 18:17 | 显示全部楼层 |阅读模式
求助各位老师,

关于打卡记录如何用EXCEL VBA分解至想要的结果,这个有点难度了
1. 每天会有超出两次的打卡记录,记录最早和最晚的一次
2. 将日期时间分配到考勤表中
3. 从第4行开始需要一键生成的那种效果,

各位老师们看看有没有办法做到,这个对于我就是高难度了,或者哪里能找到这种类型的示例
Capture.JPG

考勤表.7z

26.03 KB, 下载次数: 12

附件

TA的精华主题

TA的得分主题

发表于 2023-4-30 09:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 考勤统计()
Application.ScreenUpdating = False
Dim ar As Variant, arr As Variant
Dim d As Object, dc As Object
Dim br()
Dim sMax As String, sMin As String, sTime As String
Set d = CreateObject("scripting.dictionary")
Set dc = CreateObject("scripting.dictionary")
With Sheets("考勤数据")
    r = .Cells(Rows.Count, 1).End(xlUp).Row
    If r < 2 Then MsgBox "考勤数据为空!": End
    .Range("a1:d" & r).Sort .[c1], 1, , , , , , 1 '
    ar = .Range("a1:d" & r)
End With
For i = 2 To UBound(ar)
    If Trim(ar(i, 2)) <> "" And Trim(ar(i, 3)) <> "" Then
        zd = Trim(ar(i, 2)) & "|" & Trim(ar(i, 3))
        d(zd) = ""
    End If
Next i
With Sheets("员工考勤表")
    .UsedRange.Offset(3).Clear
    arr = .Range("a2:ah" & r)
    k = 2
    For Each kk In d.keys
        n = 0
        ReDim br(1 To UBound(ar), 1 To 1)
        d.RemoveAll: sMin = "A"
        For i = 2 To UBound(ar)
            If Trim(ar(i, 2)) <> "" And Trim(ar(i, 3)) <> "" Then
                zd = Trim(ar(i, 2)) & "|" & Trim(ar(i, 3))
                If zd = kk Then
                    n = n + 1
                    br(n, 1) = TimeValue(CDate(Format(ar(i, 4), "h:mm:ss")))
                End If
            End If
        Next i
        For i = 1 To n
            For s = i + 1 To n
                If br(i, 1) > br(s, 1) Then
                    mk = br(i, 1)
                    br(i, 1) = br(s, 1)
                    br(s, 1) = mk
                End If
            Next s
        Next i
        rr = Split(kk, "|")
        xm = Trim(rr(1))
        t = dc(xm)
        If t = "" Then
            k = k + 3
            dc(xm) = k
            t = k
            arr(k, 1) = xm
            arr(k - 2, 2) = "天数/总工时h"
            arr(k - 2, 3) = "签到"
            arr(k - 1, 3) = "签退"
            arr(k, 3) = "工时"
        End If
        lh = Day(rr(0))
        arr(t - 2, lh + 3) = br(n, 1)
        arr(t - 1, lh + 3) = br(1, 1)
        .Range("D" & t - 1).Resize(1, 31).NumberFormatLocal = "[$-x-systime]h:mm:ss AM/PM"
        .Range("D" & t).Resize(1, 31).NumberFormatLocal = "[$-x-systime]h:mm:ss AM/PM"
        arr(t, lh + 3) = (arr(t - 2, lh + 3) - arr(t - 1, lh + 3)) * 24
        .Range("D" & t + 1).Resize(1, 31).NumberFormatLocal = "0.0_ "
    Next kk
    .[a2].Resize(k, UBound(arr, 2)) = arr
    .[a2].Resize(k, UBound(arr, 2)).Borders.LineStyle = 1
End With
Set d = Nothing
Set dc = Nothing
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-4-30 09:28 | 显示全部楼层
考勤表.rar (38.02 KB, 下载次数: 22)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-4-30 09:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-4-30 09:53 | 显示全部楼层
两重字典,第二重为set d(日期&姓名) = CreateObject("Scripting.Dictionary"), d(日期&姓名)(打卡时间) = (打卡时间),在d(日期&姓名)的items中取得最小值和最大值

TA的精华主题

TA的得分主题

发表于 2023-4-30 10:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
image.png


考勤表1.rar (27.6 KB, 下载次数: 17)

凑个热闹,学习更优代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-30 13:16 | 显示全部楼层

春风化雨老师你好,

你的代码很厉害,就这个效果,我看得云里雾里的不太懂,想小改一下都无从下手,所还得麻烦你帮忙看一下

1. 《员工考勤表》 里第2行有日期的,所以《考勤数据》打卡时间的日期和 《员工考勤表》里的日期要匹配得上,不然就错乱了
2. 《员工考勤表》里B列中,需要计算 工作总天数工作总工时 我加了代码好像不对
3. 《员工考勤表》里签到时间和签退时间反了,格式能不能用代码控制成24小时制的格式:17:35,秒不要显示

万分感谢!

New考勤表.7z

36 KB, 下载次数: 8

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-30 13:21 | 显示全部楼层
chenjy267 发表于 2023-4-30 09:53
两重字典,第二重为set d(日期&姓名) = CreateObject("Scripting.Dictionary"), d(日期&姓名)(打卡时间) =  ...

字典我不通啊,能否给给个示例我学习一下啊

TA的精华主题

TA的得分主题

发表于 2023-4-30 13:53 | 显示全部楼层
gemeng25569 发表于 2023-4-30 13:16
春风化雨老师你好,

你的代码很厉害,就这个效果,我看得云里雾里的不太懂,想小改一下都无从下手,所 ...

签到,签退反了的问题很好解决,日期匹配的问题,我不知道你究竟认真看了没有,目前的代码就是匹配日期的,至于其他的,更是不知所云

TA的精华主题

TA的得分主题

发表于 2023-4-30 13:56 | 显示全部楼层
gemeng25569 发表于 2023-4-30 13:16
春风化雨老师你好,

你的代码很厉害,就这个效果,我看得云里雾里的不太懂,想小改一下都无从下手,所 ...

日期是4月2日,打卡日期又是4月6日,我不知道你的数据究竟是不是真实的数据

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 05:26 , Processed in 0.052093 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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