该excel表有如下结构

姓名\日期 周1 周2 周3  周4 周5
张三     7:35
18:02
7:35
18:02
7:46   17:56
李四 7:35
18:02

7:02

18:00

18:02

     

需要判断每天是否迟到早退,并生成考勤表

用如下自定义函数cal或者cals

Public Function cal(ByVal cs As Range) As Integer

'计算单元格并返回相应值如下
'没打卡 1
'正常上下班 0
'迟到 2
'迟到超过2小时 11
'早退 3
'早退超过2小时 12
'迟到+早退 5
'迟到+早退分别都超过2小时
'只有上班打卡,没有下班打卡 4
'只有上班打卡,迟到,没下班打卡 2+4=6
'只有下班打卡,没有上班打卡 7
'只有下班打卡,早退,没有上班打卡 3+7=10
'一天3次打卡记录30
'一天n次以上(n>3)打卡记录 N*10=10n
'异常打卡 10:00-15:30打卡 8
Const morning_time = "08:00"
Const evening_time = "17:30"
'超过120分钟算旷工
Const offset_point = '单元格每行是一个数组元素lines()
Dim lines() As String
'单元格有多少行
Dim count As Integer '没打卡-空值,返回1 相当于count=0
If IsEmpty(cs) Then
cal =
Exit Function
End If count = Len(cs.Text) - Len(Application.WorksheetFunction.Substitute(cs.Text, Chr(), "")) + '大于3次以上的打卡记录返回10*n
If count >= Then
cal = count *
Exit Function
End If '处理只有一条记录的,并计算是否上班
If count = Then Dim offset_morning, offset_evening As Integer offset_morning = Hour(CDate(cs.Text) - CDate(morning_time)) * + Minute(CDate(cs.Text) - CDate(morning_time))
offset_evening = Hour(CDate(cs.Text) - CDate(evening_time)) * + Minute(CDate(cs.Text) - CDate(evening_time))
'MsgBox offset_morning
If CDate(cs.Text) <= CDate(morning_time) Then
' 只有上班打卡,没有下班打卡
cal =
'MsgBox cal
Exit Function End If If CDate(cs.Text) >= CDate(evening_time) Then
' 只有下班打卡,没有上班班打卡
cal =
Exit Function
End If If (CDate(cs.Text) > CDate(morning_time)) And (CDate(cs.Text) < CDate(evening_time)) Then
If offset_morning < Then
'只有上班打卡,迟到,没有下班打卡
cal =
ElseIf offset_evening < Then
'只有下班打卡,早退,没有上班打卡
cal =
Else
'异常打卡
cal =
End If Exit Function
End If 'count=1
End If 'count=2
Dim line1, line2 As String
Dim moring_tmp, evening_tmp As Integer
morning_tmp =
evening_tmp =
'提取第一行打卡和第二行打卡时间line1是上班打卡,line2是下班打卡
line1 = Left(cs.Text, )
line2 = Split(cs.Text, Chr())()
'MsgBox "line1:" & line1
'MsgBox "line2:" & line2 '分别给出 morning_tmp值:如果line1早于8点则返回0,晚于8点且不超过2小时为迟到2,超过2小时取值11 offset_morning = Hour(CDate(line1) - CDate(morning_time)) * + Minute(CDate(line1) - CDate(morning_time))
offset_evening = Hour(CDate(line2) - CDate(evening_time)) * + Minute(CDate(line2) - CDate(evening_time)) 'MsgBox offset_morning
'MsgBox offset_evening If CDate(line1) <= CDate(morning_time) Then
' 正常上班打卡早于8点
morning_tmp =
ElseIf (CDate(line1) > CDate(morning_time)) And (offset_morning < ) Then
' 上班迟到
morning_tmp =
Else
' 上班迟到超过2小时
morning_tmp = End If '分别给出 evening_tmp值:如果line2晚于于17:30则返回0,早于17:30且不超过2小时为早退取值3,超过2小时给值12, If CDate(line2) >= CDate(evening_time) Then
' 正常下班打卡
evening_tmp =
ElseIf (CDate(line2) < CDate(evening_time)) And (offset_evening < ) Then
' 早退
evening_tmp =
Else
' 早退超过2小时
evening_tmp = End If '最终cal= morning_tmp+evening_tmp
cal = morning_tmp + evening_tmp End Function Public Function cals(ByVal cs As Range) As String '计算单元格并返回相应值如下
'没打卡 1
'正常上下班 0
'迟到 2
'迟到超过2小时 11
'早退 3
'早退超过2小时 12
'迟到+早退 5
'迟到+早退分别都超过2小时
'只有上班打卡,没有下班打卡 4
'只有上班打卡,迟到,没下班打卡 2+4=6
'只有下班打卡,没有上班打卡 7
'只有下班打卡,早退,没有上班打卡 3+7=10
'一天3次打卡记录30
'一天n次以上(n>3)打卡记录 N*10=10n
'异常打卡 10:00-15:30打卡 8
Const morning_time = "08:00"
Const evening_time = "17:30"
'超过120分钟算旷工
Const offset_point = '单元格每行是一个数组元素lines()
Dim lines() As String
'单元格有多少行
Dim count As Integer '没打卡-空值,返回1 相当于count=0
If IsEmpty(cs) Then
cals = "休息"
Exit Function
End If count = Len(cs.Text) - Len(Application.WorksheetFunction.Substitute(cs.Text, Chr(), "")) + '大于3次以上的打卡记录返回10*n
If count >= Then
cals = "异常打卡" & CStr(count) & "次"
Exit Function
End If '处理只有一条记录的,并计算是否上班
If count = Then Dim offset_morning, offset_evening As Integer offset_morning = Hour(CDate(cs.Text) - CDate(morning_time)) * + Minute(CDate(cs.Text) - CDate(morning_time))
offset_evening = Hour(CDate(cs.Text) - CDate(evening_time)) * + Minute(CDate(cs.Text) - CDate(evening_time))
'MsgBox offset_morning
If CDate(cs.Text) <= CDate(morning_time) Then
' 只有上班打卡,没有下班打卡
cals = "无下班打卡"
'MsgBox cal
Exit Function End If If CDate(cs.Text) >= CDate(evening_time) Then
' 只有下班打卡,没有上班班打卡
cals = "无上班打卡"
Exit Function
End If If (CDate(cs.Text) > CDate(morning_time)) And (CDate(cs.Text) < CDate(evening_time)) Then
If offset_morning < Then
'只有上班打卡,迟到,没有下班打卡
cals = "迟到,无下班打卡"
ElseIf offset_evening < Then
'只有下班打卡,早退,没有上班打卡
cals = "早退,无上班打卡"
Else
'异常打卡
cals = "10点15点30之间异常打卡"
End If Exit Function
End If 'count=1
End If 'count=2
Dim line1, line2 As String
Dim moring_tmp, evening_tmp As Integer
morning_tmp =
evening_tmp =
'提取第一行打卡和第二行打卡时间line1是上班打卡,line2是下班打卡
line1 = Left(cs.Text, )
line2 = Split(cs.Text, Chr())()
'MsgBox "line1:" & line1
'MsgBox "line2:" & line2 '分别给出 morning_tmp值:如果line1早于8点则返回0,晚于8点且不超过2小时为迟到2,超过2小时取值11 offset_morning = Hour(CDate(line1) - CDate(morning_time)) * + Minute(CDate(line1) - CDate(morning_time))
offset_evening = Hour(CDate(line2) - CDate(evening_time)) * + Minute(CDate(line2) - CDate(evening_time)) 'MsgBox offset_morning
'MsgBox offset_evening If CDate(line1) <= CDate(morning_time) Then
' 正常上班打卡早于8点
morning_tmp =
ElseIf (CDate(line1) > CDate(morning_time)) And (offset_morning < ) Then
' 上班迟到
morning_tmp =
Else
' 上班迟到超过2小时
morning_tmp = End If '分别给出 evening_tmp值:如果line2晚于于17:30则返回0,早于17:30且不超过2小时为早退取值3,超过2小时给值12, If CDate(line2) >= CDate(evening_time) Then
' 正常下班打卡
evening_tmp =
ElseIf (CDate(line2) < CDate(evening_time)) And (offset_evening < ) Then
' 早退
evening_tmp =
Else
' 早退超过2小时
evening_tmp = End If '最终cal= morning_tmp+evening_tmp 'MsgBox morning_tmp + evening_tmp
Select Case (morning_tmp + evening_tmp) Case
cals = "全勤"
Case
cals = "休息"
Case
cals = "迟到"
Case
cals = "早退"
Case
cals = "无下班打卡"
Case
cals = "迟到+早退"
Case
cals = "上班迟到,下班没打卡"
Case
cals = "无上班打卡"
Case
cals = "10:00-15:30异常打卡"
Case
cals = "早退,无上班打卡"
Case
cals = "迟到超2小时"
Case
cals = "早退超2小时"
Case
cals = "迟到早退都超2小时"
Case Else
calse = "异常打卡" & CStr(morning_tmp + evening_tmp) & "次" End Select End Function

