ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2422|回复: 19

[求助] VBA实现汇总后,怎么能体现小计行

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-14 00:10 | 显示全部楼层 |阅读模式
VBA实现汇总后,怎么能体现小计行
数据多,已用VBA实现了汇总功能,怎么改善代码出现小计行,如附件中图所示 微信图片_20191014001016.png

测试1.rar

117.96 KB, 下载次数: 29

TA的精华主题

TA的得分主题

发表于 2019-10-14 06:48 | 显示全部楼层
Option Explicit

Sub test()
  Dim arr, i, j, k, p, m, sum, total
  arr = Sheets("原表").[a1].CurrentRegion.Offset(1).Resize(, 5)
  ReDim brr(1 To UBound(arr, 1) * 2, 1 To UBound(arr, 2))
  ReDim sum(UBound(arr, 2)), total(UBound(arr, 2)), crr(UBound(arr, 2))
  Call bsort(arr, 1, UBound(arr, 1) - 1, 1, UBound(arr, 2), 1)
  For i = 1 To UBound(arr, 1) - 1
    If arr(i, 1) <> arr(i + 1, 1) Then
      Call bsort(arr, p + 1, i, 1, UBound(arr, 2), 2)
      For j = p + 1 To i
        For k = 3 To UBound(arr, 2)
          sum(k) = sum(k) + arr(j, k)
          total(k) = total(k) + arr(j, k)
        Next
        If j = i Or arr(j, 2) <> arr(j + 1, 2) Then
          m = m + 1
          brr(m, 1) = arr(j, 1): brr(m, 2) = arr(j, 2)
          For k = 3 To UBound(arr, 2)
            brr(m, k) = sum(k): sum(k) = 0
          Next
          If j = i Then
            m = m + 1
            brr(m, 1) = arr(j, 1): brr(m, 2) = "小计"
            For k = 3 To UBound(arr, 2)
              brr(m, k) = total(k)
              crr(k) = crr(k) + total(k): total(k) = 0
            Next
          End If
        End If
      Next
      p = i
    End If
  Next
  m = m + 1: brr(m, 2) = "总计"
  For i = 3 To UBound(arr, 2)
    brr(m, i) = crr(i)
  Next
  With Sheets("汇总").[g4]
    .Resize(Rows.Count - 3, UBound(brr, 2)).ClearContents
    .Resize(m, UBound(brr, 2)) = brr
  End With
  Sheets("原表").[a1].Resize(, UBound(arr, 2)).Copy Sheets("汇总").[g3]
End Sub

Function bsort(arr, first, last, left, right, key)
  Dim i, j, k, t
  For i = first To last - 1
    For j = first To last + first - 1 - i
      If StrComp(arr(j, key), arr(j + 1, key), vbTextCompare) = 1 Then
        For k = left To right
          t = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = t
        Next
      End If
    Next
  Next
End Function

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-10-14 07:29 | 显示全部楼层

不错,小刀老师,能不能再延伸一下,同时将A列也添加小计行,即按“系列”小计一下。

TA的精华主题

TA的得分主题

发表于 2019-10-14 08:45 | 显示全部楼层
cqcbc 发表于 2019-10-14 07:29
不错,小刀老师,能不能再延伸一下,同时将A列也添加小计行,即按“系列”小计一下。

没看懂。已经有分计、小计、总计了

A系列为小计和总计,都已经显示。好好看一下一楼图就知道是怎么回事了

-------------
当然也可以上附件作图示

TA的精华主题

TA的得分主题

发表于 2019-10-14 10:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 cqcbc 于 2019-10-14 10:22 编辑
一把小刀闯天下 发表于 2019-10-14 08:45
没看懂。已经有分计、小计、总计了

A系列为小计和总计,都已经显示。好好看一下一楼图就知道是怎么回 ...

哦,我搞错了,我请求的事项应该是:先汇总同一系列的B列,再汇总同一系列(A列),如附件。原表我已按A、B列排序了。请老师帮助实现。


对了,我的要求是:插入式,保留了原有的行。

测试2.rar

119.75 KB, 下载次数: 22

TA的精华主题

TA的得分主题

发表于 2019-10-14 10:42 | 显示全部楼层
cqcbc 发表于 2019-10-14 07:29
不错,小刀老师,能不能再延伸一下,同时将A列也添加小计行,即按“系列”小计一下。

'假设A、B列有序,不然还要排序,,,

Option Explicit

Sub test()
  Dim arr, i, j, k, p, m, sum, total
  arr = Sheets("原表").[a1].CurrentRegion.Offset(1).Resize(, 5)
  ReDim brr(1 To UBound(arr, 1) * 2, 1 To UBound(arr, 2))
  ReDim sum(UBound(arr, 2)), total(UBound(arr, 2)), crr(UBound(arr, 2))
  For i = 1 To UBound(arr, 1) - 1
    m = m + 1
    For j = 1 To UBound(arr, 2)
      brr(m, j) = arr(i, j)
      If j > 2 Then
        sum(j) = sum(j) + arr(i, j)
        total(j) = total(j) + arr(i, j)
        crr(j) = crr(j) + arr(i, j)
      End If
    Next
    If arr(i, 1) <> arr(i + 1, 1) Or arr(i, 2) <> arr(i + 1, 2) Then
      m = m + 1: brr(m, 2) = arr(i, 2) & "汇总"
      For j = 3 To UBound(arr, 2)
        brr(m, j) = sum(j): sum(j) = 0
      Next
      If arr(i, 1) <> arr(i + 1, 1) Then
        m = m + 1: brr(m, 1) = arr(i, 1) & "汇总"
        For j = 3 To UBound(arr, 2)
          brr(m, j) = total(j): total(j) = 0
        Next
      End If
    End If
  Next
  m = m + 1: brr(m, 1) = "总计"
  For i = 3 To UBound(arr, 2)
    brr(m, i) = crr(i)
  Next
  With Sheets("汇总").[g4]
    .Resize(Rows.Count - 3, UBound(brr, 2)).ClearContents
    .Resize(m, UBound(brr, 2)) = brr
  End With
  Sheets("原表").[a1].Resize(, UBound(arr, 2)).Copy Sheets("汇总").[g3]
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-10-14 10:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-10-14 11:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢分享!

TA的精华主题

TA的得分主题

发表于 2019-10-14 16:47 | 显示全部楼层
一把小刀闯天下 发表于 2019-10-14 10:42
'假设A、B列有序,不然还要排序,,,

Option Explicit

再请老师帮忙,新增加了一列,字段“业务员”,A、B、C列已排序。要求也统计出来,自己试着修改VBA,没有成功,希望能修改一下,我也好对照学习。
截图.jpg

测试3.rar

135.61 KB, 下载次数: 43

TA的精华主题

TA的得分主题

发表于 2019-10-14 19:24 | 显示全部楼层
cqcbc 发表于 2019-10-14 16:47
再请老师帮忙,新增加了一列,字段“业务员”,A、B、C列已排序。要求也统计出来,自己试着修改VBA,没有 ...

看了一下,有4个层级都晕了。不应该是楼主的马甲吧,觉得自己开个主题帖会更好,看看别人的建议,,,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 02:57 , Processed in 0.042425 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表