微信公众号:金融数学
使用VBA做一个基于员工打卡记录的考勤数据分析工具;

1应用场景

某公司通过门禁系统记录了每位员工上下班打卡时间,现在需要对一段特定时间内员工出勤情况进行统计分析,包含加班时间(工作日和非工作日、早加班和晚加班)、迟到早退、缺勤天数等,同时要将员工请休假记录一并汇总。

2员工打卡记录规则

1.每位员工打卡记录分别保存在一个工作簿中;
2.每条打卡记录包含姓名、打卡日期(哪一天)、打卡时间(几点几分)三个要素;
3.同一天至多有两条打卡记录,即上班打卡和下班打卡,但可能因为缺勤、系统故障等因素导致只有一条打卡记录或者没有打卡记录;
4.一条完整的打卡记录应包含打卡日期和打卡时间,对只有打卡日期没有具体打卡时间的记录,视作无效打卡记录;
5.考虑节假日和补班等因素,对于周六日补班的,视为工作日。

3情景分析

假设某位员工打卡记录如下:

可以看到,该员工打卡记录有如下特点:

1月1日有两条完整的打卡记录,但当天为元旦节假日,应统计为节假日加班,节假日加班天数计算一天,且有两条完整打卡记录,可以统计具体节假日加班时间;

1月2日为工作日,因只有一条不完整打卡记录,打卡时间缺失,视为无效记录,故应统计缺勤一天;

1月3日为工作日,但只有一条完整打卡记录(下班打卡),另一条打卡记录缺失打卡时间(上班打卡),因保留一条完整打卡记录,故不计算缺勤,可以正常统计工作日晚加班时间和是否早退,但无法统计是否迟到,也无法统计早加班时间;

1月4日为周末,但只有一条完整打卡记录,加班天数可以计算一天,但是因为只有一条完整打卡记录,无法统计具体节假日加班时间;

1月5日为周末,且无打卡记录,无需处理;

1月6日为工作日,且有两条完整打卡记录,可以正常计算工作日早晚加班情况和迟到早退情况;

1月7日为工作日,但无打卡记录,故计算缺勤一天;

……

1月19日虽然为周末,但因为春节放假调休原因,当天补班,故应当按照工作日统计考勤数据。

4实现思路

4.1员工考勤数据统计表

如下表,需要统计的员工考勤数据包含:工作日早晚加班时间、节假日加班时间、节假日加班天数、工作日缺勤天数、迟到天数、早退天数等。

4.2运行设置

1.支持指定统计日期,比如统计2020年1月份员工考勤数据,那么就需要将开始日期设置为2020年1月1日,结束日期设置为2020年1月31日;
2.支持是否汇总请休假记录;
3.支持指定早加班和晚加班时间,比如指定早上8:00前打卡才算早加班时间,晚上18:00后打卡才算是晚加班。

4.3自定义函数实现判断某天是否为工作日

对于一些特殊的日期,比如2020年1月1日,当天为周三,但是因为是元旦,所以当天为节假日;再比如2020年1月19日,当天为周日,但因为春节放假安排,当天补班,所以当天应为工作日。

因为没有找到一个函数可以直接进行以上判断,所以只能自定义一个函数实现。

对于这一类特殊日期,需要进行单独指定,例如将2020年1月份特殊日期梳理如下:

我们基于NETWORKDAYS函数构造了一个自定义行数。先了解下NETWORKDAYS函数:

NETWORKDAYS(开始日期, 结束日期, [要除去的节假日])

NETWORKDAYS函数返回两个日期之间的工作日天数(除去周末),支持去除指定日期(可以引用一个单元格区域)。

使用时,将开始日期和结束日期设置为同一天,如果该日期不是周末,且不在指定的节假日范围内,则返回值为1;如果该日期为周末,则返回值为0.

自定义一个判断是否为工作日的函数IsWorkday(Dat As Date),输入指定日期,如果是工作日,则返回True,否则返回False。

自定义函数工作机制:

1.输入一个日期;
2.查询该日期是否为补班日,如果为补班日,则该日期为工作日,函数返回True,结束,否则继续下一步;
3.利用NETWORKDAYS函数判断,函数第三个参数中引用指定的非周末的特殊节假日,如果返回值为1,则该日期既不是周末也不是指定的非周末的特殊节假日,函数返回True;如果返回值为0,则该日期为周末或者指定的非周末的特殊节假日,函数返回False。

4.4考勤数据统计思路

1.获取指定的统计开始日期和结束日期;
2.将员工考勤记录数据按照打卡日期、打卡时间进行排序(理论上原数据即按此顺序记录);
3.从开始日期到结束日期,逐个日期循环;
4.对每个日期,判断该日期是否为工作日;
5.用该日期去匹配员工考勤记录中的打卡日期;
6.如果该日期为工作日,但无法匹配员工考勤记录打卡日期,则记录缺勤一天;如果可以匹配到员工考勤记录打卡日期,需要进一步判断考勤记录信息:(1)如果有两条完整打卡记录,则正常计算早晚加班时间和迟到早退情况;(2)如果仅有一条完整打卡记录,则仅计算早(晚)加班时间和迟到(早退)情况;(3)如果不存在完整打卡记录,则打卡无效,记录缺勤一天;
7.如果该日期为节假日,并且无法匹配员工考勤记录打卡日期,则无需处理;如果可以匹配到员工考勤记录打卡日期:(1)如果有两条完整打卡记录,则计算节假日加班一天,并正常计算节假日加班时间;(2)如果仅有一条完整打卡记录,则计算节假日加班一天,但无法计算节假日加班时间;(3)如果不存在完整打卡记录,则打卡无效,无需处理;
8.汇总完开始日期和结束日期内每一天的考勤数据后,将结果记录到员工考勤数据统计表中;
9.如果需要统计请休假数据,则将请休假数据汇总到员工考勤数据统计表中;
10.处理下一个员工考勤记录表。

