ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 如何二维表转成交叉表?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-10-21 08:19 | 显示全部楼层
收藏 学习 。

TA的精华主题

TA的得分主题

发表于 2015-10-21 13:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
个人感觉3楼的好理解,容易改造他用。可取消二个编号列,精简数组规模。现加了注释,如下
Sub jcb()
    Dim arr, jarr
    Dim i As Long, j As Long, m As Long, n As Long
    Dim d As Object
    Dim dc As Object
    Dim Jrng As Range
    With ThisWorkbook.Sheets("sheet1")
        arr = .Range("a3:e" & .Range("a65536").End(xlUp).Row)       'arr(a,b)  A:行,B:列
        Set Jrng = .Range("n3")                                     '结果存放地址,左上角
    End With
    ReDim jarr(1 To UBound(arr), 1 To 200)    '假设地址不超200个
    Set d = CreateObject("Scripting.Dictionary")
    Set dc = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(arr)                                    '处理每一行
        If Not d.exists(arr(i, 1)) Then                         '字典d里 没有 编号
            m = m + 1                                           '不重复的行数
            d(arr(i, 1)) = m                                    '行字典d(编号) 计数m
            d(arr(i, 1) & "r") = arr(i, 5)                      '字典d(编号r) 统计数
            jarr(m + 2, 1) = arr(i, 1)                          'jarr(m + 2, 1)     结果数组(行,列) 每行第一列,不含前二行
     '       jarr(m + 2, 2) = arr(i, 2)                          'jarr(m + 2, 2)     结果数组(行,列) 每行第二列,不含前二行
            If Not dc.exists(arr(i, 3)) Then                    '处理每一列
                n = n + 1                                       '字典d里 没有 编号
                dc(arr(i, 3)) = n                               '列字典dc(编号) 计数n
                dc(arr(i, 3) & "c") = arr(i, 5)                 '列字典dc(编号r) 统计数
                jarr(1, n + 2) = arr(i, 3)                      'jarr(1, n + 2)     结果数组jarr(行,列)每列第一行,不含前二列
     '           jarr(2, n + 2) = arr(i, 4)                      'jarr(2, n + 2)     结果数组jarr(行,列)每列第二行,不含前二列
                jarr(m + 2, n + 2) = arr(i, 5)                  'jarr(m + 2, n + 2)  结果数组jarr(行,列)每元素值,不含前二行,不含前二列
            Else
                dc(arr(i, 3) & "c") = dc(arr(i, 3) & "c") + arr(i, 5)   '列字典 已有 统计值 累加
                jarr(m + 2, dc(arr(i, 3)) + 2) = arr(i, 5)              '列合计值   累加
            End If
        Else
            d(arr(i, 1) & "r") = d(arr(i, 1) & "r") + arr(i, 5)     '行字典 已有 统计值 累加
            If Not dc.exists(arr(i, 3)) Then
                n = n + 1
                dc(arr(i, 3)) = n
                dc(arr(i, 3) & "c") = arr(i, 5)
                jarr(1, n + 2) = arr(i, 3)
       '         jarr(2, n + 2) = arr(i, 4)
                jarr(m + 2, n + 2) = arr(i, 5)
            Else
                dc(arr(i, 3) & "c") = dc(arr(i, 3) & "c") + arr(i, 5)
                jarr(d(arr(i, 1)) + 2, dc(arr(i, 3)) + 2) = arr(i, 5)
            End If
        End If
    Next
    For i = 1 To m                                                 '处理每一行
        jarr(i + 2, n + 3) = d(jarr(i + 2, 1) & "r")               'jarr(m+2,n+3) 每行右侧合计
    Next
    For i = 1 To n
        jarr(m + 3, i + 2) = dc(jarr(1, i + 2) & "c")               '每列末行 合计
    Next
    jarr(1, n + 3) = "总计"                                         '行合计标题
    jarr(m + 3, 1) = "总计"                                         '列合计标题
    For i = 1 To m
        jarr(m + 3, n + 3) = jarr(m + 3, n + 3) + jarr(i + 2, n + 3)    '右下角统计值总计
    Next
    Jrng.Resize(m + 3, n + 3) = jarr                                '将结果 保存到 单元格区域
End Sub
对于4楼,个人数组和字典功力不足,没读懂。请高手家注解

TA的精华主题

TA的得分主题

发表于 2018-7-25 10:46 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-10 20:30 , Processed in 0.017731 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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