zoukankan      html  css  js  c++  java
  • 考勤打卡机导出的excel考勤时间表如何生成实用的考勤表

    该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 = 120
    
    '单元格每行是一个数组元素lines()
    Dim lines() As String
    '单元格有多少行
    Dim count As Integer
    
    
    '没打卡-空值,返回1 相当于count=0
    If IsEmpty(cs) Then
        cal = 1
        Exit Function
    End If
    
    
    count = Len(cs.Text) - Len(Application.WorksheetFunction.Substitute(cs.Text, Chr(10), "")) + 1
    
    '大于3次以上的打卡记录返回10*n
    If count >= 3 Then
        cal = count * 10
        Exit Function
    End 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=1
    End If
    
    'count=2
    Dim line1, line2 As String
    Dim moring_tmp, evening_tmp As Integer
    morning_tmp = 0
    evening_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
    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 = 120
    
    '单元格每行是一个数组元素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(10), "")) + 1
    
    '大于3次以上的打卡记录返回10*n
    If count >= 3 Then
        cals = "异常打卡" & CStr(count) & ""
        Exit Function
    End 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=1
    End If
    
    'count=2
    Dim line1, line2 As String
    Dim moring_tmp, evening_tmp As Integer
    morning_tmp = 0
    evening_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_tmp
    Select Case (morning_tmp + evening_tmp)
    
    
    Case 0
    cals = "全勤"
    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


    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

  • 相关阅读:
    爬虫大作业
    作业
    新练习
    爬虫新练习
    最新操作
    小练习
    Hadoop综合大作业
    理解Mapreduce
    熟悉常用的HBase操作
    第三章 熟悉常用的HDFS操作
  • 原文地址:https://www.cnblogs.com/jjkv3/p/11179456.html
Copyright © 2011-2022 走看看