|
发表于 2012-1-14 10:37
|
显示全部楼层
本楼为最佳答案
本帖最后由 sunjing-zxl 于 2012-1-14 10:39 编辑
- Sub aa()
- Dim d As New Dictionary
- Dim arr, arrt, Ar, i As Long, s As String
- arr = Range("C2:F" & [C65536].End(xlUp).Row)
- For i = 1 To UBound(arr) '循环处理arr
- If Len(Trim(arr(i, 1))) Then '如果数组arr不为空(既C列不为空)则:
- If Not d.Exists(arr(i, 1)) Then
- d.Add arr(i, 1), 1 '将A列值(数组arr)装入父字典
- Set d(arr(i, 1)) = New Dictionary '同时定义每个父字典元素的子字典
- End If
- If d(arr(i, 1)).Exists(arr(i, 3)) Then
- '如果子字典未赋值,则将E列值作为其key值,F列值作为其item值进行赋值;否则将item加上F列值
- d(arr(i, 1))(arr(i, 3)) = d(arr(i, 1))(arr(i, 3)) + arr(i, 4)
- Else
- d(arr(i, 1)).Add arr(i, 3), arr(i, 4)
- End If
- End If
- Next i
- If d.Count > 0 Then '如果父字典个数大于0
- arr = d.Keys
- ReDim arrt(1 To UBound(arr) + 1, 1 To 4) '重定义数组大小,以备生成H:K列数据
- For i = 1 To UBound(arrt)
- s = ""
- arrt(i, 1) = arr(i - 1)
- arrt(i, 3) = Application.Sum(d(arr(i - 1)).Items) '合计总数量
- Ar = d(arr(i - 1)).Keys
- For j = 0 To UBound(Ar)
- If Ar(j) = "左" Or Ar(j) = "右" Then
- s = s & d(arr(i - 1))(Ar(j)) & Ar(j)
- Else
- s = Ar(j)
- End If
- Next j
- arrt(i, 4) = s '对子字典key值进行处理,处理成K列数据
- Set d(arr(i - 1)) = Nothing
- Next i
- Range("h2:k" & Rows.Count).ClearContents '清除H:K列
- Range("h2").Resize(i - 1, 4) = arrt '拷贝数组到H:K列
- End If
- Set d = Nothing
- End Sub
-
复制代码 附件:
代码求助-sunjing.rar
(14.16 KB, 下载次数: 21)
|
|