Public Function cal(ByVal cs As Range) As Integer
'计算单元格并返回相应值如下'没打卡 1'正常上下班 0'迟到 2'迟到超过2小时 11'早退 3'早退超过2小时 12'迟到+早退 5'迟到+早退分别都超过2小时'只有上班打卡,没有下班打卡 4'只有上班打卡,迟到,没下班打卡 2+4=6'只有下班打卡,没有上班打卡 7'只有下班打卡,早退,没有上班打卡 3+7=10'一天3次打卡记录30'一天n次以上(n>3)打卡记录 N*10=10n'异常打卡 10:00-15:30打卡 8Const morning_time = "08:00"Const evening_time = "17:30"'超过120分钟算旷工Const offset_point = 120
'单元格每行是一个数组元素lines()Dim lines() As String'单元格有多少行Dim count As Integer

'没打卡-空值,返回1 相当于count=0If IsEmpty(cs) Then    cal = 1    Exit FunctionEnd If

count = Len(cs.Text) - Len(Application.WorksheetFunction.Substitute(cs.Text, Chr(10), "")) + 1
'大于3次以上的打卡记录返回10*nIf count >= 3 Then    cal = count * 10    Exit FunctionEnd If

'处理只有一条记录的,并计算是否上班If count = 1 Then
Dim offset_morning, offset_evening As Integer
offset_morning = Hour(CDate(cs.Text) - CDate(morning_time)) * 60 + Minute(CDate(cs.Text) - CDate(morning_time))offset_evening = Hour(CDate(cs.Text) - CDate(evening_time)) * 60 + Minute(CDate(cs.Text) - CDate(evening_time))'MsgBox offset_morning   If CDate(cs.Text) <= CDate(morning_time) Then   ' 只有上班打卡,没有下班打卡      cal = 4      'MsgBox cal      Exit Function         End If         If CDate(cs.Text) >= CDate(evening_time) Then   ' 只有下班打卡,没有上班班打卡      cal = 7      Exit Function   End If         If (CDate(cs.Text) > CDate(morning_time)) And (CDate(cs.Text) < CDate(evening_time)) Then      If offset_morning < 120 Then          '只有上班打卡,迟到,没有下班打卡          cal = 6      ElseIf offset_evening < 120 Then        '只有下班打卡,早退,没有上班打卡            cal = 10       Else        '异常打卡            cal = 8      End If                Exit Function    End If   'count=1End If
'count=2Dim line1, line2 As StringDim moring_tmp, evening_tmp As Integermorning_tmp = 0evening_tmp = 0'提取第一行打卡和第二行打卡时间line1是上班打卡,line2是下班打卡line1 = Left(cs.Text, 5)line2 = Split(cs.Text, Chr(10))(1)'MsgBox "line1:" & line1'MsgBox "line2:" & line2
'分别给出 morning_tmp值:如果line1早于8点则返回0,晚于8点且不超过2小时为迟到2,超过2小时取值11

