ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: jhjxy

[求助] 考勤数据分析

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-9 14:13 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-9 13:33
'只写了科室的

'如果没有单刷出现(就是忘刷),白班、夜班可以判断。而实际情况是会出现的,所以没有办 ...

哦,谢谢!!!!!!!!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-19 14:01 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-9 13:33
'只写了科室的

'如果没有单刷出现(就是忘刷),白班、夜班可以判断。而实际情况是会出现的,所以没有办 ...

这个是附件!!!!!!

3月1日至3月6日(源数据)0330.rar

401.05 KB, 下载次数: 3

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-19 14:11 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-9 13:33
'只写了科室的

'如果没有单刷出现(就是忘刷),白班、夜班可以判断。而实际情况是会出现的,所以没有办 ...

以这份附件为准

3月1日至3月6日(源数据)0330.rar

430.88 KB, 下载次数: 22

TA的精华主题

TA的得分主题

发表于 2018-7-19 15:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 一把小刀闯天下 于 2018-7-19 15:42 编辑
jhjxy 发表于 2018-7-19 14:11
以这份附件为准

'只给你计算了每个人的工作天数、工时,工时的计算规则并不明确

'表"3"需要自动转换成"考勤表"?红色底纹的是否考勤异常?
'如果是考勤异常需要自动判断是否为白班、早班、夜班?

'纯属体力活,这得先要理解了才能写,不然修改起来挺费劲

Option Explicit

Sub test()
  Dim arr, i, j, sum, t
  With Sheets("考勤表")
    arr = .Range("a1:ah" & .Cells(Rows.Count, "c").End(xlUp).Row)
    For i = 7 To UBound(arr, 1) Step 3
      sum = 0
      For j = 4 To UBound(arr, 2)
        If Len(arr(i, j)) > 0 And Len(arr(i + 1, j)) > 0 Then
          arr(i + 2, j) = (arr(i + 1, j) - arr(i, j)) * 24
          t = arr(i + 2, j) - Int(arr(i + 2, j))
          arr(i + 2, j) = Int(arr(i + 2, j)) + IIf(t >= 0.5, 0.5, 0) '工时计算规则
          If arr(i + 2, j) > 8 Then sum = sum + 1
        End If
      Next
      arr(i + 2, 2) = sum
    Next
    .[a1].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-19 16:11 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-19 15:32
'只给你计算了每个人的工作天数、工时,工时的计算规则并不明确

'表"3"需要自动转换成"考勤表"?红色 ...

工时的计算就是下班时间减去上班时间

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-19 16:14 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-19 15:32
'只给你计算了每个人的工作天数、工时,工时的计算规则并不明确

'表"3"需要自动转换成"考勤表"?红色 ...

车间里的工人会有晚班的

TA的精华主题

TA的得分主题

发表于 2018-7-20 07:31 | 显示全部楼层
jhjxy 发表于 2018-7-19 16:14
车间里的工人会有晚班的

'先插入一个"sheet2"工作表
'只写了一个位置转换,确认一下位置是否正确。你这考勤表的示例很多是错误的,晚班签到你写到离开那里去了
'后面的工时计算其实上个帖子已经写了,稍作修改加进去就可以了。错误判断结果已经放flag数组中去了

'另外源数据表的11?12?13行数据能否解释一下

Option Explicit

