Excel精英培训网

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

[已解决]怎么批量生成农户编号,谢谢

[复制链接]
发表于 2016-4-18 21:24 | 显示全部楼层 |阅读模式
1、黄线左边是新数据,需要生成农户编号。
2、需要实现的功能就是批量智能的识别每个人对应的村组,并且识别该组的最大编号,然后将新数据中的人按照对应的村组逐个编号,排列在原数据之后
3、农户编号共17位,前六位为666888
   7-9位是001,代表乡镇号
   10-12位是村序号,如东渠岸001 南大街005
   13-14位是组序号,01是一组,02是二组
   15-17位是农户序号,001起,最大999
4、举例左边的第一个人王园月,他属于东渠岸村一组,该村的最大编号排到了30,那么王圆月的编号应该为432111200100101031,下一个人就是432111200100101032,一次类推。
5、数据量很大,目前共有32万条
6、请各位高手帮帮忙,谢谢大家!


最佳答案
2016-4-18 23:02
本帖最后由 dsmch 于 2016-4-18 23:07 编辑
  1. Sub Macro1()
  2. Dim arr, brr, crr, d, i&, s&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("f1").CurrentRegion
  5. brr = Range("a4").CurrentRegion
  6. ReDim crr(1 To UBound(brr) - 1, 1 To 3)
  7. For i = 3 To UBound(arr)
  8.     If Len(arr(i, 1)) = 12 Then d(arr(i, 2)) = arr(i, 1)
  9.     If Len(arr(i, 1)) = 14 Then d(arr(i, 2)) = Right(arr(i, 1), 2)
  10.     If Len(arr(i, 1)) = 17 Then
  11.         d(arr(i, 3)) = ""
  12.         zf = Left(arr(i, 1), 14)
  13.         zf2 = Val(Right(arr(i, 1), 3))
  14.         If Not d.exists(zf) Then
  15.             d(zf) = zf2
  16.         Else
  17.         If zf2 > d(zf) Then d(zf) = zf2
  18.         End If
  19.     End If
  20. Next
  21. For i = 2 To UBound(brr)
  22.     If Not d.exists(brr(i, 3)) Then
  23.         s = s + 1
  24.         zf = d(brr(i, 1)) & d(brr(i, 2))
  25.         d(zf) = d(zf) + 1
  26.         crr(s, 1) = zf & Format(d(zf), "000")
  27.         crr(s, 2) = brr(i, 4)
  28.         crr(s, 3) = brr(i, 3)
  29.     End If
  30. Next
  31. If s Then Range("f37").Resize(s, 3) = crr
  32. End Sub
复制代码
195210k00fihbtp64xpgza.jpg

2测城关镇-农户基础信息.rar

11.95 KB, 下载次数: 6

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-4-18 22:18 | 显示全部楼层
附件

2测城关镇-农户基础信息.zip

14.34 KB, 下载次数: 8

回复

使用道具 举报

发表于 2016-4-18 23:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 dsmch 于 2016-4-18 23:07 编辑
  1. Sub Macro1()
  2. Dim arr, brr, crr, d, i&, s&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("f1").CurrentRegion
  5. brr = Range("a4").CurrentRegion
  6. ReDim crr(1 To UBound(brr) - 1, 1 To 3)
  7. For i = 3 To UBound(arr)
  8.     If Len(arr(i, 1)) = 12 Then d(arr(i, 2)) = arr(i, 1)
  9.     If Len(arr(i, 1)) = 14 Then d(arr(i, 2)) = Right(arr(i, 1), 2)
  10.     If Len(arr(i, 1)) = 17 Then
  11.         d(arr(i, 3)) = ""
  12.         zf = Left(arr(i, 1), 14)
  13.         zf2 = Val(Right(arr(i, 1), 3))
  14.         If Not d.exists(zf) Then
  15.             d(zf) = zf2
  16.         Else
  17.         If zf2 > d(zf) Then d(zf) = zf2
  18.         End If
  19.     End If
  20. Next
  21. For i = 2 To UBound(brr)
  22.     If Not d.exists(brr(i, 3)) Then
  23.         s = s + 1
  24.         zf = d(brr(i, 1)) & d(brr(i, 2))
  25.         d(zf) = d(zf) + 1
  26.         crr(s, 1) = zf & Format(d(zf), "000")
  27.         crr(s, 2) = brr(i, 4)
  28.         crr(s, 3) = brr(i, 3)
  29.     End If
  30. Next
  31. If s Then Range("f37").Resize(s, 3) = crr
  32. End Sub
复制代码

2测城关镇-农户基础信息.zip

21.15 KB, 下载次数: 18

回复

使用道具 举报

 楼主| 发表于 2016-4-18 23:22 | 显示全部楼层
谢谢baksy和dsmch 。哈哈 ,竟然函数和vba都可以实现,太棒了!
不过我还不是很懂,我先用吧,明天试着多加些数据进去看看.
今天下午开会还在头疼,没想到到了这里这么快就得到的答案,谢谢本论坛,非常感谢上面两位!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-21 00:08 , Processed in 0.877892 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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