Excel精英培训网

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

[已解决]二维数组转置问题

[复制链接]
发表于 2014-6-22 08:40 | 显示全部楼层 |阅读模式
本帖最后由 hbjxgsq 于 2014-6-23 18:08 编辑

二维数组转置.rar (4.02 KB, 下载次数: 13)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-6-22 20:49 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr(1 To 20000, 1 To 3), d, d2, i&, zf$, s&
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. arr = Sheet1.Range("a1").CurrentRegion
  6. For i = 2 To UBound(arr)
  7.     d(arr(i, 2)) = ""
  8.     zf = arr(i, 2) & "," & arr(1, 3) & arr(i, 3)
  9.     If Not d2.exists(zf) Then d2(zf) = arr(i, 1) Else d2(zf) = d2(zf) & "," & arr(i, 1)
  10. Next
  11. a = d.keys: a2 = d2.keys: b2 = d2.items
  12. For i = 0 To d.Count - 1
  13.     s = s + 1
  14.     brr(s, 1) = a(i)
  15.     For j = 0 To d2.Count - 1
  16.         x = Split(a2(j), ",")
  17.         If x(0) = a(i) Then s = s + 1: brr(s, 2) = x(1): brr(s, 3) = b2(j)
  18.     Next
  19. Next
  20. Sheet2.Activate
  21. Range("a1").Resize(s, 3) = brr
  22. [c:c].TextToColumns Destination:=[c1], Other:=True, OtherChar:=","
  23. End Sub
复制代码
回复

使用道具 举报

发表于 2014-6-22 20:50 | 显示全部楼层
………………

二维数组转置.zip

11.77 KB, 下载次数: 12

回复

使用道具 举报

发表于 2014-6-23 10:01 | 显示全部楼层    本楼为最佳答案   
运用了字典套字典,三维数组
  1. Sub test()
  2.     Dim arr, ar, brr(), br(), i%, m%, n%, k%
  3.     Dim d As Object
  4.     ReDim brr(1 To 10, 1 To 10, 1 To 100)
  5.     '结果数组:第一维大分类(A,B...),第二维小分类(x,y...),第三维转置后数据

  6.     Set d = CreateObject("Scripting.Dictionary")    '定义字典
  7.     arr = Sheet1.Range("a1").CurrentRegion
  8.     For i = 2 To UBound(arr)    '从数据源第2行开始处理
  9.         If Not d.exists(arr(i, 2)) Then
  10.             '第一步将第二列,即A,B...作为关键字建立字典

  11.             m = m + 1: n = 0  'm为大分类(A,B...)计数,n为小分类(x,y...)计数
  12.             Set d(arr(i, 2)) = CreateObject("Scripting.Dictionary")
  13.             '第一步建立字典后,将d.item再建立字典(子字典),用于盛放大分类下小分类(x,y.....)

  14.         End If
  15.         If Not d(arr(i, 2)).exists(arr(i, 3)) Then
  16.             '上面建立了子字典,这时开始盛放数据,子字典的关键字为小分类(x,y....)

  17.             n = n + 1: k = 1       'n为小分类计数,k为数据计数
  18.             brr(m, n, 1) = arr(1, 3) & arr(i, 3)          'brr(大分类,小分类,数据),这里结果"分类X"
  19.             d(arr(i, 2))(arr(i, 3)) = Array(m, n)    '子字典的 items 为二维数组计数 array(大分类记数,小分类记数)
  20.         End If
  21.         k = k + 1    '数据计数累加
  22.         brr(d(arr(i, 2))(arr(i, 3))(0), d(arr(i, 2))(arr(i, 3))(1), k) = arr(i, 1)
  23.         'brr为结果数组:将子字典的items值(大分类,小分类计数值)拿出来作为三维数组下标,这样可以知道每个数据属于哪个分类

  24.     Next
  25.     arr = d.keys: k = 0: m = 1    'arr大分类数组,就这么多,k,m联合控制目标数组行数
  26.     For i = 0 To UBound(arr)     '循环一下赋给结果数组ar
  27.         k = k + m                '第一大类开始行
  28.         ReDim Preserve br(1 To UBound(brr, 3) + 1, 1 To k)
  29.         '定义结果数组,小分类从第二列开始摆数据,最后要多一列(UBound(brr, 3) + 1)

  30.         br(1, k) = arr(i)
  31.         ar = d(arr(i)).keys   'ar小分类数组,就这么多行(ubound(ar))
  32.         For m = 1 To UBound(ar) + 1   '循环小分类,由于ar下标从0开始,因此+1
  33.             For n = 1 To UBound(brr, 3)   '循环数据
  34.                 ReDim Preserve br(1 To UBound(brr, 3) + 1, 1 To k + m)
  35.                 '结果数组从第二列开始摆数据 ,因此(UBound(brr, 3) + 1)

  36.                 br(n + 1, k + m) = brr(i + 1, m, n)  '目标数据全部输出给结果数组
  37.             Next
  38.         Next
  39.     Next
  40.     With Sheet2.Range("a1")
  41.         .CurrentRegion.ClearContents
  42.         .Value = "数组转置"
  43.         .Offset(1).Resize(UBound(br, 2), UBound(br)) = Application.Transpose(br)   '输出结果
  44.     End With
  45. End Sub