offset_morning = Hour(CDate(line1) - CDate(morning_time)) * 60 + Minute(CDate(line1) - CDate(morning_time))offset_evening = Hour(CDate(line2) - CDate(evening_time)) * 60 + Minute(CDate(line2) - CDate(evening_time))
'MsgBox offset_morning'MsgBox offset_evening
If CDate(line1) <= CDate(morning_time) Then   ' 正常上班打卡早于8点        morning_tmp = 0      ElseIf (CDate(line1) > CDate(morning_time)) And (offset_morning < 120) Then      ' 上班迟到        morning_tmp = 2      Else      ' 上班迟到超过2小时        morning_tmp = 11               End If

'分别给出 evening_tmp值:如果line2晚于于17:30则返回0,早于17:30且不超过2小时为早退取值3,超过2小时给值12,
If CDate(line2) >= CDate(evening_time) Then   ' 正常下班打卡        evening_tmp = 0      ElseIf (CDate(line2) < CDate(evening_time)) And (offset_evening < 120) Then      ' 早退        evening_tmp = 3      Else      ' 早退超过2小时        evening_tmp = 12               End If
'最终cal= morning_tmp+evening_tmpcal = morning_tmp + evening_tmp

End Function

Public Function cals(ByVal cs As Range) As String
'计算单元格并返回相应值如下'没打卡 1'正常上下班 0'迟到 2'迟到超过2小时 11'早退 3'早退超过2小时 12'迟到+早退 5'迟到+早退分别都超过2小时'只有上班打卡,没有下班打卡 4'只有上班打卡,迟到,没下班打卡 2+4=6'只有下班打卡,没有上班打卡 7'只有下班打卡,早退,没有上班打卡 3+7=10'一天3次打卡记录30'一天n次以上(n>3)打卡记录 N*10=10n'异常打卡 10:00-15:30打卡 8Const morning_time = "08:00"Const evening_time = "17:30"'超过120分钟算旷工Const offset_point = 120
'单元格每行是一个数组元素lines()Dim lines() As String'单元格有多少行Dim count As Integer