Sub test()
  Dim arr, i, j, k, dic, t, brr, cnt, id, m, td, tm, flag
  Set dic = CreateObject("scripting.dictionary")
  id = 6095173100004#
  ReDim mark(1 To 3)
  mark(1) = Array(#7:45:00 AM#, #5:05:00 PM#) '科室
  mark(2) = Array(#7:45:00 AM#, #8:05:00 PM#) '车间白班
  mark(3) = Array(#7:45:00 PM#, #8:05:00 AM#) '车间夜班
  With Sheets("3")
    arr = .Range("a2:e" & .Cells(Rows.Count, "a").End(xlUp).Row + 1)
  End With
  For i = 1 To UBound(arr, 1) - 1
    For j = i To UBound(arr, 1) - 1
      If arr(j, 2) <> arr(j + 1, 2) Then
        For k = i To j
          dic(CDate(Split(arr(k, 4))(0))) = vbNullString
        Next
        cnt = cnt + 1: i = j: Exit For
      End If
  Next j, i
  brr = dic.keys: dic.RemoveAll
  For i = 0 To UBound(brr) - 1
    For j = i + 1 To UBound(brr)
      If brr(i) > brr(j) Then
        t = brr(i): brr(i) = brr(j): brr(j) = t
      End If
  Next j, i
  For i = 0 To UBound(brr): dic(brr(i)) = i + 4: Next
  ReDim brr(1 To cnt * 3, 1 To dic.Count + 3)
  flag = brr
  For i = 1 To UBound(arr, 1) - 1
    For j = i To UBound(arr, 1) - 1
      If arr(j, 2) <> arr(j + 1, 2) Then
        m = m + 1
        brr(3 * m, 1) = arr(i, 2): brr(3 * m - 2, 2) = "工作"
        brr(3 * m - 1, 2) = "天数": brr(3 * m - 2, 3) = "签到"
        brr(3 * m - 1, 3) = "离开": brr(3 * m, 3) = "工时"
        For k = i To j
          t = Split(arr(k, 4))
          td = CDate(t(0))
          tm = CDate(t(UBound(t)))
          If InStr(arr(i, 1), "车间") > 0 Then '车间
            If arr(i, 5) <> id Then '早班
              If tm <= #12:00:00 PM# Then '早班签到
                brr(3 * (m - 1) + 1, dic(td)) = tm
                If tm > mark(2)(0) Then flag(3 * (m - 1) + 1, dic(td)) = 1 '早班迟到
              Else '早班离开
                brr(3 * (m - 1) + 2, dic(td)) = tm
                If tm < mark(2)(1) Then flag(3 * (m - 1) + 2, dic(td)) = 1 '早班早退
              End If
              '工时计算
            Else '晚班
              If tm > #12:00:00 PM# Then '晚班签到
                brr(3 * (m - 1) + 1, dic(td)) = tm
                If tm > mark(3)(0) Then flag(3 * (m - 1) + 1, dic(td)) = 1 '晚班迟到
              Else
                brr(3 * (m - 1) + 2, dic(td)) = tm
                If tm < mark(3)(1) Then flag(3 * (m - 1) + 2, dic(td)) = 1 '晚班早退
              End If
              '工时计算
            End If
          Else '科室
            If arr(i, 5) <> id Then
              If tm <= #12:00:00 PM# Then '白班签到
                brr(3 * (m - 1) + 1, dic(td)) = tm
                If tm > mark(1)(0) Then flag(3 * (m - 1) + 1, dic(td)) = 1 '白班迟到
              Else '白班离开
                brr(3 * (m - 1) + 2, dic(td)) = tm
                If tm < mark(1)(1) Then flag(3 * (m - 1) + 2, dic(td)) = 1 '白班早退
              End If
              '工时计算
            End If
          End If
        Next
        i = j: Exit For
      End If
  Next j, i
  With Sheets("sheet2").[a7]
    .Resize(Rows.Count - 6, UBound(brr, 2)).ClearContents
    .Offset(, 3).Resize(UBound(brr, 1), UBound(brr, 2)).NumberFormatLocal = "h:mm;@"
    .Resize(UBound(brr, 1), UBound(brr, 2)) = brr
  End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-20 10:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
是这三行数据吗
QQ截图20180720105431.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-20 10:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-20 11:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2018-7-20 07:31
'先插入一个"sheet2"工作表
'只写了一个位置转换,确认一下位置是否正确。你这考勤表的示例很多是错误的 ...

位置转换是对的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-10 17:16 , Processed in 0.023384 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表