复制代码
二维数组转置.rar (13.6 KB, 下载次数: 17)
回复

使用道具 举报

发表于 2014-6-23 11:01 | 显示全部楼层
本帖最后由 雪舞子 于 2014-6-23 11:06 编辑
  1. Sub test()
  2.     Dim arr, ar, brr(), br(), i%, m%, n%, k%
  3.     Dim d As Object
  4.     ReDim brr(1 To 10, 1 To 10, 1 To 100)
  5.     '结果数组:第一维大分类(A,B...),第二维小分类(x,y...),第三维转置后数据

  6.     Set d = CreateObject("Scripting.Dictionary")    '定义字典
  7.     arr = Sheet1.Range("a1").CurrentRegion
  8.     For i = 2 To UBound(arr)    '从数据源第2行开始处理
  9.         If Not d.exists(arr(i, 2)) Then
  10.             '第一步将第二列,即A,B...作为关键字建立字典

  11.             m = m + 1: n = 0  'm为大分类(A,B...)计数,n为小分类(x,y...)计数
  12.             Set d(arr(i, 2)) = CreateObject("Scripting.Dictionary")
  13.             '第一步建立字典后,将d.item再建立字典(子字典),用于盛放大分类下小分类(x,y.....)

  14.         End If
  15.         If Not d(arr(i, 2)).exists(arr(i, 3)) Then
  16.             '上面建立了子字典,这时开始盛放数据,子字典的关键字为小分类(x,y....)

  17.             n = n + 1: k = 1       'n为小分类计数,k为数据计数
  18.             brr(m, n, 1) = arr(1, 3) & arr(i, 3)          'brr(大分类,小分类,数据),这里结果"分类X"
  19.             d(arr(i, 2))(arr(i, 3)) = Array(m, n, 2) '子字典的 items 为二维数组计数 array(大分类记数,小分类记数)
  20.         End If
  21.          '数据计数累加
  22.         brr(d(arr(i, 2))(arr(i, 3))(0), d(arr(i, 2))(arr(i, 3))(1), d(arr(i, 2))(arr(i, 3))(2)) = arr(i, 1)
  23.         'brr为结果数组:将子字典的items值(大分类,小分类计数值)拿出来作为三维数组下标,这样可以知道每个数据属于哪个分类
  24.         
  25.         d(arr(i, 2))(arr(i, 3)) = Array(d(arr(i, 2))(arr(i, 3))(0), d(arr(i, 2))(arr(i, 3))(1), d(arr(i, 2))(arr(i, 3))(2) + 1)
  26.         '数据计数累加后还给字典
  27.     Next
  28.     arr = d.keys: k = 0: m = 1    'arr大分类数组,就这么多,k,m联合控制目标数组行数
  29.     For i = 0 To UBound(arr)     '循环一下赋给结果数组ar
  30.         k = k + m                '第一大类开始行
  31.         ReDim Preserve br(1 To UBound(brr, 3) + 1, 1 To k)
  32.         '定义结果数组,小分类从第二列开始摆数据,最后要多一列(UBound(brr, 3) + 1)

  33.         br(1, k) = arr(i)
  34.         For m = 1 To d(arr(i)).Count '循环小分类
  35.             For n = 1 To UBound(brr, 3)   '循环数据
  36.                 ReDim Preserve br(1 To UBound(brr, 3) + 1, 1 To k + m)
  37.                 '结果数组从第二列开始摆数据 ,因此(UBound(brr, 3) + 1)

  38.                 br(n + 1, k + m) = brr(i + 1, m, n)  '目标数据全部输出给结果数组
  39.             Next
  40.         Next
  41.     Next
  42.     With Sheet2.Range("a1")
  43.         .CurrentRegion.ClearContents
  44.         .Value = "数组转置"
  45.         .Offset(1).Resize(UBound(br, 2), UBound(br)) = Application.Transpose(br)   '输出结果
  46.     End With
  47. End Sub
复制代码
二维数组转置.rar (10.55 KB, 下载次数: 14)
回复

使用道具 举报

 楼主| 发表于 2014-6-23 18:08 | 显示全部楼层
谢谢楼上的两位老师,结果都很准确!向您们学习了!
不好意思,回复晚了!

点评

奇了怪了,取繁弃简,楼主莫非有病?  发表于 2014-6-23 22:00
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 12:54 , Processed in 0.261859 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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