ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba代码通过表格数据整理实现分类汇总效果?

如何利用vba代码通过表格数据整理实现分类汇总效果?

作者:绿色风 分类: 时间:2022-08-17 浏览:76
楼主
kevinchengcw
Q: 如何利用vba代码通过表格数据整理实现分类汇总效果?
A: 代码如下:
  1. Sub test()
  2. Dim Rng As Range, Rng2 As Range, Ws As Worksheet, N&, I&, Dic As Object, Str$
  3. Application.ScreenUpdating = False  '关闭屏幕刷新,因有大量的Range对象操作,这样可以提高执行速度
  4. Set Ws = Worksheets("数据源")  '将数据源工作表赋值给变量,方便后面调用
  5. Worksheets.Add  '添加一个新的工作表(注意:新添加的工作表会被激活)
  6. With ActiveSheet  '在活动工作表中进行操作(即我们上一句新添加的工作表)
  7.     .Range(Ws.UsedRange.Address) = Ws.UsedRange.Value  '将数据源工作表中的数据通过引值方式引入(排除了格式及公式等)
  8.     Set Rng = .Rows(1).Find("物料单")  '在标题行查找"物料单"对应的单元格,用于定位使用
  9.     Set Rng2 = .Rows(1).Find("本位币金额")  '在标题行查找"本位币金额"对应的单元格,用于定位使用
  10.     Intersect(.UsedRange, .Rows("2:" & .Rows.Count)).Sort key1:=Rng.Offset(1)  '对数据区(无标题行)依人名排序
  11.     For N = .Cells(1, .Columns.Count).End(1).Column To 1 Step -1  '从右向左,删除不需要的数据列
  12.         If InStr(",物料编码,物料描述,物料单,数量,本位币金额,", "," & Trim(.Cells(1, N).Value) & ",") = 0 Then .Columns(N).Delete
  13.     Next N
  14.     I = .Cells(.Rows.Count, Rng.Column).End(3).Row  '取得名字列的最下行行标
  15.     For N = 2 To I  '循环将"物料编码","物料描述","物料单"三列每行的内容以特定字符组合(便于合并计算)后放到A列里,并清空后面两列内容(便于后面分列时不出现提示)
  16.         .Cells(N, 1) = .Cells(N, 1).Value & vbTab & .Cells(N, 2).Value & vbTab & .Cells(N, 3).Value
  17.         .Cells(N, 2) = ""
  18.         .Cells(N, 3) = ""
  19.     Next N
  20.     With Intersect(.Columns("a:e"), .Rows("2:" & .Rows.Count))  '对数据区内容进行合并计算,结果放到与数据区相领的右侧
  21.         .Parent.[f2].Consolidate Sources:=.Address(ReferenceStyle:=xlR1C1), Function:=xlSum, leftcolumn:=True
  22.         .Delete xlToLeft  '删除旧的数据区(右侧单元格左移),这样合并计算后的结果会占据原来数据区的位置
  23.     End With
  24.     .Range("a2:a" & .Cells(.Rows.Count, 1).End(3).Row).TextToColumns Tab:=True  '对合并的数据区域进行分列处理,恢复数据格式原貌
  25.     I = .Cells(.Rows.Count, Rng.Column).End(3).Row  '取得当前姓名列的最后行号
  26.     For N = I To 2 Step -1  '从后向前循环
  27.         If .Cells(N, Rng.Column).Value <> .Cells(N - 1, Rng.Column).Value Then  '如果当前循环到的行的姓名与上一行不同,则
  28.             .Rows(N & ":" & N + 2).Insert  '从当前行开始,插入三行
  29.             .Cells(I + 4, Rng2.Column).FormulaR1C1 = "=sum(R" & N + 3 & "C:R" & I + 3 & "C)"  '在当前姓名范围的右下方对应数据区写入加和公式,统计出合计值
  30.             .Rows(N + 2) = .Rows(1).Value  '插入的最后一行引用标题行内容
  31.             .Cells(N + 1, 1) = .Cells(N + 3, Rng.Column).Value & "领料清单"  '插入的第二行写入汇总的含姓名的标题
  32.             I = N - 1  '更新数据区最下方行数值
  33.         End If
  34.     Next N
  35.     .Columns(Rng.Column).Delete  '删除姓名列
  36.     .Columns.AutoFit  '列宽自适应
  37.     .Rows("1:2").Delete  '删除多余的标题行
  38. End With
  39. Application.ScreenUpdating = True  '打开屏幕刷新
  40. End Sub
详见附件及素材源帖.
vba代码实现分类汇总.rar
2楼
hnayzwp
很实用,谢谢楼主

免责声明

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

评论列表
sitemap