码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Excel·VBA考勤打卡记录统计结果


    之前写过的《Excel·VBA考勤打卡记录统计出勤小时》,是统计出勤小时;
    之前写过的《Excel·VBA考勤打卡记录数据整理》,是整理上下班时间;
    而《excelhome提问-考勤统计》,则是按照下列要求统计考勤结果:
    1,上班时间晚于8点,算迟到
    2,下班时间早于18点,算早退
    3,上下班仅打卡1次,算休息半天
    4,当天没有打卡记录,算未打卡
    同时为避免一个班次多次打卡/每天打卡次数超过2次造成错误,改为获取当日打卡时间的max、min值判断获取考勤结果

    与之前的文章同样采用字典嵌套字典的方式,同样由于office不支持时间数组max、min操作,故时间先读取为字符串,再转为double类型;同时对日期进行排序方便查看,排序调用了bubble_sort函数,代码详见《Excel·VBA数组冒泡排序函数》

    Sub 考勤统计()
        Dim arr, brr, crr, name_dict As Object, date_dict As Object, i&, j&, r&, c&, result
        arr = [a1].CurrentRegion.Value: tm = Timer
        Set name_dict = CreateObject("scripting.dictionary")
        Set date_dict = CreateObject("scripting.dictionary")
        For i = 2 To UBound(arr)
            xm = arr(i, 2): rq = DateValue(arr(i, 4)): date_dict(rq) = ""
            sj = Format(TimeValue(arr(i, 4)), "0.0000000000")
            'Debug.Print xm, TypeName(xm), rq, TypeName(rq), sj, TypeName(sj)
            If Not name_dict.exists(xm) Then  '姓名字典键不存在,新增
                Set name_dict(xm) = CreateObject("scripting.dictionary")  '字典嵌套
            End If
            name_dict(xm)(rq) = name_dict(xm)(rq) & "," & sj
        Next
        ReDim result(name_dict.Count, date_dict.Count)  '从0开始计数,0即为条件,1开始为数据
        trr = bubble_sort(date_dict.keys)  '日期排序
        For j = 1 To UBound(result, 2)  '日期赋值
            result(0, j) = trr(j - 1)
        Next
        For Each n In name_dict.keys
            r = r + 1: result(r, 0) = n
            For c = 1 To UBound(result, 2)
                If Not name_dict(n).exists(result(0, c)) Then
                    result(r, c) = "未打卡"
                Else
                    '字符串以,开头,所以brr(0)为空值
                    brr = Split(name_dict(n)(result(0, c)), ","): ReDim crr(1 To UBound(brr))
                    For i = 1 To UBound(brr)  '时间string数组转double数组
                        crr(i) = CDbl(brr(i))
                    Next
                    max_t = WorksheetFunction.Max(crr): min_t = WorksheetFunction.Min(crr)
                    '上班下班只要缺1个卡即为"休息半天"
                    If max_t < #10:00:00 AM# Or min_t > #2:00:00 PM# Then
                        result(r, c) = result(r, c) & vbLf & "休息半天"
                    End If
                    If min_t > #8:00:00 AM# And min_t < #10:00:00 AM# Then
                        result(r, c) = result(r, c) & vbLf & "迟到"
                    End If
                    If max_t > #2:00:00 PM# And max_t < #6:00:00 PM# Then
                        result(r, c) = result(r, c) & vbLf & "早退"
                    End If
                End If
            Next
        Next
        For i = 1 To UBound(result)  '清除开头的换行符
            For j = 1 To UBound(result, 2)
                If Len(result(i, j)) > 0 Then
                    If Left(result(i, j), 1) = vbLf Then
                        result(i, j) = Mid(result(i, j), 2)
                    End If
                End If
            Next
        Next
        With Worksheets("考勤统计表")  '结果赋值
            .Cells.Clear
            .Cells(1, 1).Resize(UBound(result) + 1, UBound(result, 2) + 1) = result
            .Cells(1, 1) = "姓名/日期"
            With .[a1].CurrentRegion
                .Borders.LineStyle = xlContinuous
                .Font.Name = "微软雅黑"
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With
        End With
        Debug.Print "考勤统计完成,用时:" & Format(Timer - tm, "0.00")
    End Sub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    结果
    在这里插入图片描述
    在这里插入图片描述

    附件
    CSDN:《Excel·VBA考勤打卡记录统计结果(附件)》
    百度网盘:《Excel·VBA考勤打卡记录统计结果(附件)》,提取码:3jp3

  • 相关阅读:
    软件供应链的漏洞及攻击类型
    从刘老师的进化的力量到有感,疫情阶段如何弯道超车
    以小窥大:IO 卡顿探寻文件系统
    【PHP】php中JSON或数组到formData的键值对转换
    安利一个好用的IDEA插件 object-helper-plugin
    【C语言】模拟实现字符串库函数
    java计算机毕业设计框架的企业机械设备智能管理系统的设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
    Aqwa 带你掌握船舶与海洋工程水动力理论与工程应用
    nginx 配置静态网页
    秋招每日一题T21——倒水问题
  • 原文地址:https://blog.csdn.net/hhhhh_51/article/details/127635152
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号