'没打卡-空值,返回1 相当于count=0If IsEmpty(cs) Then    cals = "休息"    Exit FunctionEnd If

count = Len(cs.Text) - Len(Application.WorksheetFunction.Substitute(cs.Text, Chr(10), "")) + 1
'大于3次以上的打卡记录返回10*nIf count >= 3 Then    cals = "异常打卡" & CStr(count) & "次"    Exit FunctionEnd If

'处理只有一条记录的,并计算是否上班If count = 1 Then
Dim offset_morning, offset_evening As Integer
offset_morning = Hour(CDate(cs.Text) - CDate(morning_time)) * 60 + Minute(CDate(cs.Text) - CDate(morning_time))offset_evening = Hour(CDate(cs.Text) - CDate(evening_time)) * 60 + Minute(CDate(cs.Text) - CDate(evening_time))'MsgBox offset_morning   If CDate(cs.Text) <= CDate(morning_time) Then   ' 只有上班打卡,没有下班打卡      cals = "无下班打卡"      'MsgBox cal      Exit Function         End If         If CDate(cs.Text) >= CDate(evening_time) Then   ' 只有下班打卡,没有上班班打卡      cals = "无上班打卡"      Exit Function   End If         If (CDate(cs.Text) > CDate(morning_time)) And (CDate(cs.Text) < CDate(evening_time)) Then      If offset_morning < 120 Then          '只有上班打卡,迟到,没有下班打卡          cals = "迟到,无下班打卡"      ElseIf offset_evening < 120 Then        '只有下班打卡,早退,没有上班打卡            cals = "早退,无上班打卡"       Else        '异常打卡            cals = "10点15点30之间异常打卡"      End If                Exit Function    End If   'count=1End If
'count=2Dim line1, line2 As StringDim moring_tmp, evening_tmp As Integermorning_tmp = 0evening_tmp = 0'提取第一行打卡和第二行打卡时间line1是上班打卡,line2是下班打卡line1 = Left(cs.Text, 5)line2 = Split(cs.Text, Chr(10))(1)'MsgBox "line1:" & line1'MsgBox "line2:" & line2
'分别给出 morning_tmp值:如果line1早于8点则返回0,晚于8点且不超过2小时为迟到2,超过2小时取值11

offset_morning = Hour(CDate(line1) - CDate(morning_time)) * 60 + Minute(CDate(line1) - CDate(morning_time))offset_evening = Hour(CDate(line2) - CDate(evening_time)) * 60 + Minute(CDate(line2) - CDate(evening_time))
'MsgBox offset_morning'MsgBox offset_evening
If CDate(line1) <= CDate(morning_time) Then   ' 正常上班打卡早于8点        morning_tmp = 0      ElseIf (CDate(line1) > CDate(morning_time)) And (offset_morning < 120) Then      ' 上班迟到        morning_tmp = 2      Else      ' 上班迟到超过2小时        morning_tmp = 11               End If

'分别给出 evening_tmp值:如果line2晚于于17:30则返回0,早于17:30且不超过2小时为早退取值3,超过2小时给值12,
If CDate(line2) >= CDate(evening_time) Then   ' 正常下班打卡        evening_tmp = 0      ElseIf (CDate(line2) < CDate(evening_time)) And (offset_evening < 120) Then      ' 早退        evening_tmp = 3      Else      ' 早退超过2小时        evening_tmp = 12               End If
'最终cal= morning_tmp+evening_tmp
'MsgBox morning_tmp + evening_tmpSelect Case (morning_tmp + evening_tmp)

