ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 双重透视

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-16 22:59 | 显示全部楼层
lizhipei78 发表于 2024-9-16 22:44
一维转二维,全自动生成

谢谢老师!运行后有2个问题:1是结果不对,工伤赫尔附加医疗险,个人是没有的(政策规定簿用承担)。2就是感觉运行中有几次提示,这提示可以或略的,提示了反而感觉不丝滑,能否取消。谢谢老师!花后补。

TA的精华主题

TA的得分主题

发表于 2024-9-16 23:03 | 显示全部楼层
本帖最后由 quqiyuan 于 2024-9-17 07:04 编辑
lizhipei78 发表于 2024-9-16 22:48
你这个是让人家就是固定就这么多项,少一项或者多一项,你这个都是错误的,你试删除其中一项,如养老险

可以全部生成,不过开始没想到那么多嘛,有表头就方便一点,代码短些。。。
image.png
image.png
image.png

二重透视表.zip

26.13 KB, 下载次数: 10

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-16 23:04 | 显示全部楼层
代码如下。。。
Sub test1()
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Dim d
    Dim dic
    Dim brr(1 To 10000, 1 To 100)
    Dim Brow, Bcol
    Dim arr, x, k, kk, kkk
    Set d = CreateObject("scripting.dictionary")
    Set dic = CreateObject("scripting.dictionary")
    With Sheet4
        arr = .Range("a1:e" & .Range("a65536").End(xlUp).Row)
        For i = 2 To UBound(arr)
            s = arr(i, 2)
            If Not d.Exists(s) Then Set d(s) = CreateObject("scripting.dictionary")
            For j = 4 To 5
                ss = arr(i, 3) & "|" & arr(1, j)
                sss = arr(i, j)
                If sss <> Empty Then
                    d(s)(ss) = sss
                    If Not dic.Exists(arr(1, j)) Then Set dic(arr(1, j)) = CreateObject("scripting.dictionary")
                    dic(arr(1, j))(arr(i, 3)) = ""
                End If
            Next
        Next
        brr(1, 1) = "序号": brr(1, 2) = "姓名"
        x = 2
        For Each k In d.Keys
            x = x + 1
            brr(x, 1) = x - 2
            brr(x, 2) = k
            j = 2: Sum = 0
            For Each k1 In dic.Keys
                For Each k2 In dic(k1).Keys
                    If d(k).Exists(k2 & "|" & k1) Then
                        j = j + 1
                        brr(1, j) = k1
                        brr(2, j) = k2
                        brr(x, j) = d(k)(k2 & "|" & k1)
                        Sum = Sum + brr(x, j)
                    End If
                Next
                j = j + 1
                brr(1, j) = k1
                brr(2, j) = "小计"
                brr(x, j) = "=sum(rc[-1]:rc[" & -dic(k1).Count & "])"
            Next
            brr(x, j + 1) = Sum
            brr(1, j + 1) = "合计"
            y = Application.Max(y, j + 1)
        Next
    End With
    With ThisWorkbook.Sheets("案例")
        .[a1].CurrentRegion.Clear
        .[a1].Resize(x, y) = brr
        .[a1].Resize(2, 1).Merge
        .[b1].Resize(2, 1).Merge
        .[a1].Offset(, y - 1).Resize(2, 1).Merge
        .Cells(x + 1, "a").Resize(, 2).Merge
        .Cells(x + 1, "a") = "合计"
        For i = y - 1 To 4 Step -1
            If .Cells(1, i) = .Cells(1, i - 1) Then .Range(.Cells(1, i), .Cells(1, i - 1)).Merge
        Next
        .[a1].CurrentRegion.HorizontalAlignment = xlCenter
        .[a1].CurrentRegion.Borders.LineStyle = 1
        .[a1].CurrentRegion.Font.Size = 10
        .Cells(x + 1, "c").Resize(, y - 2) = "=sum(r[-1]c:r[" & -x + 2 & "]c)"
    End With
    Set d = Nothing
    Set dic = Nothing
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Beep
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-17 00:57 | 显示全部楼层
quqiyuan 发表于 2024-9-16 23:04
代码如下。。。
Sub test1()
    Application.DisplayAlerts = False

谢谢老师!运行完美成功!我是使用者,所以知道实际情况。花后补

TA的精华主题

TA的得分主题

发表于 2024-9-17 01:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

发表于 2024-9-17 08:06 | 显示全部楼层
ddz79101 发表于 2024-9-16 22:59
谢谢老师!运行后有2个问题:1是结果不对,工伤赫尔附加医疗险,个人是没有的(政策规定簿用承担)。2就 ...

