Excel精英培训网

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

[已解决]如何用代码把数据分类

[复制链接]
发表于 2016-5-16 08:35 | 显示全部楼层 |阅读模式
本帖最后由 HaiMi 于 2016-5-16 11:56 编辑

附件 数据分类附件.rar (242.64 KB, 下载次数: 24)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-5-16 11:04 | 显示全部楼层
  1. Sub 分类()
  2.     arr = Range("a1:j" & [a65536].End(3).Row)
  3.     Set d = CreateObject("scripting.dictionary")
  4.     bj = [L1]   '比较数
  5.     For i = 1 To UBound(arr) Step 13     '13行为一单元
  6.         For j = 2 To 7     '判断每单元各列各小组第一行是否与比较数相同
  7.             If arr(i, j) = bj And arr(i + 3, j) = bj And arr(i + 6, j) = bj And arr(i + 9, j) = bj Then
  8.                 d(j - 1) = d(j - 1) & "," & i    '如果相同,记录该单元首行进字典。字典以列数-1为key
  9.             End If
  10.         Next
  11.     Next
  12.     For j = 1 To 6
  13.         If d.exists(j) Then
  14.             Worksheets.Add after:=Sheets(Sheets.Count)
  15.             With ActiveSheet
  16.                 .Name = j
  17.                 xrr = Split(d(j), ",")         '各单元首行组成的数组
  18.                 n = 0
  19.                 ReDim brr(1 To 13 * UBound(xrr), 1 To UBound(arr, 2))
  20.                 For k = 1 To UBound(xrr)      '复原各单元首行,并以此开始13行录入数组brr
  21.                     i = xrr(k)
  22.                     For kk = 0 To 12
  23.                         n = n + 1
  24.                         For jj = 1 To UBound(arr, 2)
  25.                             brr(n, jj) = arr(i + kk, jj)
  26.                         Next
  27.                     Next
  28.                 Next
  29.                 .[a1].Resize(n, UBound(arr, 2)) = brr
  30.                 .UsedRange.Columns.AutoFit
  31.             End With
  32.         End If
  33.     Next
  34.     Sheet1.Activate
  35. End Sub
复制代码

数据分类附件.rar

226.03 KB, 下载次数: 9

回复

使用道具 举报

发表于 2016-5-16 11:07 | 显示全部楼层
由于key为数值1--6
  1. Sub 分类()
  2.     arr = Range("a1:j" & [a65536].End(3).Row)
  3.     Dim crr(1 To 6)    '记录满足条件的各单元首行
  4.     bj = [L1]   '比较数
  5.     For i = 1 To UBound(arr) Step 13     '13行为一单元
  6.         For j = 2 To 7     '判断每单元各列各小组第一行是否与比较数相同
  7.             If arr(i, j) = bj And arr(i + 3, j) = bj And arr(i + 6, j) = bj And arr(i + 9, j) = bj Then
  8.                 crr(j - 1) = crr(j - 1) & "," & i    '如果相同,记录该单元首行进数组crr。
  9.             End If
  10.         Next
  11.     Next
  12.     For j = 1 To 6
  13.         If crr(j) <> "" Then
  14.             Worksheets.Add after:=Sheets(Sheets.Count)
  15.             With ActiveSheet
  16.                 .Name = j
  17.                 xrr = Split(crr(j), ",")         '各单元首行组成的数组
  18.                 n = 0
  19.                 ReDim brr(1 To 13 * UBound(xrr), 1 To UBound(arr, 2))
  20.                 For k = 1 To UBound(xrr)      '复原各单元首行,并以此开始13行录入数组brr
  21.                     i = xrr(k)
  22.                     For kk = 0 To 12
  23.                         n = n + 1
  24.                         For jj = 1 To UBound(arr, 2)
  25.                             brr(n, jj) = arr(i + kk, jj)
  26.                         Next
  27.                     Next
  28.                 Next
  29.                 .[a1].Resize(n, UBound(arr, 2)) = brr
  30.                 .UsedRange.Columns.AutoFit
  31.             End With
  32.         End If
  33.     Next
  34.     Sheet1.Activate
  35. End Sub
复制代码
,所以可以用数组代替字典。
回复

使用道具 举报

 楼主| 发表于 2016-5-16 11:26 | 显示全部楼层
grf1973 发表于 2016-5-16 11:07
由于key为数值1--6,所以可以用数组代替字典。

老师你好,谢谢帮助。试了一下,有些运行正常,有些运行不正常。比如下面的附件:

输入4后,表1---表5正常,到表6时,出错。

附件 数据分类附件aa.rar (257.36 KB, 下载次数: 2)
回复

使用道具 举报

发表于 2016-5-16 11:41 | 显示全部楼层
第一句把数组范围定大一点就行了。
arr = Range("a1:j" & [a1048576].End(3).Row + 2)   
因为还原的时候,每个单元13行,包括下面两个空行。
回复

使用道具 举报

发表于 2016-5-16 11:42 | 显示全部楼层    本楼为最佳答案   
请看附件。数组定义+2行,问题就解决了。

数据分类附件aa.rar

265.71 KB, 下载次数: 24

评分

参与人数 1 +1 收起 理由
HaiMi + 1 谢谢老师!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 04:10 , Processed in 0.332716 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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