|
需要实现的目标:统计各个部门在不同分类业务上,各年的累计(从本年开始到之前有记录的年份开始)“业务计数”和“业务金额之和”。 请各位老师帮忙,谢谢!!!
本帖最后由 芐雨 于 2015-1-23 19:53 编辑
- Sub 按钮1_Click()
- Dim arr, brr, dic As Object
- Dim s1$, s$, i&, x&, n&
- Dim tim1 As Date, tim2 As Date: tim1 = Timer
- Application.ScreenUpdating = False '禁刷新
- arr = Sheets("资料").Range("A1").CurrentRegion '数组arr
- ReDim brr(1 To 10000, 1 To 7) '创建数组brr
- Set dic = CreateObject("scripting.dictionary") '创建字典dic
- For i = 2 To UBound(arr) '遍历数组arr
- s1 = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3) '以“部门|业务分类|年份”汇总
- n = dic(s1)
- If n = 0 Then ' 等于,s1不在字典中
- x = x + 1 '计数,在brr的行数
- dic(s1) = x '记入字典
- brr(x, 1) = arr(i, 1) '部门
- brr(x, 2) = arr(i, 2) '业务分类
- brr(x, 3) = arr(i, 3) '年份
- brr(x, 6) = 1 '次数
- brr(x, 7) = arr(i, 4) '金额
- Else 'n<>0,s1在字典中,n=dic(s1)返回brr的行数
- brr(n, 6) = 1 + brr(n, 6) '次数累加
- brr(n, 7) = arr(i, 4) + brr(n, 7) '金额累加
- End If
- Next
- Sheets("统计结果").[B:B].NumberFormat = "@" '格式设置为文本
- With Sheets("统计结果").Range("A2")
- .Offset(-1).CurrentRegion.Offset(1).ClearContents '清除内容
- .Resize(x, 7) = brr '写入
- Call ArrSort(.CurrentRegion, [A1], [B1], [C1]) '排序,范围:.CurrentRegion。排序的主次:部门,业务分类,年份
- brr = .CurrentRegion.Offset(1) '排序后brr,Offset(1)向下偏移了一行
- For i = 1 To UBound(brr) - 1
- s1 = brr(i, 1) & "|" & brr(i, 2) '部门|业务分类记为s1
- s2 = brr(i + 1, 1) & "|" & brr(i + 1, 2) '下一行的记为s2
- sum1 = sum1 + brr(i, 6) '次数累加
- sum2 = sum2 + brr(i, 7) '金额累加
- brr(i, 4) = sum1 '本年本分类累计次数
- brr(i, 5) = sum2 '本年本分类累计金额
- If s1 <> s2 Then sum1 = 0: sum2 = 0 '不相同时,初始化
- Next
- .Resize(x, 7) = brr '再次写入
- Call ArrSort(.CurrentRegion, [A1], [C1], [B1]) '排序,排序的主次:部门,年份,业务分类
- brr = .CurrentRegion.Offset(1) '排序后brr,Offset(1)向下偏移了一行
- For i = 1 To UBound(brr) - 1
- s1 = brr(i, 1) '部门记为s1
- s2 = brr(i + 1, 1) '下一行的记为s2
- sum1 = sum1 + brr(i, 6) '本年全部分类累计次数
- sum2 = sum2 + brr(i, 7) '本年全部分类累计金额
- brr(i, 6) = sum1
- brr(i, 7) = sum2
- If s1 <> s2 Then sum1 = 0: sum2 = 0 '不相同时,初始化
- Next
- '因为会出现年份相同的,应该以行数大的为准
- For i = UBound(brr) - 1 To 1 Step -1
- s1 = brr(i, 1) & "|" & brr(i, 3) '部门|年份记为s1
- s2 = brr(i + 1, 1) & "|" & brr(i + 1, 3) '下一行的记为s2
- If s1 = s2 Then brr(i, 6) = brr(i + 1, 6): brr(i, 7) = brr(i + 1, 7) '相等时,更新数值
- Next
- .Resize(x, 7) = brr
- End With
- Application.ScreenUpdating = True '刷新
- tim2 = Timer
- MsgBox Format(tim2 - tim1, "程序执行时间为:0.00秒"), 64, "时间统计"
- End Sub
- Sub ArrSort(rng, ky1, ky2, ky3) '排序,可录制宏学习
- With rng.Parent.Sort
- .SortFields.Clear
- .SortFields.Add Key:=ky1, _
- SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
- .SortFields.Add Key:=ky2, _
- SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
- .SortFields.Add Key:=ky3, _
- SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
- .SetRange rng
- .Header = xlYes
- .MatchCase = False
- .Orientation = xlTopToBottom
- .SortMethod = xlPinYin
- .Apply
- End With
- End Sub
复制代码附件:
多重分类统计.zip
(204.87 KB, 下载次数: 36)
|
|