不好意思,已经更正
一维转二维9.17.rar (21.86 KB, 下载次数: 10)

TA的精华主题

TA的得分主题

发表于 2024-9-17 08:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
弄了两个,一个是删除空的项,一个是保留空的项目

一维转二维9.17.rar (25.03 KB, 下载次数: 16)

TA的精华主题

TA的得分主题

发表于 2024-9-17 13:56 | 显示全部楼层
  1. Sub qs()
  2. Application.DisplayAlerts = False
  3. Dim arr, i, dic
  4. Set dic = CreateObject("scripting.dictionary")
  5. Set d2 = CreateObject("scripting.dictionary")
  6. Set d3 = CreateObject("scripting.dictionary")
  7. With Sheet4
  8.     arr = .Range("a1").CurrentRegion.Value
  9.     For c = 4 To 5
  10.         s = arr(1, c)
  11.         
  12.         
  13.         For i = 2 To UBound(arr)
  14.             s2 = arr(i, 2): s3 = arr(i, 3)
  15.             If Not dic.Exists(s) Then Set dic(s) = CreateObject("scripting.dictionary")
  16.             If Not dic(s).Exists(s2) Then Set dic(s)(s2) = CreateObject("scripting.dictionary")
  17.             dic(s)(s2)(s3) = arr(i, c)
  18.            
  19.          If arr(i, c) <> Empty Then
  20.             If Not d2.Exists(s) Then Set d2(s) = CreateObject("scripting.dictionary")
  21.             d2(s)(s3) = ""
  22.           End If
  23.          
  24.           d3(s2) = ""
  25.         Next i
  26.     Next c
  27.     ReDim hrr(1 To 2, 1 To 13)
  28.     hrr(1, 1) = "序号": hrr(1, 2) = "姓名": hrr(1, 13) = "合计"
  29.      cc = 2
  30.     For Each dk2 In d2.Keys
  31.         For Each dk3 In d2(dk2).Keys
  32.             cc = cc + 1
  33.             hrr(1, cc) = dk2
  34.             hrr(2, cc) = dk3
  35.         Next
  36.           cc = cc + 1
  37.            hrr(1, cc) = "小计": hrr(2, cc) = "小计"
  38.     Next dk2
  39.     rw = d3.Count
  40.     ReDim brr(1 To rw, 1 To UBound(hrr, 2))
  41.     For Each k In d3.Keys
  42.         m = m + 1
  43.         brr(m, 1) = m: brr(m, 2) = k
  44.     Next
  45.     For i = 1 To m
  46.         For j = 3 To 11
  47.             If hrr(1, j) <> "小计" Then
  48.             brr(i, j) = dic(hrr(1, j))(brr(i, 2))(hrr(2, j))
  49.             End If
  50.         Next
  51.         sm1 = 0: sm2 = 0
  52.         For col = 3 To 7
  53.             sm1 = sm1 + brr(i, col)
  54.         Next
  55.         For col2 = 9 To 11
  56.         sm2 = sm2 + brr(i, col2)
  57.         Next
  58.         brr(i, 8) = sm1: brr(i, 12) = sm2
  59.         brr(i, 13) = sm1 + sm2
  60.    Next i
  61.         ReDim Err(1 To 1, 1 To 13)
  62.         Err(1, 2) = "合计"
  63.         For cl = 3 To 13
  64.             Err(1, cl) = Application.Sum(Application.Index(brr, 0, cl))
  65.         Next
  66.         .Range("h12").Resize(10000, 13).Clear
  67.         .Range("h12").Resize(2, 13) = hrr
  68.         .Range("h14").Resize(m, 13) = brr
  69.         .Range("h14").Offset(m).Resize(1, 13) = Err
  70.         With .Range("h12").CurrentRegion
  71.             .Borders.LineStyle = 1
  72.             .HorizontalAlignment = xlCenter
  73.             .VerticalAlignment = xlCenter
  74.             .NumberFormat = "0.00"
  75.         End With
  76.         .Range("h12:h13").Merge: .Range("i12:i13").Merge: .Range("t12:t13").Merge
  77.         .Range("j12:o12").Merge: .Range("p12:s12").Merge
  78. End With
  79. Set dic = Nothing: Set d2 = Nothing: Set d3 = Nothing
  80. Application.DisplayAlerts = True
  81. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-17 14:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-9-17 14:01 | 显示全部楼层
试试。。。。。。。。

二重透视表.rar

46.11 KB, 下载次数: 14

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-15 17:57 , Processed in 0.030613 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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