Excel精英培训网

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

[已解决]求助:数据按大小分组后再归类

[复制链接]
发表于 2015-3-10 16:57 | 显示全部楼层 |阅读模式
有大量随机数据,要找出最大和最小值,然后按最大和最小值等分成x组(比如40组),然后把所有数据按大小归类到各自x组中去。根据例子数据处理,第三列中的Mx为目标,第一和第二列一起归类。

最佳答案
2015-3-12 06:01
  1. Sub Macro1()
  2. On Error Resume Next
  3. Dim arr, wb As Workbook, i%, j&, k&
  4. Set wb = ThisWorkbook
  5. Application.ScreenUpdating = False
  6. Application.DisplayAlerts = False
  7. '保留界面工作表,删除多余表
  8. For i = Sheets.Count To 1 Step -1
  9.     If Sheets(i).Name <> "界面" Then Sheets(i).Delete
  10. Next
  11. n = Val(Application.InputBox("请输入组数"))
  12. '获得最大数和最小数,方便分组
  13. mymax = 0: mymin = 10 ^ 8
  14. With Workbooks.Open(ThisWorkbook.Path & "\原始数据.xls")
  15.     For i = 1 To .Sheets.Count
  16.         arr = .Sheets(i).Range("a1").CurrentRegion
  17.         For j = 2 To UBound(arr)
  18.             If arr(j, 3) > mymax Then mymax = arr(j, 3)
  19.             If arr(j, 3) < mymin Then mymin = arr(j, 3)
  20.         Next
  21.     Next
  22.     .Close False
  23. End With
  24. '分组,命名工作表名称
  25. s = Round((mymax - mymin) / n, 3)
  26. For k = mymin To mymax + 0.1 * s Step s
  27.     With Sheets.Add(after:=Sheets(Sheets.Count))
  28.         [a1:c1] = "标题"
  29.         ActiveSheet.Name = k + s & "以下"
  30.     End With
  31. Next
  32. With Workbooks.Open(ThisWorkbook.Path & "\原始数据.xls")
  33.     For i = 1 To .Sheets.Count
  34.         arr = .Sheets(i).Range("a1").CurrentRegion
  35.         For j = 2 To UBound(arr)
  36.             n2 = (arr(j, 3) - mymin) \ s + 2
  37.             h = wb.Sheets(n2).Cells(65536, 1).End(xlUp).Row + 1
  38.             .Sheets(i).Cells(j, 1).Resize(1, 3).Copy wb.Sheets(n2).Cells(h, 1)
  39.         Next
  40.     Next
  41.     .Close False
  42. End With
  43. Sheets("界面").Activate
  44. Application.DisplayAlerts = True
  45. Application.ScreenUpdating = True
  46. End Sub
复制代码

求助.rar

268.38 KB, 下载次数: 7

例子数据

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2015-3-11 13:27 | 显示全部楼层
让高手来解决

点评

简化数据,模拟结果,方便大家理解问题。  发表于 2015-3-11 14:05
回复

使用道具 举报

 楼主| 发表于 2015-3-11 15:12 | 显示全部楼层
附件包含原始数据和处理后效果的数据,真实中数据量比较大,有几百万行不能合并到一个sheet中,只能一个一个sheet搜索,求助。。。

数据.rar

14.45 KB, 下载次数: 14

回复

使用道具 举报

发表于 2015-3-11 21:35 | 显示全部楼层
实际上并没有搞懂你的结果是如何计算的。1、分成X组,用什么条件分2、按大小规到X组中去,具体归类的对应关系没说清楚。简单地说,多大的数归在第一组,多大的数又归第二驵?
回复

使用道具 举报

 楼主| 发表于 2015-3-11 22:04 | 显示全部楼层
不好意思,没有表达清楚,就是找出所有sheet第三列数据的最大和最小值,然后按最大(9)和最小值(0.1)平均分成x组(4组),4组范围分别就是(0.1~2.325)、(2.325~4.55)、(4.55~6.775)、(6.775~9),然后按第三数据按大小归类到4组中其中一组去。其中2.325=((9-0.1)/4)+0.1,4.55=((9-0.1)/4)*2+0.1,6.775=((9-0.1)/4)*3+0.1。不知道这样是否表达清楚了。
回复

使用道具 举报

发表于 2015-3-12 06:01 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. On Error Resume Next
  3. Dim arr, wb As Workbook, i%, j&, k&
  4. Set wb = ThisWorkbook
  5. Application.ScreenUpdating = False
  6. Application.DisplayAlerts = False
  7. '保留界面工作表,删除多余表
  8. For i = Sheets.Count To 1 Step -1
  9.     If Sheets(i).Name <> "界面" Then Sheets(i).Delete
  10. Next
  11. n = Val(Application.InputBox("请输入组数"))
  12. '获得最大数和最小数,方便分组
  13. mymax = 0: mymin = 10 ^ 8
  14. With Workbooks.Open(ThisWorkbook.Path & "\原始数据.xls")
  15.     For i = 1 To .Sheets.Count
  16.         arr = .Sheets(i).Range("a1").CurrentRegion
  17.         For j = 2 To UBound(arr)
  18.             If arr(j, 3) > mymax Then mymax = arr(j, 3)
  19.             If arr(j, 3) < mymin Then mymin = arr(j, 3)
  20.         Next
  21.     Next
  22.     .Close False
  23. End With
  24. '分组,命名工作表名称
  25. s = Round((mymax - mymin) / n, 3)
  26. For k = mymin To mymax + 0.1 * s Step s
  27.     With Sheets.Add(after:=Sheets(Sheets.Count))
  28.         [a1:c1] = "标题"
  29.         ActiveSheet.Name = k + s & "以下"
  30.     End With
  31. Next
  32. With Workbooks.Open(ThisWorkbook.Path & "\原始数据.xls")
  33.     For i = 1 To .Sheets.Count
  34.         arr = .Sheets(i).Range("a1").CurrentRegion
  35.         For j = 2 To UBound(arr)
  36.             n2 = (arr(j, 3) - mymin) \ s + 2
  37.             h = wb.Sheets(n2).Cells(65536, 1).End(xlUp).Row + 1
  38.             .Sheets(i).Cells(j, 1).Resize(1, 3).Copy wb.Sheets(n2).Cells(h, 1)
  39.         Next
  40.     Next
  41.     .Close False
  42. End With
  43. Sheets("界面").Activate
  44. Application.DisplayAlerts = True
  45. Application.ScreenUpdating = True
  46. End Sub
复制代码
回复

使用道具 举报

发表于 2015-3-12 06:07 | 显示全部楼层
楼主的分组并不能涵盖所有数据,比如,第一张表0.1~2.325 ,大于等于0.1同时小于2.325,这样最大数9就会漏掉,附件多出一组

Downloads.zip

26.17 KB, 下载次数: 4

回复

使用道具 举报

 楼主| 发表于 2015-3-13 08:24 | 显示全部楼层
不好意思,来晚了,谢谢dsmch
回复

使用道具 举报

 楼主| 发表于 2015-3-13 08:32 | 显示全部楼层
不知道是否可以追加问题,当要分组的数据中有负数时好像不对啊,dsmch能否改进下?

点评

用附件模拟一下结果  发表于 2015-3-13 08:54
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 00:32 , Processed in 0.434816 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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