ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码计算不同层级数据之和?

如何用vba代码计算不同层级数据之和?

作者:绿色风 分类: 时间:2022-08-17 浏览:98
楼主
kevinchengcw
Q: 如何用vba代码计算不同层级数据之和?
A: 实现代码如下:
  1. Sub test()
  2. Dim Rng As Range, Str$, Str2$, Arr, N&, I&, T!, Total#, Dic As Object, Dic2 As Object
  3. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目
  4. Set Dic2 = CreateObject("scripting.dictionary")
  5. Str = "一二三四五六七九八十,㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩,⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑,⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽,①②③④⑤⑥⑦⑧⑨⑩"  '引入层级列表字符串
  6. Arr = Split(Str, ",")  '拆分层级列表字符串到数组
  7. For N = LBound(Arr) To UBound(Arr)  '循环将不同层级各个字符内容写入字典中,key为字符,item为对应层级序号
  8.     For I = 1 To Len(Arr(N))
  9.         Dic(Mid(Arr(N), I, 1)) = N + 1
  10.     Next I
  11. Next N
  12. With ActiveSheet  '
  13.     For Each Rng In .UsedRange.Cells  '循环并清空填充黄色的单元格内容
  14.         If Rng.Interior.ColorIndex = 6 Then Rng = ""
  15.     Next Rng
  16.     Arr = .[a1].Resize(.Cells(.Rows.Count, 1).End(3).Row, .Cells(1, .Columns.Count).End(1).Column).Value  '提取表格区域数据到数组
  17.     For I = LBound(Arr, 2) + 1 To UBound(Arr, 2)  '循环表格内容各列(跳过标题列)
  18.         Select Case I  '判断列号
  19.             Case 5, 7, 8, 10, 11, 12  '如果是指定列,则
  20.                 Str = ""  '初始化层级序列字符串为空
  21.                 For N = LBound(Arr) + 2 To UBound(Arr)  '循环当前列各行(跳过标题行及总计行)
  22.                     Str = Left(Left(Str, Dic(Trim(Arr(N, LBound(Arr, 2)))) - 1) & Space(9), Dic(Trim(Arr(N, LBound(Arr, 2)))) - 1) & Trim(Arr(N, LBound(Arr, 2)))  '根据当前读取到的标识号提取出层级上层的字符串,不足的用空格补充(用于处理越级的情况)
  23.                     For T = 1 To Len(Str)  '循环字符串各长度
  24.                         Str2 = Left(Str, T)  '提取对应长度的字符串左侧内容
  25.                         If Dic2.exists(Str2) Then  '字符串对应的内容进行合计
  26.                             Dic2(Str2) = Dic2(Str2) + Val(Arr(N, I))
  27.                         Else
  28.                             Dic2(Str2) = Val(Arr(N, I))
  29.                         End If
  30.                     Next T
  31.                 Next N
  32.                 Str = ""  '清空字符串变量,进行下一次统计
  33.                 Total = 0  '总计初始化为0
  34.                 For N = LBound(Arr) + 2 To UBound(Arr)  '二次循环数据区域
  35.                     Str = Left(Left(Str, Dic(Trim(Arr(N, LBound(Arr, 2)))) - 1) & Space(9), Dic(Trim(Arr(N, LBound(Arr, 2)))) - 1) & Trim(Arr(N, LBound(Arr, 2)))
  36.                     If Arr(N, I) = "" Then Arr(N, I) = Dic2(Str)  '提取对就的数据到数组中
  37.                     If Len(Str) = 1 Then Total = Total + Dic2(Str)  '如果是第一级,则将结果加和到汇总数据中
  38.                 Next N
  39.                 Arr(LBound(Arr) + 1, I) = Total  '写入汇总的数据值
  40.                 Dic2.RemoveAll  '清空字典2项目,以便进行下次处理
  41.             Case Else
  42.             
  43.         End Select
  44.     Next I
  45.     .[a1].Resize(UBound(Arr), UBound(Arr, 2)).Value = Arr  '向数据区写入结果
  46. End With
  47. Set Dic = Nothing  '清空字典项目
  48. Set Dic2 = Nothing
  49. End Sub
详见附件及素材源帖。


分级汇总.rar
2楼
纵鹤擒龙水中月
学习了
3楼
水星钓鱼
感谢分享
4楼
老糊涂
学习了

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap