Excel精英培训网

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

[已解决]万能的VBA、实现根据身份证号统计家庭户数报表

[复制链接]
发表于 2015-2-1 19:22 | 显示全部楼层 |阅读模式
万能的VBA、实现根据身份证号统计家庭户数报表
我一个朋友在居委会上班,找我帮做个这样的统计表报表。
感觉好难,请各位高手老师帮帮忙,谢谢大家了!
附件中做了手工表!
如图:
效果图.jpg
VBA根据身份证号统计户数报表.rar (8.4 KB, 下载次数: 19)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2015-2-1 19:52 | 显示全部楼层
回复

使用道具 举报

发表于 2015-2-2 05:22 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, j%, s&, k%, rng As Range
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Sheets("数据源").Range("a1").CurrentRegion
  5. ReDim brr(1 To UBound(arr), 1 To 11)
  6. For i = 2 To UBound(arr)
  7.     If arr(i, 8) = "本人" Then d(arr(i, 4)) = i
  8. Next
  9. For i = 2 To UBound(arr)
  10.     If arr(i, 8) <> "本人" And d.exists(arr(i, 8)) Then d(arr(i, 8)) = d(arr(i, 8)) & " " & i
  11. Next
  12. a = d.keys: b = d.items
  13. Application.ScreenUpdating = False
  14. Application.DisplayAlerts = False
  15. Range("a2:k60000").Clear
  16. With [a:k]
  17.     .NumberFormatLocal = "@"
  18.     .HorizontalAlignment = xlCenter
  19.     .VerticalAlignment = xlCenter
  20. End With
  21. For i = 0 To d.Count - 1
  22.     x = Split(b(i))
  23.     For j = 0 To UBound(x)
  24.         s = s + 1: n = x(j)
  25.         brr(s, 1) = i + 1
  26.         If j = 0 Then
  27.             Cells(s + 1, 1).Resize(UBound(x) + 1).Merge
  28.             If rng Is Nothing Then
  29.                 Set rng = Cells(s + 1, 4)
  30.             Else
  31.                 Set rng = Union(rng, Cells(s + 1, 4))
  32.             End If
  33.         End If
  34.         If j = 1 Then Cells(s + 1, 2).Resize(UBound(x)).Merge
  35.         brr(s, 2) = IIf(j = 0, "户主", "成员")
  36.         brr(s, 3) = j + 1
  37.         For k = 2 To 9
  38.             brr(s, k + 2) = arr(n, k)
  39.         Next
  40.     Next
  41.    
  42. Next
  43. Range("a2").Resize(s, 11) = brr
  44. If Not rng Is Nothing Then
  45.     rng.Font.ColorIndex = 3
  46.     rng.Font.Bold = True
  47. End If
  48. Application.DisplayAlerts = True
  49. Application.ScreenUpdating = True
  50. End Sub
复制代码
回复

使用道具 举报

发表于 2015-2-2 05:26 | 显示全部楼层    本楼为最佳答案   
………………

VBA根据身份证号统计户数报表.zip

11.53 KB, 下载次数: 47

回复

使用道具 举报

 楼主| 发表于 2015-2-3 11:41 | 显示全部楼层
dsmch 发表于 2015-2-2 05:26
………………

老师你好,感谢你的帮助,非常好用。

可以再麻烦老师帮我加下每句的注释吗,谢谢你了老师!
回复

使用道具 举报

发表于 2015-2-3 12:29 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2015-2-3 13:17 | 显示全部楼层
dsmch 发表于 2015-2-3 12:29
程序解释器
http://www.excelpx.com/forum.php?mod=viewthread&tid=186721&highlight=%B3%CC%D0%F2%BD%E2% ...

老师你好,我用了这个

但,还是好多语句看不懂,麻烦老师空的时候,帮我加下好吗,谢谢你了老师!
回复

使用道具 举报

