|
本帖最后由 雪舞子 于 2014-6-23 11:06 编辑
- Sub test()
- Dim arr, ar, brr(), br(), i%, m%, n%, k%
- Dim d As Object
- ReDim brr(1 To 10, 1 To 10, 1 To 100)
- '结果数组:第一维大分类(A,B...),第二维小分类(x,y...),第三维转置后数据
- Set d = CreateObject("Scripting.Dictionary") '定义字典
- arr = Sheet1.Range("a1").CurrentRegion
- For i = 2 To UBound(arr) '从数据源第2行开始处理
- If Not d.exists(arr(i, 2)) Then
- '第一步将第二列,即A,B...作为关键字建立字典
- m = m + 1: n = 0 'm为大分类(A,B...)计数,n为小分类(x,y...)计数
- Set d(arr(i, 2)) = CreateObject("Scripting.Dictionary")
- '第一步建立字典后,将d.item再建立字典(子字典),用于盛放大分类下小分类(x,y.....)
- End If
- If Not d(arr(i, 2)).exists(arr(i, 3)) Then
- '上面建立了子字典,这时开始盛放数据,子字典的关键字为小分类(x,y....)
- n = n + 1: k = 1 'n为小分类计数,k为数据计数
- brr(m, n, 1) = arr(1, 3) & arr(i, 3) 'brr(大分类,小分类,数据),这里结果"分类X"
- d(arr(i, 2))(arr(i, 3)) = Array(m, n, 2) '子字典的 items 为二维数组计数 array(大分类记数,小分类记数)
- End If
- '数据计数累加
- 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)
- 'brr为结果数组:将子字典的items值(大分类,小分类计数值)拿出来作为三维数组下标,这样可以知道每个数据属于哪个分类
-
- 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)
- '数据计数累加后还给字典
- Next
- arr = d.keys: k = 0: m = 1 'arr大分类数组,就这么多,k,m联合控制目标数组行数
- For i = 0 To UBound(arr) '循环一下赋给结果数组ar
- k = k + m '第一大类开始行
- ReDim Preserve br(1 To UBound(brr, 3) + 1, 1 To k)
- '定义结果数组,小分类从第二列开始摆数据,最后要多一列(UBound(brr, 3) + 1)
- br(1, k) = arr(i)
- For m = 1 To d(arr(i)).Count '循环小分类
- For n = 1 To UBound(brr, 3) '循环数据
- ReDim Preserve br(1 To UBound(brr, 3) + 1, 1 To k + m)
- '结果数组从第二列开始摆数据 ,因此(UBound(brr, 3) + 1)
- br(n + 1, k + m) = brr(i + 1, m, n) '目标数据全部输出给结果数组
- Next
- Next
- Next
- With Sheet2.Range("a1")
- .CurrentRegion.ClearContents
- .Value = "数组转置"
- .Offset(1).Resize(UBound(br, 2), UBound(br)) = Application.Transpose(br) '输出结果
- End With
- End Sub
复制代码
二维数组转置.rar
(10.55 KB, 下载次数: 14)
|
|