ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南

[求助] 如何用VBA实现一次性多列数据分类汇总,类似单列数据透视表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-23 12:56 | 显示全部楼层
本帖最后由 笨鸟飞不高 于 2023-5-23 13:01 编辑

数据透视表分类汇总.zip (135.64 KB, 下载次数: 14)

TA的精华主题

TA的得分主题

发表于 2023-5-23 13:36 | 显示全部楼层
·遁去的一· 发表于 2023-5-23 11:23
内存溢出,数据100万行

不可能,100万行完全可以。
我测试了,可以
你输出到其他表,或者先把原表除了数据源,其他的列全部都删除了再运行

TA的精华主题

TA的得分主题

发表于 2023-5-23 14:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Option Explicit
Function 分类汇总(arr, brr, rng As Range) ''brr选择任意列 [{2,3,4,5}]
    Dim i, j, k, r As Range, dic选择列, key, dic单位, m, n, 行, 列, crr, dic, dic1, drr
    Application.ScreenUpdating = False
    Set dic = CreateObject("scripting.dictionary")
    Set dic1 = CreateObject("scripting.dictionary")
    Set dic单位 = CreateObject("scripting.dictionary")
    Set dic选择列 = CreateObject("scripting.dictionary")
    For i = LBound(arr) To UBound(arr)
        If Not dic.Exists(key) Then
            dic(arr(i, 1)) = ""
        End If
        For j = 2 To UBound(arr, 2)
            If Not dic1.Exists(key) Then
                dic1(arr(i, j)) = ""
            End If
        Next
    Next
    ReDim crr(1 To dic.Count + 2, 1 To dic1.Count + 1)
    crr(1, 1) = arr(1, 1)
    ReDim drr(1 To UBound(brr) + 1)
    drr(1) = 1
    For j = 1 To UBound(brr)
        For i = 2 To UBound(arr)
            key = arr(i, 1)
            If j = 1 Then
                If Not dic单位.Exists(key) Then
                    m = m + 1
                    dic单位(key) = m + 2
                    crr(m + 2, 1) = key
                End If
            End If
            行 = dic单位(key)
            key = arr(i, brr(j))
            If Not dic选择列.Exists(key) Then
                n = n + 1
                dic选择列(key) = n + 1
                crr(1, n + 1) = arr(1, brr(j))
                crr(2, n + 1) = key
            End If
            列 = dic选择列(key)
            crr(行, 列) = Val(crr(行, 列)) + 1
        Next
        drr(j + 1) = n + 1
    Next
    crr(m + 3, 1) = "合计"
    For i = 3 To m + 2
        For j = 2 To n + 1
            crr(m + 3, j) = crr(m + 3, j) + crr(i, j)
        Next
    Next
    With rng.Resize(m + 3, n + 1)
        .Clear
        .Value = crr
        .Borders.LineStyle = xlContinuous
        .HorizontalAlignment = xlCenter
    End With
    rng.Resize(2, 1).Merge
    With rng.Parent
        For j = 2 To UBound(drr)
            .Range(Cells(1, drr(j - 1) + 1), Cells(1, drr(j))).Merge
        Next
    End With
    Application.ScreenUpdating = True
End Function
Sub text()
    Dim arr, t
    t = Timer
    arr = Sheet1.[a1].CurrentRegion
    分类汇总 arr, [{2,3,4,5}], Sheet2.[a1]
    MsgBox "完成 ! 耗时 : " & Format(Timer - t, "0.00" & "秒"), , "提示"
End Sub

TA的精华主题

TA的得分主题

发表于 2023-5-23 15:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
·遁去的一· 发表于 2023-5-23 11:23
内存溢出,数据100万行

楼主最好把100万行的数据发到帖子里来,或者你是怎么模拟数据测试的,告诉我们一下,我们自己调试一 下代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-23 15:32 | 显示全部楼层
掘掘 发表于 2023-5-23 13:36
不可能,100万行完全可以。
我测试了,可以
你输出到其他表,或者先把原表除了数据源,其他的列全部 ...

多次测试均未通过,不是下标越界就是内存溢出,上传不了附件,太大了,你们可以自己生成100万行啊,写一段代码就行
  1. Sub 生成100万行数据()
  2.     Dim ws As Worksheet
  3.     Dim rowCount As Long
  4.     Dim dataRange As Range
  5.     Dim i As Long
  6.    
  7.     ' 设置要操作的工作表
  8.     Set ws = ThisWorkbook.Worksheets("Sheet1") ' 将"Sheet1"替换为您实际的工作表名称
  9.    
  10.     ' 设置生成数据的行数
  11.     rowCount = 1000000
  12.    
  13.     ' 获取数据填充范围
  14.     Set dataRange = ws.Range("A2:A" & rowCount + 1) ' 假设数据填充范围为A2:A1000001
  15.    
  16.     ' 生成数据
  17.     For i = 1 To rowCount
  18.         dataRange.Cells(i).Value = "数据" & i ' 根据需求生成相应的数据
  19.     Next i
  20.    
  21.     MsgBox "生成100万行数据完成。"
  22. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2023-5-23 19:58 | 显示全部楼层
·遁去的一· 发表于 2023-5-23 15:32
多次测试均未通过,不是下标越界就是内存溢出,上传不了附件,太大了,你们可以自己生成100万行啊,写一 ...


经过调整,实现了以任意列作为行标题统计数据,形成各式报表,如下图中右边四个小表。
(这样表述可对?)表述不准,看图知意
image.jpg


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-23 20:03 | 显示全部楼层
附上附件: 类似数据透视的复杂合并汇总.rar (34.62 KB, 下载次数: 12)

TA的精华主题

TA的得分主题

发表于 2023-5-23 20:14 | 显示全部楼层
·遁去的一· 发表于 2023-5-23 15:32
多次测试均未通过,不是下标越界就是内存溢出,上传不了附件,太大了,你们可以自己生成100万行啊,写一 ...

楼主这代码写的挺好的呀,是不是扮猪吃老虎啊

TA的精华主题

TA的得分主题

发表于 2023-5-23 20:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
·遁去的一· 发表于 2023-5-23 15:32
多次测试均未通过,不是下标越界就是内存溢出,上传不了附件,太大了,你们可以自己生成100万行啊,写一 ...

楼主,请用这段代码,生成100万行数据会很快,只要几秒
  1. Sub 生成100万行数据()
  2.     Dim ws As Worksheet
  3.     Dim rowCount As Long
  4.     Dim dataRange As Range
  5.     Dim i As Long
  6.    
  7.     ' 设置要操作的工作表
  8.     Set ws = ThisWorkbook.Worksheets("数据源") ' 将"Sheet1"替换为您实际的工作表名称
  9.    
  10.     ' 设置生成数据的行数
  11.     rowCount = 1000000
  12.    
  13.     ' 获取数据填充范围
  14.     Set dataRange = ws.Range("A7:A" & rowCount + 1) ' 假设数据填充范围为A2:A1000001
  15.    
  16.     ' 生成数据
  17.     ReDim arr(1 To rowCount)
  18.     For i = 1 To rowCount
  19.         arr(i) = "数据" & i ' 根据需求生成相应的数据
  20.     Next i
  21.     dataRange = WorksheetFunction.Transpose(arr)
  22.     MsgBox "生成100万行数据完成。"
  23. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-23 21:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
吴中泉 发表于 2023-5-23 19:58
经过调整,实现了以任意列作为行标题统计数据,形成各式报表,如下图中右边四个小表。
(这样表述可对 ...

比我要求的更多功能 了,大神居然用WPS
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 07:45 , Processed in 0.039800 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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