发表于 2015-2-3 13:38 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, j%, s&, k%, rng As Range
  3. '声明字典对象
  4. Set d = CreateObject("scripting.dictionary")
  5. '源数据数据放入数组arr
  6. arr = Sheets("数据源").Range("a1").CurrentRegion
  7. '结果放入数组brr,首先找出户主,因为源数据较乱,有时是家庭成员在前
  8. ReDim brr(1 To UBound(arr), 1 To 11)
  9. '循环数组arr,
  10. For i = 2 To UBound(arr)
  11.     If arr(i, 8) = "本人" Then d(arr(i, 4)) = i
  12. Next
  13. '把和户主身份证相同的行放在同一条目
  14. For i = 2 To UBound(arr)
  15.     If arr(i, 8) <> "本人" And d.exists(arr(i, 8)) Then d(arr(i, 8)) = d(arr(i, 8)) & " " & i
  16. Next
  17. a = d.keys: b = d.items
  18. Application.ScreenUpdating = False
  19. Application.DisplayAlerts = False
  20. '清空单元格并设置单元格格式
  21. Range("a2:k60000").Clear
  22. With [a:k]
  23.     .NumberFormatLocal = "@"
  24.     .HorizontalAlignment = xlCenter
  25.     .VerticalAlignment = xlCenter
  26. End With
  27. '按户主循环,户主和成员归队
  28. For i = 0 To d.Count - 1
  29.     '条目分列,具体到每个家庭成员所在的行
  30.     x = Split(b(i))
  31.     For j = 0 To UBound(x)
  32.         s = s + 1: n = x(j)
  33.         brr(s, 1) = i + 1 '户数序号
  34.         If j = 0 Then
  35.             '分别按每户人数合并单元格
  36.             Cells(s + 1, 1).Resize(UBound(x) + 1).Merge
  37.             '把户主所在的单元格放入rng ,方便统一设置格式
  38.             If rng Is Nothing Then
  39.                 Set rng = Cells(s + 1, 4)
  40.             Else
  41.                 Set rng = Union(rng, Cells(s + 1, 4))
  42.             End If
  43.         End If
  44.         If j = 1 Then Cells(s + 1, 2).Resize(UBound(x)).Merge
  45.         brr(s, 2) = IIf(j = 0, "户主", "成员") '家庭关系
  46.         brr(s, 3) = j + 1 '家庭人员序号
  47.         '按数组arr对应的行放进数组brr
  48.         For k = 2 To 9
  49.             brr(s, k + 2) = arr(n, k)
  50.         Next
  51.     Next
  52.    
  53. Next
  54. '填充结果
  55. Range("a2").Resize(s, 11) = brr
  56. '设置户主所在的单元格字体格式
  57. If Not rng Is Nothing Then
  58.     rng.Font.ColorIndex = 3
  59.     rng.Font.Bold = True
  60. End If
  61. '设置边框
  62. Range("a1").CurrentRegion.Borders.LineStyle = 1
  63. Application.DisplayAlerts = True
  64. Application.ScreenUpdating = True
  65. End Sub
复制代码

评分

参与人数 1 +12 收起 理由
yjwdjfqb + 12 感谢老师的耐心解答!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-6-20 10:30 | 显示全部楼层
dsmch 发表于 2015-2-3 13:38

老师你好,今天我在用这个实例,进行统计时,增加了些项目。
我修改了下,结果没有正确
我在“原数据中,增加了些项目,就是备注一到三十”,想在统计的时候,也能在统计表中,统计显示出来,请老师帮帮忙,谢谢你了老师!
VBA根据身份证号的唯一性来统计每个户主的家庭成员.rar (123.56 KB, 下载次数: 13)
回复

使用道具 举报

 楼主| 发表于 2016-12-11 22:43 | 显示全部楼层

老师你好,最近在录入精准扶贫名册时,想起老师帮我的这个文件
是去年做的
但在用的时候,要增加些统计项目,不会做,请老师帮我加下好吧,谢谢你了老师!
VBA根据身份证号的唯一性生成统计表.rar (38.81 KB, 下载次数: 5)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 22:19 , Processed in 0.305035 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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