ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 人力报表,人员信息按照年龄范围与工龄范围汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-28 22:38 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
表名入职日截止
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif  
属性-部门
  
参数
在职人员年龄分布 
后勤单位-总经理室,生产单位-工程技术部,生产单位-长晶生产部,生产单位-晶圆生产部,生产单位-动力设备部,生产单位-生管部,生产单位-品保部,后勤单位-采购部,后勤单位-财务部,后勤单位-人力资源部,后勤单位-总经办,后勤单位-业务部,后勤单位-基建处
20岁以下,21-25岁,26-30岁,31-35岁,36-40岁,41-50岁,51岁以上
在职人员司龄分布 
后勤单位-总经理室,生产单位-工程技术部,生产单位-长晶生产部,生产单位-晶圆生产部,生产单位-动力设备部,生产单位-生管部,生产单位-品保部,后勤单位-采购部,后勤单位-财务部,后勤单位-人力资源部,后勤单位-总经办,后勤单位-业务部,后勤单位-基建处
0-3个月,4-16个月,7-12个月,1-2年,2-3年,3-5年,5年以上
如表中,年龄与工龄按照参数列的条件进行统计.
  1. Sub 新建工作表()
  2. On Error Resume Next

  3.     tmp = InputBox("请在文本框中输入新建工作表名称:" & Chr(13) & Chr(13) & "按【确定】增加,否则请按【取消】。", "〖点解点解〗")
  4.     If tmp = "" Then tmp = Sheet3.Name
  5.     For Each n In Sheets
  6. If tmp = n.Name Then
  7. tmp = n.Name: k = 1
  8. Exit For
  9. End If
  10. Next
  11. If k <> 1 Then
  12. Sheets.Add After:=Sheets(Sheets.Count)
  13. ActiveSheet.Name = tmp
  14. End If

  15. With Sheets(tmp)
  16. .Cells.Clear
  17. .Cells.RowHeight = Cells(2, 5)
  18. .Cells.ColumnWidth = Cells(2, 6)
  19. .Cells.HorizontalAlignment = xlCenter
  20. .Cells.VerticalAlignment = xlCenter
  21. End With
  22. Dim c As Range
  23. Dim arr
  24. arr = Sheet2.UsedRange
  25. Dim d(1 To 6) As Object
  26. Set dic = CreateObject("Scripting.Dictionary")
  27. Set d(1) = CreateObject("Scripting.Dictionary")
  28. Set d(2) = CreateObject("Scripting.Dictionary")
  29. Set d(3) = CreateObject("Scripting.Dictionary")
  30. Set d(4) = CreateObject("Scripting.Dictionary")
  31. Set d(5) = CreateObject("Scripting.Dictionary")
  32. Set d(6) = CreateObject("Scripting.Dictionary")
  33. For i = 2 To UBound(arr)
  34. If arr(i, 17) = "中专" Or arr(i, 17) = "高中" Then
  35. arr(i, 17) = "高中(含中专)"
  36. ElseIf IsNumeric(Application.Match(arr(i, 17), Split(Cells(4, 4), ","), 0)) Then
  37. arr(i, 17) = arr(i, 17)
  38. Else: arr(i, 17) = "高中以下"
  39. End If
  40. arr(i, 22) = Val(Split(arr(i, 22), "年")) * 12 + Val(Split(Split(arr(i, 22), "年")(1), "月"))

  41. dic(arr(i, 4)) = dic(arr(i, 4)) + 1
  42. d(1)(arr(i, 2) & arr(i, 4)) = d(1)(arr(i, 2) & arr(i, 4)) + 1 '年龄
  43. d(2)(arr(i, 22) & arr(i, 4)) = d(2)(arr(i, 22) & arr(i, 4)) + 1 '司龄
  44. d(3)(arr(i, 17) & arr(i, 4)) = d(3)(arr(i, 17) & arr(i, 4)) + 1 '学历
  45. d(4)(arr(i, 12) & arr(i, 4)) = d(4)(arr(i, 12) & arr(i, 4)) + 1  '岗位
  46. d(5)(arr(i, 6) & arr(i, 4)) = d(5)(arr(i, 6) & arr(i, 4)) + 1   '职等
  47. d(6)(arr(i, 14) & arr(i, 4)) = d(6)(arr(i, 14) & arr(i, 4)) + 1 '性别
  48. Next
  49. m = 5
  50. For i = 2 To 7
  51. aj = Split(Cells(i, 3), ",")
  52. bj = Split(Cells(i, 4), ",")
  53. ReDim sj(UBound(aj))
  54. For j = 0 To UBound(aj)
  55. sj(j) = Split(aj(j), "-")
  56. Next
  57. With Sheets(tmp)
  58. .Cells(m - 3, 2) = Cells(i, 1)
  59. .Cells(m - 3, 2).Font.Bold = True
  60. .Cells(m - 2, 1) = Split(Cells(1, 3), "-")(0)
  61. .Cells(m - 2, 2) = Split(Cells(1, 3), "-")(1)
  62. .Range(.Cells(m - 2, 1), .Cells(m - 1, 1)).Merge
  63. .Range(.Cells(m - 2, 2), .Cells(m - 1, 2)).Merge
  64. With .Cells(m, 1).Resize(UBound(sj) + 1, 2)
  65. .Value = Application.Transpose(Application.Transpose(sj))
  66. End With
  67. With .Cells(m, 2).Resize(UBound(sj) + 1, 1)
  68. .Font.Bold = True
  69. .Interior.ColorIndex = Cells(2, 7)
  70. End With
  71. For j = 0 To UBound(bj)
  72. .Cells(m - 2, j * 2 + 3) = bj(j)
  73. .Range(.Cells(m - 2, j * 2 + 3), .Cells(m - 2, j * 2 + 4)).Merge
  74. .Cells(m - 1, j * 2 + 3) = "人数"
  75. .Cells(m - 1, j * 2 + 4) = "占比"
  76. Next
  77. .Cells(m - 2, 3 + (UBound(bj) + 1) * 2) = "合计"
  78. .Range(.Cells(m - 2, 3 + (UBound(bj) + 1) * 2), .Cells(m - 1, 3 + (UBound(bj) + 1) * 2)).Merge
  79. .Cells(m - 2, 4 + (UBound(bj) + 1) * 2) = "占比"
  80. .Range(.Cells(m - 2, 4 + (UBound(bj) + 1) * 2), .Cells(m - 1, 4 + (UBound(bj) + 1) * 2)).Merge
  81. .Cells(m + UBound(sj) + 1, 1) = "合计"
  82. .Range(.Cells(m + UBound(sj) + 1, 1), .Cells(m + UBound(sj) + 1, 2)).Merge
  83. Set c = .Range(.Cells(m - 2, 1), .Cells(m + UBound(sj) + 1, 4 + (UBound(bj) + 1) * 2))
  84. c.Borders.LineStyle = xlContinuous
  85. c.BorderAround xlContinuous, xlMedium
  86. .Range(.Cells(m - 2, 1), .Cells(m - 1, 4 + (UBound(bj) + 1) * 2)).Interior.ColorIndex = Cells(2, 8)
  87. crr = .Range(.Cells(m - 2, 1), .Cells(m + UBound(sj) + 1, 4 + (UBound(bj) + 1) * 2))
  88. For x = 3 To UBound(crr) - 1
  89. For y = 3 To UBound(crr, 2) - 3 Step 2
  90. crr(x, y) = d(i - 1)(crr(1, y) & crr(x, 2))
  91. crr(x, y + 1) = Format(crr(x, y) / dic(crr(x, 2)), "0.00%")
  92. crr(x, UBound(crr, 2) - 1) = crr(x, UBound(crr, 2) - 1) + crr(x, y)
  93. crr(UBound(crr), y) = crr(UBound(crr), y) + crr(x, y)
  94. crr(UBound(crr), UBound(crr, 2) - 1) = crr(UBound(crr), UBound(crr, 2) - 1) + crr(x, y)
  95. Next
  96. Next
  97. For x = 3 To UBound(crr)
  98. crr(x, UBound(crr, 2)) = Format(crr(x, UBound(crr, 2) - 1) / Val(crr(UBound(crr), UBound(crr, 2) - 1)), "0.00%")
  99. Next
  100. .Cells(m - 2, 1).Resize(UBound(crr), UBound(crr, 2)) = crr
  101. End With
  102. m = m + UBound(aj) + 6
  103. Next
  104. Cells(10, 3) = arr(6, 22)
  105. Cells(11, 3) = Val(Split(arr(6, 22), "年").Value)
  106. Cells(12, 3) = Val(Split(Split(arr(12, 22), "年")(1), "月"))
  107. End Sub
