考勤数据标准化处理(考勤标准化管理制度)
ztj100 2025-05-02 22:44 39 浏览 0 评论
经常做考勤的同学有没有遇到过这样的考勤数据呢?
没错,从考勤机里导出来的,要统计那叫一个麻烦啊(有同学说可以导出txt文件,然后再处理会省事很多,有条件的小伙伴可以自己研究研究)
看这表格数据其实挺规范的,每个人占2行,第一行是个人信息(个人信息的C列是工号,K列是姓名(后面还有部门这里用不上就不截图出来了)),第二号是打卡记录,打卡记录每天占用一列,时间统一5位数
知道规则以后,我们就来写个vba 代码秒杀它
代码有点长,就不放代码图了,直接贴出来吧,
这是主过程,代码量其实并不多,复制粘贴就好
Option Explicit Sub 处理考勤数据() Dim kqStr As String, yfStr As String Dim ghStr As String, xmStr As String Dim xRow As Integer, iRow As Integer Dim xCol As Integer, xLen As Integer Dim oArr(1 To 10000, 1 To 6) With Worksheets(1) '考勤数据表 yfStr = Split(.Range("C3").Value, "-", , vbTextCompare)(1) For xRow = 6 To .UsedRange.Rows.Count Step 2 ghStr = .Range("C" & xRow - 1).Value '工号赋值给变量 xmStr = .Range("K" & xRow - 1).Value '姓名赋值给变量 For xCol = 1 To 31 kqStr = .Cells(xRow, xCol).Value '考勤记录赋值给变量 If Len(kqStr) > 3 Then For xLen = 1 To Len(kqStr) Step 5 iRow = iRow + 1 oArr(iRow, 1) = yfStr '考勤月分 oArr(iRow, 2) = xCol '考勤日期 oArr(iRow, 3) = ghStr '工号 oArr(iRow, 4) = xmStr '姓名 oArr(iRow, 5) = CDate(Mid(kqStr, xLen, 5)) '分离时间 oArr(iRow, 6) = 状态(oArr(iRow, 5)) '判断结果 Next End If Next Next End With With Worksheets("处理结果") .Range("A:D").ClearContents .Range("A1").Resize(, 6).Value = Array("考勤月分", "日期", "工号", "姓名", "打卡时间", "状态") .Range("A2").Resize(iRow, 6).Value = oArr End With MsgBox "考勤数据标准化处理完毕,共计处理出 " & iRow & " 条记录!", , "处理完成" End Sub |
这里还有个自定义函数,取出时间后,简单判断一下刷卡结果,因打卡记录不规范,此结果仅供参考分析之用。(该函数也可以用到单元格中)
Function 状态(ByVal dkTime As Date) '判断刷卡结果 Select Case dkTime Case Is <= #8:00:00 AM# 状态 = "正常" Case Is < #12:00:00 PM# 状态 = "异常" Case Is <= #2:00:00 PM# 状态 = "正常" Case Is < #6:00:00 PM# 状态 = "异常" Case Else 状态 = "正常" End Select End Function |
自定义函数中的异常其实就是迟到或早退,为了给新人降低难度,统一做异常处理了。
因为这个非常不好判断(有打上班卡,提前打下班卡叫早退,也有可能是忘了有没有打上班卡,补打一次(宁愿迟到也不愿意旷工半天),下班正常打卡,(中余外出打2次卡)等等,不同公司制度不同,情况太复杂了)
代码写好以后,要方便操作,还是插入一个形状,然后右键它,指定宏,选择 处理考勤数据 这个宏,指定好以后直接点按钮就可以啦,来看一下效果图吧!
处理成这样的数据以后,要用函数,或者透视表来分析都很方便了!
接下来就用透视表来分析一下吧,为了方便后期刷新(每个月都要做,总不能每个月都手工插入透视表吧?),把这结果表做成超级表,然后再来创建透视表,以后超级表中数据有增减,在透视表中只需要刷新就可以更新结果了
鼠标选中数据区域中任意单元格,点开始,套用表格样式,点选一个你喜欢的样式,弹出的窗口中一定要勾上 数据源包含标题
来看一下步骤图吧,
表格样式套用好了,我们再来修改它的名字,同样的选中超级表中任意单元格,点 功能区最右边的 表设计 把名称修为 考勤数据 ,来看一下设置步骤
为什么要修改名字呢?因为后面要让它自动更新,统一名称好操作一点。设置好以后,就插入透视表,同样的选中超级表中任意单元格,点 插入,透视表,来看步骤图05
不需要将数据添加到数据模型,所以这里不勾它(版本不同,可能没有此选项,请忽略)
(加入数据模型后,透视表会有一些隐藏功能,我们用不上,所以不用勾选)
然后在透视表里拖拖拖,做简单的汇总分析
把状态 拉到列,再拉一个状态到值(计数),把姓名和日期拉到行
左边的透视表中可以看到汇总情况,大致看一下,刷卡很不规范有刷超过4次和不足4次的,这样的数据要统计还是很麻烦的。
这就是为什么会有人说考勤是史上最难处理的原因了,(如何准确处理考勤结果就不在讨论范围内了,因为各公司制度不同,处理起来差异很大,数据标准化以后可以自己想办法处理了!)
到这一步,次月考勤数据更新以后,还无法实现刷新效果,因为我还没有写对超级表中的数据做更改的代码。
接下来把之前的过程复制一份出来,对名称做一个修改,再添加一些代码进去,就可以实现了
Sub 处理考勤数据超级表() Dim kqStr As String, yfStr As String Dim ghStr As String, xmStr As String Dim xRow As Integer, iRow As Integer Dim xCol As Integer, xLen As Integer Dim oArr(1 To 10000, 1 To 6) Dim lst As ListObject With Worksheets("考勤记录") yfStr = Split(.Range("C3").Value, "-", , vbTextCompare)(1) For xRow = 6 To .UsedRange.Rows.Count Step 2 ghStr = .Range("C" & xRow - 1).Value '工号赋值给变量 xmStr = .Range("K" & xRow - 1).Value '姓名赋值给变量 For xCol = 1 To 31 kqStr = .Cells(xRow, xCol).Value '考勤记录赋值给变量 If Len(kqStr) > 3 Then For xLen = 1 To Len(kqStr) Step 5 iRow = iRow + 1 oArr(iRow, 1) = yfStr '考勤月分 oArr(iRow, 2) = xCol '考勤日期 oArr(iRow, 3) = ghStr '工号 oArr(iRow, 4) = xmStr '姓名 oArr(iRow, 5) = CDate(Mid(kqStr, xLen, 5)) '分离时间 oArr(iRow, 6) = 状态(oArr(iRow, 5)) '判断结果 Next End If Next Next End With With Worksheets("处理结果") For Each lst In .ListObjects If lst.Name = "考勤数据" Then lst.Range.Delete Exit For End If Next .Range("A1").Resize(, 6).Value = Array("考勤月分", "日期", "工号", "姓名", "打卡时间", "状态") .Range("A2").Resize(iRow, 6).Value = oArr .ListObjects.Add(xlSrcRange, .Range("$A$1").CurrentRegion, , xlYes).Name = "考勤数据" End With ActiveWorkbook.RefreshAll MsgBox "考勤数据标准化处理完毕,共计处理出 " & iRow & " 条记录!", , "处理完成" End Sub |
为了方便看处理出来的区别,先把透视表 行 中的日期拉出去,看一下结果
可以看到 姓名最后有空白,那是因为考勤数据源里有的姓名被删除掉了,接下来要做的是去数据源里,把没姓名的记录都删除掉,然后再使用新的宏,重新分析。
可以多删除一些,方便看效果,在透视表里插入一个形状,指定 处理考勤数据超级表 这个宏 忘了怎么指定了?翻一下上面的记录,有过!
都设置好以后,就是点按钮啦!!看吧,很香的哟!!
点一下,结果就出来了,用VBA是不是很香啊,可能你每个月要花几小时来做的事情,用它只需要点一下,不到1秒就处理完了。数据标准化处理以后,再做其它分析就简单多啦!!
相关推荐
- 30天学会Python编程:16. Python常用标准库使用教程
-
16.1collections模块16.1.1高级数据结构16.1.2示例...
- 强烈推荐!Python 这个宝藏库 re 正则匹配
-
Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
-
Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
-
实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
-
我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...
- 深入理解re模块:Python中的正则表达式神器解析
-
在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
-
需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...
- 先Mark后用!8分钟读懂 Python 性能优化
-
从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...
- Python“三步”即可爬取,毋庸置疑
-
声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
-
1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...
- Lavazza拉瓦萨再度牵手上海大师赛
-
阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...
- ArkUI-X构建Android平台AAR及使用
-
本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...
- Deepseek写歌详细教程(怎样用deepseek写歌功能)
-
以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...
- “AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测
-
“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...
- AI音乐制作神器揭秘!3款工具让你秒变高手
-
在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 30天学会Python编程:16. Python常用标准库使用教程
- 强烈推荐!Python 这个宝藏库 re 正则匹配
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
- 深入理解re模块:Python中的正则表达式神器解析
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
- 先Mark后用!8分钟读懂 Python 性能优化
- Python“三步”即可爬取,毋庸置疑
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)