Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3112|回复: 3

[已解决]员工加班时间统计

[复制链接]
发表于 2016-6-3 07:49 | 显示全部楼层 |阅读模式
本帖最后由 阿西木 于 2016-6-3 07:49 编辑

各位高手

统计员工的加班时间,想用VBA或者函数实现,请参考添付文件。
规则:
参考文件【集计用资料】,按照员工加班的“日期”和“类别”,将文件中的“加班时间”,转记到【集计结果】对应员工的日期和类别交集的单元格中。

求助高手予以解答。
最佳答案
2016-6-3 09:47
  1. Sub Macro1()
  2. Dim arr, brr, crr, d, i&, j%
  3. Set d = CreateObject("scripting.dictionary")
  4. brr = Range("a2").CurrentRegion
  5. With Workbooks.Open(ThisWorkbook.Path & "\集计用资料.xls")
  6.     arr = .Sheets(1).Range("a1").CurrentRegion
  7.     .Close 0
  8. End With
  9. For i = 2 To UBound(arr)
  10.     If arr(i, 1) = "" Then
  11.         arr(i, 1) = arr(i - 1, 1)
  12.         arr(i, 2) = arr(i - 1, 2)
  13.     End If
  14.     zf = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 4) & "," & arr(i, 3)
  15.     d(zf) = d(zf) + arr(i, 5)
  16. Next
  17. ReDim crr(1 To UBound(brr) - 2, 1 To UBound(brr, 2) - 4)
  18. For i = 3 To UBound(brr)
  19.     If brr(i, 1) = "" Then
  20.         brr(i, 1) = brr(i - 1, 1)
  21.         brr(i, 2) = brr(i - 1, 2)
  22.     End If
  23.     z = brr(i, 1) & "," & brr(i, 2) & "," & brr(i, 3)
  24.     For j = 5 To UBound(brr, 2)
  25.         zf = z & "," & brr(2, j)
  26.         If d.exists(zf) Then crr(i - 2, j - 4) = d(zf)
  27.     Next
  28. Next
  29. Range("e3").Resize(UBound(crr), UBound(crr, 2)) = crr
  30. End Sub
复制代码

加班时间统计.zip

15.55 KB, 下载次数: 15

发表于 2016-6-3 08:56 | 显示全部楼层
附件

集计结果.rar

7.91 KB, 下载次数: 16

回复

使用道具 举报

发表于 2016-6-3 09:47 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim arr, brr, crr, d, i&, j%
  3. Set d = CreateObject("scripting.dictionary")
  4. brr = Range("a2").CurrentRegion
  5. With Workbooks.Open(ThisWorkbook.Path & "\集计用资料.xls")
  6.     arr = .Sheets(1).Range("a1").CurrentRegion
  7.     .Close 0
  8. End With
  9. For i = 2 To UBound(arr)
  10.     If arr(i, 1) = "" Then
  11.         arr(i, 1) = arr(i - 1, 1)
  12.         arr(i, 2) = arr(i - 1, 2)
  13.     End If
  14.     zf = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 4) & "," & arr(i, 3)
  15.     d(zf) = d(zf) + arr(i, 5)
  16. Next
  17. ReDim crr(1 To UBound(brr) - 2, 1 To UBound(brr, 2) - 4)
  18. For i = 3 To UBound(brr)
  19.     If brr(i, 1) = "" Then
  20.         brr(i, 1) = brr(i - 1, 1)
  21.         brr(i, 2) = brr(i - 1, 2)
  22.     End If
  23.     z = brr(i, 1) & "," & brr(i, 2) & "," & brr(i, 3)
  24.     For j = 5 To UBound(brr, 2)
  25.         zf = z & "," & brr(2, j)
  26.         If d.exists(zf) Then crr(i - 2, j - 4) = d(zf)
  27.     Next
  28. Next
  29. Range("e3").Resize(UBound(crr), UBound(crr, 2)) = crr
  30. End Sub
复制代码

加班时间统计.rar

17.7 KB, 下载次数: 16

评分

参与人数 1 +1 收起 理由
阿西木 + 1 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-6-16 08:32 | 显示全部楼层
dsmch 发表于 2016-6-3 09:47

VBA刚接触,菜鸟一个。

最后一行的赋予,看着还有点儿绕。得花时间琢磨琢磨。
请问第14行和23行的[zf],[f],没有设置变量也运行了。有什么说道吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 11:35 , Processed in 0.887292 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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