Case 0cals = "全勤"Case 1 cals = "休息"Case 2   cals = "迟到"Case 3   cals = "早退"Case 4    cals = "无下班打卡"Case 5     cals = "迟到+早退"Case 6    cals = "上班迟到,下班没打卡"Case 7    cals = "无上班打卡"Case 8    cals = "10:00-15:30异常打卡"Case 10    cals = "早退,无上班打卡"Case 11    cals = "迟到超2小时"Case 12     cals = "早退超2小时"Case 23    cals = "迟到早退都超2小时"Case Else    calse = "异常打卡" & CStr(morning_tmp + evening_tmp) & "次"

End Select

End Function

考勤打卡机导出的excel考勤时间表如何生成实用的考勤表的更多相关文章

  1. Magic xpa 3.x很容易将数据导出到Excel中

    Magic xpa 3.x很方便的将表中数据导出到Excel文件中,还可以自动将表中数据生成各种图表. 通过使用自带的打印数据内部事即可实现. 1.首先将打印数据任务属性设置为“是”. 2.可使用主程 ...

  2. 将ACCESS 的数据库中的表的文件 导出了EXCEL格式

    将ACCESS 的数据库中的表的文件 导出了EXCEL格式 '''' '将ACCESS数据库中的某个表的信息 导出为EXCEL 文件格式 'srcfName ACCESS 数据库文件路径 'desfN ...

  3. DataTable导出到Excel

    简单的导出到Excel中: 代码如下: using System; using System.Collections.Generic; using System.Data; using System. ...

  4. ASP.NET中GridView数据导出到Excel

    /// <summary> /// 导出按钮 /// </summary> /// <param name="sender"></para ...

  5. 【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】

    一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSour ...

  6. PB的datawindow导出到excel文件(使用saveasascii)

    **********************************************************//*函数名称:uf_dwsaveas_excel功能:将数据窗口数据导出EXCEL ...

  7. 纯JS 将table表格导出到excel

    html <div > <button type="button" onclick="getXlsFromTbl('tableExcel','myDiv ...

  8. 将页面上的内容导出到Excel

    <asp:Button ID="lkbExport" runat="server" Name="Save" Text="导出 ...

  9. asp.net教程:GridView导出到Excel或Word文件

    asp.net教程:GridView导出到Excel或Word文件</ br> 在项目中我们经常会遇到要求将一些数据导出成Excel或者Word表格的情况,比如中国移动(我是中国移动用户) ...

随机推荐

  1. sendMessage 与 obtainMessage (sendToTarget)比较

    我们平时在做到多线程问题的时候可能利用Handler去传递Message,其中,经常使用的就是 1.new Handler().obtainMessage().sendToTarget(); 2.ne ...

  2. iOS RACSubject代替通知

    RAC是一个很常用并且很好用的插件,简洁的调用方式可以代替很多原生方法,下面是RACSubject代替通知的使用方式: #import <UIKit/UIKit.h> #import &l ...

  3. Linux CentOS7 安装FTP服务器

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_39680564/article/de ...

  4. Axios的简单用法

    一转眼Vue 3.0都要发布了,学习使用Vue也有一段时间了,记录一下axios的用法 Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中,有点类似于aja ...

  5. css transform解释及demo(基于chrome)

    transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. Transform:(css3 转换) 注意:这些效果叠加时,中间用空格隔开 作用:能够对元 ...

  6. python中print用法

    print用法 参考文档:https://blog.csdn.net/sinat_28576553/article/details/81154912 目录 一.print()函数概述 二.变量的输出 ...

  7. window10自动更换bing壁纸

    问题描述: bing的每日推荐的首页壁纸很不错,想当做系统壁纸! https://cn.bing.com/ 问题解决: 在window-store商店搜索  “Dynamic Theme”,安装即可! ...

  8. 项目Beta冲刺(团队3/7)

    项目Beta冲刺(团队) --3/7 作业要求: 项目Beta冲刺(团队) 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft ...

  9. 20180516模拟赛T2——string

    题解 对于一个字符串A,我们只能把其首字符取出,故如果我们想让A串与B串相等,能重复利用的部分只能是A串结尾与B串开头相等的部分.对于取出的字符,我们可以把'o'放在一个容器中,把'x'放在另一个容器 ...

  10. 2019牛客暑期多校训练营(第六场)C:Palindrome Mouse(回文树+树剖)

    题意:给定字符串Str,求出回文串集合为S,问S中的(a,b)满足a是b的子串的对数. 思路:开始和题解的思路差不多,维护当前后缀的每个串的最后出现位置,但是不知道怎么套“最小回文分割”,所以想到了树 ...