ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何根据原始表的4列关键字班级姓名大类小类生成目标表和统计表20180621

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-6-21 15:50 | 显示全部楼层 |阅读模式
原始表中:关键列班级,姓名,大类,小类,不固定 如何根据原始表的4列关键字班级姓名大类小类生成目标表和统计表20180621.rar (19.94 KB, 下载次数: 5)
目标表:根据大类,小类生成各班级名单
统计表:生成各班级各大类小类人数。

TA的精华主题

TA的得分主题

发表于 2018-6-22 18:18 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   With Worksheets("原始")
  7.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.     arr = .Range("a2:h" & r)
  9.   End With
  10.   ReDim crr(1 To 14)
  11.   For i = 1 To UBound(arr)
  12.     If Not d.exists(arr(i, 1)) Then
  13.       Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  14.     End If
  15.     If Not d(arr(i, 1)).exists(arr(i, 7)) Then
  16.       Set d(arr(i, 1))(arr(i, 7)) = CreateObject("scripting.dictionary")
  17.     End If
  18.     If Not d(arr(i, 1))(arr(i, 7)).exists(arr(i, 8)) Then
  19.       m = 1
  20.       ReDim brr(1 To m)
  21.     Else
  22.       brr = d(arr(i, 1))(arr(i, 7))(arr(i, 8))
  23.       m = UBound(brr) + 1
  24.       ReDim Preserve brr(1 To m)
  25.     End If
  26.     brr(m) = arr(i, 3)
  27.     d(arr(i, 1))(arr(i, 7))(arr(i, 8)) = brr
  28.   Next
  29.   With Worksheets("目标表")
  30.     .Cells.Clear
  31.     .Range("a3").Resize(1, 14) = [{"班级","合计","报名","","","","","","未报名","","","","",""}]
  32.     .Range("a4").Resize(1, 14) = [{"","","小计","休学","正常","转出","转学","复学","小计","休学","正常","转出","转学","复学"}]
  33.     For j = 2 To 14
  34.       If .Cells(3, j) = "" Then
  35.         .Cells(3, j - 1).Resize(1, 2).Merge
  36.       End If
  37.     Next
  38.     .Range("a3").Resize(2, 1).Merge
  39.     .Range("b3").Resize(2, 1).Merge
  40.     m = 6
  41.     For Each aa In d.keys
  42.       n1 = -3
  43.       hj = 0
  44.       For Each bb In Array("报名", "未报名")
  45.         n1 = n1 + 6
  46.         If d(aa).exists(bb) Then
  47.           n2 = 0
  48.           For Each cc In Array("休学", "正常", "转出", "转学", "复学")
  49.             n2 = n2 + 1
  50.             If d(aa)(bb).exists(cc) Then
  51.               brr = d(aa)(bb)(cc)
  52.               .Cells(m, n1 + n2).Resize(UBound(brr), 1) = Application.Transpose(brr)
  53.               If hj < UBound(brr) Then
  54.                 hj = UBound(brr)
  55.               End If
  56.             Else
  57.               gs1 = gs1 & "+" & "0"
  58.             End If
  59.           Next
  60.         End If
  61.       Next
  62.       For Each y In Array(1, 2, 3, 9)
  63.         With .Cells(m, y)
  64.           .Resize(hj, 1).Merge
  65.         End With
  66.       Next
  67.       With .Cells(m, 1)
  68.         .Value = aa
  69.       End With
  70.       m = m + hj
  71.     Next
  72.     r = .UsedRange.Find(what:="*", LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious).Row
  73.     ReDim crr(1 To 14)
  74.     ReDim drr(1 To 14)
  75.     For i = 6 To r
  76.       If .Cells(i, 1).MergeArea.Cells(1, 1).Address = .Cells(i, 1).Address Then
  77.         hs = .Cells(i, 1).MergeArea.Rows.Count
  78.         gs0 = ""
  79.         hj0 = 0
  80.         For k = 3 To 9 Step 6
  81.           gs1 = ""
  82.           hj1 = 0
  83.           For j = 1 To 5
  84.             s = Application.CountA(.Cells(i, j + k).Resize(hs, 1))
  85.             gs1 = gs1 & "+" & s
  86.             hj1 = hj1 + s
  87.             crr(j + k) = crr(j + k) & "+" & s
  88.             drr(j + k) = drr(j + k) + s
  89.           Next
  90.           .Cells(i, k) = hj1 & "=" & Mid(gs1, 2)
  91.           gs0 = gs0 & "+" & hj1
  92.           hj0 = hj0 + hj1
  93.         Next
  94.         .Cells(i, 2) = hj0 & "=" & Mid(gs0, 2)
  95.         With .Cells(i, 1).Resize(hs, 14)
  96.           .Borders.LineStyle = xlContinuous
  97.           .BorderAround LineStyle:=xlDouble, Weight:=xlMedium
  98.         End With
  99.       End If
  100.     Next
  101.     For k = 3 To 9 Step 6
  102.       For j = 1 To 5
  103.         crr(j + k) = drr(j + k) & "=" & Mid(crr(j + k), 2)
  104.         crr(k) = crr(k) & "+" & drr(j + k)
  105.         drr(k) = drr(k) + drr(j + k)
  106.       Next
  107.       crr(k) = drr(k) & "=" & Mid(crr(k), 2)
  108.       crr(2) = crr(2) & "+" & drr(k)
  109.       drr(2) = drr(2) + drr(k)
  110.     Next
  111.     crr(2) = drr(2) & "=" & Mid(crr(2), 2)
  112.     .Range("a5").Resize(1, 14) = crr
  113.     With .Cells(3, 1).Resize(3, 14)
  114.       .Borders.LineStyle = xlContinuous
  115.       .BorderAround LineStyle:=xlDouble, Weight:=xlMedium
  116.     End With
  117.    
  118.     For Each y In Array(2, 8, 14)
  119.       With .Cells(3, y).Resize(r - 2).Borders(xlEdgeRight)
  120.         .LineStyle = xlDouble
  121.         .ColorIndex = 0
  122.         .TintAndShade = 0
  123.         .Weight = xlThick
  124.       End With
  125.     Next
  126.    
  127.     With .UsedRange
  128.       With .Font
  129.         .Size = 10
  130.       End With
  131.       .HorizontalAlignment = xlCenter
  132.       .VerticalAlignment = xlCenter
  133.     End With
  134.   End With
  135. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-22 18:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
详见附件。

如何根据原始表的4列关键字班级姓名大类小类生成目标表和统计表20180621.rar

26.74 KB, 下载次数: 15

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-22 21:05 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 yzyyyyyyy 于 2018-6-25 17:13 编辑
chxw68 发表于 2018-6-22 18:18

感谢大师热心帮助,解决了一大难题。平时,大类和小类,其中的项目非固定,能否直接根据原始表关键列动态提取生成。改了一点,有些问题,人数不对 如何根据原始表4列生成目标表统计表.rar (29.48 KB, 下载次数: 2)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-26 14:59 , Processed in 0.039210 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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