多条记录取最近日期的一条_Excel VBA:基于员工打卡记录的考勤数据统计相关推荐

  1. 多条记录取最前面一条或根据条件任取N条

    select * from t1 where id in(select min(id) from t1 group by name) SELECT * FROM t1 a WHERE [time]= ...

  2. BasKet Note Pads-利用软件作条记

    Toy Posted in Apps, Note-Taking BasKet Note Pads 是一款 KDE 下具有多种用途的条记纪录软件,与其他一样平居的作条记软件最年夜的区别是,它除了能够纪录 ...

  3. 去除html标签 express,详解Express条记之静态衬着HTML(新脚进坑)

    在日常项目中,我喜欢用Django做后端, 因为大而全 如果只是写一个简单服务的话, Express是更好的选择, Express是基于nodejs的一个后端框架,特点是简单,轻量, 容易搭建, 而且 ...

  4. Xournal-条记抄写软件

    Toy Posted in Apps, Note-Taking Xournal 这个软件主要用来帮忙人们抄写条记,用户可以经过进程它将草图与条记相结合.马虎哄骗条记本电脑的用户,哄骗 Xournal ...

  5. 电商销售数据分析与预测(日期数据统计、按天统计、按月统计)

    本文来自<Python数据分析从入门到精通>--明日科技编著 随着电商行业的激烈竞争,电商平台推出了各种数字营销方案,付费广告也是花样繁多.那么电商投入广告后,究竟能给企业增加多少收益,对 ...

  6. 实战 | 用Python爬取《云南虫谷》3.6万条评论,并做数据统计可视化展示分析,好看!...

    最近鬼吹灯系列网剧<云南虫谷>上线,作为鬼吹灯系列作品,承接上部<龙岭迷窟>内容,且还是铁三角原班人马主演,网友直呼非常好看! 今天,我们就用Python爬取目前全部剧集的评论 ...

  7. 实战|用Python爬取《云南虫谷》3.6万条评论,并做数据统计可视化展示分析,好看!

    大家好,我是才哥. 最近鬼吹灯系列网剧<云南虫谷>上线,作为鬼吹灯系列作品,承接上部<龙岭迷窟>内容,且还是铁三角原班人马主演,网友直呼非常好看! 今天,我们就用Python爬 ...

  8. R语言ggplot2可视化在散点图中的每个点上绘制两个错误条:常见的是垂直错误条,它对应于Y值点上的错误(error bar),添加与X轴(水平)相关的错误条(error bar)

    R语言ggplot2可视化在散点图中的每个点上绘制两个错误条:常见的是垂直错误条,它对应于Y值点上的错误(error bar),添加与X轴(水平)相关的错误条(error bar) 目录

  9. python进度条 pyqt_Python高级进阶#015 pyqt5进度条QProgressBar结合使用qbasictimer

    本期GUI界面,我们继续学习新的控件Qprogressbar. 知识回顾 1.滑动控件qslider 控件设置的关键:设置最大值.最小值,绝对范围. 2.核心类库QtCore,枚举类Qt 核心枚举类的 ...

最新文章

  1. java springcloud版b2b2c社交电商spring cloud分布式微服务(十三)断路器聚合监控(Hystrix Turbine)...
  2. MikuMikuShaders
  3. 单片机上电复位电路图大全
  4. go io.reader 多次读取_Go 经典入门系列 24:Select
  5. 数组 verilog_SystemVerilog语言简介(与Verilog的30点对比)
  6. 动态网页开发基础【笔记】
  7. x86服务器当虚拟化的存储,龙存科技-软件定义数据中心产品提供商
  8. 第5课 开心的金明《聪明人的游戏:信息学探秘.提高篇》(优化空间)
  9. 文字溢出时,实现在末尾显示三个点省略效果
  10. jquery ajax post 传递数组 ,多checkbox 取值
  11. jstack会导致JVM停顿
  12. linux内核被加载的过程
  13. cocos2dx 2.0升级为3.0一些常见变化纪录
  14. 小技巧 - 如何下载微信公众号音频?(附:此方法可用于类似的Web)
  15. 情感读本杂志情感读本杂志社情感读本编辑部2022年第23期目录
  16. skyeye与uClinux的安装
  17. 支付宝云支付如何开通?
  18. Moss 自定义Featur
  19. OCI runtime create failed: runc create failed: unable to start container process: --docker加载镜像
  20. matlab隐形眼镜类型预测,决策树预测隐形眼镜类型

热门文章

  1. R语言ggplot2可视化抑制(部分)图例(legend)输出实战:抑制颜色图例输出、保留数据点形状图例输出
  2. 文件名批量汉字转拼音+核磁共振影像数据处理
  3. HMM+三个基本问题
  4. 词频-逆向文件频率TF-IDF(term frequency–inverse document frequency)是什么?有什么用处?
  5. R语言常用的统计函数
  6. php mysql技术笔试题_PHP面试笔试题--选择题部分(最新整理)
  7. ML基石_LinearModelsForClassfication
  8. 差分轮移动机器人模型预测控制MPC
  9. php doss_php下ddos攻击与防范代码
  10. python pillow 扩展图片增强