复制代码


人资部报表自动化(未完成).rar

186.03 KB, 下载次数: 47

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-28 22:48 | 显示全部楼层

如表中,年龄与工龄按照参数列的条件进行统计
d(1)(arr(i, 2) & arr(i, 4)) = d(1)(arr(i, 2) & arr(i, 4)) + 1 '年龄
d(2)(arr(i, 22) & arr(i, 4)) = d(2)(arr(i, 22) & arr(i, 4)) + 1 '司龄
这报表自己做到这两天,没有想出好的方法.想是取每个条件参数的后面最大的数字,循环减前面的单元格,那样就固定,有更改就能以调整

TA的精华主题

TA的得分主题

发表于 2015-11-29 11:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请见代码。
2015-11-29统计.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-29 14:14 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-29 14:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

rng 是从目录中第四列D2的值生成的,不是固定的. 也不固定是这年龄范围的.

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-29 14:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-29 15:56 | 显示全部楼层
22列,工龄列,怎么也无法提取年和月的数字,提出来都是文本数据,转换不了数值,

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-29 17:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
z = arr(i, 22)
Trim(Mid(Split(z, "年")(1), 1, Len(Split(z, "年")(1)) - 1))
取月份的数值,
年份的数值怎么也弄不出来

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-29 17:28 | 显示全部楼层
Mid(z, 1, Len(z) - 1 - Len(Split(arr(i, 22), "年")(1)))
年份用这样取值,有什么简单的可代替吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-29 22:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Function npld(n)

  2. Dim x As String
  3. bj = Split(Sheet1.Cells(2, 4), ",")
  4. For i = 0 To UBound(bj)
  5. x = bj(i)
  6. bj(i) = MyGet(x, 0)
  7. Next
  8. Select Case n
  9. Case Is <= Val(bj(0))
  10. col = 3
  11. Case Val(Split(bj(1), "-")) To Val(Split(bj(1), "-")(1))
  12. col = 5
  13. Case Val(Split(bj(2), "-")) To Val(Split(bj(2), "-")(1))
  14. col = 7
  15. Case 31 To 35
  16. col = 9
  17. Case 36 To 40
  18. col = 11
  19. Case 41 To 50
  20. col = 13
  21. Case Is >= 51
  22. col = 15
  23. End Select
  24. End Function
复制代码


Case Is <= Val(bj(0)) 这个值还能得出是20
col = 3
Case Val(Split(bj(1), "-")) To Val(Split(bj(1), "-")(1))  这个就开始错误.我导到excel 得到的结果是数值型的,用在这就没办法使用
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 19:53 , Processed in 0.037261 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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