ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 打卡记录整理VBA

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-30 16:36 | 显示全部楼层
试试这个看              

考勤表.rar

26.79 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2023-4-30 16:38 | 显示全部楼层
很久以前搞过一次,主要难点:
1,姓名没有唯一ID,重名不好处理。(需要考勤系统支持)
2,各公司对第二日的规则较多,例如:前一日加班第二日抵扣等很多情况。
其他都比较简单,所以原来的思路:1,是先做基础计算统计,2,也就是您这个第二张表,3,然后再做人工处理(VBA主要提供异常标注,手动修改).4,输出人力格式考勤表(做薪用)。

TA的精华主题

TA的得分主题

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

谢谢你的帮忙,及感谢其它朋友,已经弄好了,我自己添加公式弄好了,字典我看得头晕

        
        Dim x, y, z, p As Range
        Set x = Worksheets("考勤数据").Range("B2:B" & ra) '日期
        Set y = Worksheets("考勤数据").Range("C2:C" & ra) '姓名
        Set z = Worksheets("考勤数据").Range("D2:D" & ra) '时间
        Set p = Range("D2")
        For k = 4 To Range("D2").End(xlToRight).Column
        Worksheets("员工考勤表").Cells(i - 2, k) = Application.MinIfs([z], [x], Cells(2, k), [y], Range("A" & i))
        Worksheets("员工考勤表").Cells(i - 1, k) = Application.MaxIfs([z], [x], Cells(2, k), [y], Range("A" & i))
        Worksheets("员工考勤表").Cells(i - 2, k).NumberFormatLocal = "h:mm;@"
        Worksheets("员工考勤表").Cells(i - 1, k).NumberFormatLocal = "h:mm;@"
        'Cells(i, 5) = itm
        Worksheets("员工考勤表").Cells(i - 1, 2) = WorksheetFunction.CountA(Range(Cells(i - 1, 4), Cells(i - 1, 34)))
        Worksheets("员工考勤表").Cells(i, 2) = WorksheetFunction.Sum(Range(Cells(i, 4), Cells(i, 34)))
        

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-30 17:40 | 显示全部楼层
3190496160 发表于 2023-4-30 13:56
日期是4月2日,打卡日期又是4月6日,我不知道你的数据究竟是不是真实的数据

是我没注意前面的日期,谢谢你

TA的精华主题

TA的得分主题

发表于 2023-4-30 18:18 | 显示全部楼层
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(1, 1)
        arr(t - 1, lh + 3) = br(n, 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 - 1, lh + 3) - arr(t - 2, lh + 3)) * 24
        .Range("b" & t + 1).Resize(1, 33).NumberFormatLocal = "0.0_ "
    Next kk
    For i = 4 To k Step 3
        hj = 0: zj = 0
        For j = 4 To UBound(arr, 2)
            If Trim(arr(i, j)) <> "" Then
                hj = hj + 1
            End If
            zj = zj + arr(i + 1, j)
        Next j
        arr(i, 2) = hj
        arr(i + 1, 2) = zj
    Next i
    .[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

TA的精华主题

TA的得分主题

发表于 2023-4-30 18:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
增加了合计
考勤表.rar (38.59 KB, 下载次数: 15)

TA的精华主题

TA的得分主题

发表于 2023-5-2 03:38 | 显示全部楼层
参与练手一下...............................

考勤表0502.rar

32.46 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-2 08:41 | 显示全部楼层
xunanming 发表于 2023-5-2 03:38
参与练手一下...............................

练手也得测试一下哈

TA的精华主题

TA的得分主题

发表于 2023-5-2 10:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
过来学习下,之前也碰到这样的问题

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-5 08:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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