ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 双重透视

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-16 18:14 | 显示全部楼层 |阅读模式
老师!有表,含2条件并有2列数据,需整理成双重透视。轻轻老师帮忙看看,

二重透视表.zip

13.98 KB, 下载次数: 41

TA的精华主题

TA的得分主题

发表于 2024-9-16 18:49 | 显示全部楼层
本帖最后由 quqiyuan 于 2024-9-16 19:52 编辑

参与一下,仅供参考。。。

image.png

image.png

二重透视表.zip

19.17 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2024-9-16 18:50 | 显示全部楼层
代码如下。。。
Sub test()
    Dim d As New Dictionary
    Dim brr(1 To 10000, 1 To 13)
    Dim Brow, Bcol
    Dim arr, x, k, kk, kkk
    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)
                d(s)(ss) = sss
            Next
        Next
        biaoti = .[h1:t2]
        For i = 2 To UBound(biaoti, 2)
            If biaoti(1, i) = "" Then biaoti(1, i) = biaoti(1, i - 1)
        Next
        For Each k In d.Keys
            x = x + 1
            brr(x, 1) = x
            brr(x, 2) = k
            Key = d(k).Keys
            For Each kk In d(k).Keys
                For j = 3 To UBound(biaoti, 2)
                    brr(x, j) = d(k)(biaoti(2, j) & "|" & biaoti(1, j))
                Next
                brr(x, 8) = "=sum(rc[-1]:rc[-5])"
                brr(x, 12) = "=sum(rc[-1]:rc[-3])"
                brr(x, 13) = "=sum(rc[-1],rc[-5])"
            Next
        Next
        .[h2].CurrentRegion.Offset(2) = Empty
        .[h3].Resize(x, 13) = brr
    End With
    Set d = Nothing
    Beep
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-16 18:55 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-9-16 18:58 编辑

全表自动生成

a215f119-22f5-44cc-9b2d-90a383dbfa0e.png

二重透视表.zip

23.11 KB, 下载次数: 35

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-16 18:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
表格转换,全表自动生成
  1. Sub ykcbf()   '//2024.9.16
  2.     Application.ScreenUpdating = False
  3.     Application.DisplayAlerts = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     ReDim brr(1 To 10000, 1 To 100)
  6.     ReDim zrr(1 To 100)
  7.     m = 2: n = 2
  8.     On Error Resume Next
  9.     With Sheets("Sheet1")
  10.         r = .Cells(Rows.Count, 1).End(3).Row
  11.         arr = .[a1].Resize(r, 5)
  12.     End With
  13.     brr(1, 1) = arr(1, 1): brr(1, 2) = arr(1, 2)
  14.     For j = 4 To UBound(arr, 2)
  15.         x = x + 1
  16.         For i = 2 To UBound(arr)
  17.             s = arr(i, 2)
  18.             If Not d.Exists(s) Then
  19.                 m = m + 1
  20.                 d(s) = m
  21.                 brr(m, 1) = Format(m - 2, "00")
  22.                 brr(m, 2) = s
  23.             End If
  24.             r = d(arr(i, 2))
  25.             If arr(i, j) <> Empty Then
  26.                 s = arr(1, j) & "|" & arr(i, 3)
  27.                 If Not d.Exists(s) Then
  28.                     n = n + 1
  29.                     d(s) = n
  30.                     brr(1, n) = arr(1, j)
  31.                     brr(2, n) = arr(i, 3)
  32.                 End If
  33.                 c = d(arr(1, j) & "|" & arr(i, 3))
  34.                 brr(r, c) = brr(r, c) + arr(i, j)
  35.             End If
  36.         Next
  37.         n = n + 1
  38.         d(arr(1, j) & "|" & "小计") = n
  39.         brr(1, n) = arr(1, j): brr(2, n) = "小计"
  40.         zrr(x) = n
  41.     Next
  42.     n = n + 1
  43.     brr(1, n) = "合计"
  44.     With Sheets("Sheet2")
  45.         .UsedRange.Clear
  46.         .Cells.Interior.ColorIndex = 0
  47.         .[a1].Resize(1, n).Interior.Color = 49407
  48.         .[a3].Resize(m - 2, 1).Interior.Color = 5296274
  49.         .Columns(1).NumberFormatLocal = "@"
  50.         With .[a1].Resize(m + 1, n)
  51.             .Value = brr
  52.             .Borders.LineStyle = 1
  53.             .HorizontalAlignment = xlCenter
  54.             .VerticalAlignment = xlCenter
  55.             With .Font
  56.                 .Name = "微软雅黑"
  57.                 .Size = 11
  58.             End With
  59.         End With
  60.         .[a1].Resize(2).Merge
  61.         .[b1].Resize(2).Merge
  62.         .Cells(1, n).Resize(2).Merge
  63.         .Cells(1, 3).Resize(, zrr(1) - 2).Merge
  64.         .Cells(1, zrr(1) + 1).Resize(, zrr(2) - zrr(1)).Merge
  65.         For i = 3 To m
  66.             .Cells(i, zrr(1)) = Application.Sum(.Cells(i, 3).Resize(, zrr(1) - 3))
  67.             .Cells(i, zrr(2)) = Application.Sum(.Cells(i, zrr(1) + 1).Resize(, zrr(2) - zrr(1) - 1))
  68.             .Cells(i, n) = .Cells(i, zrr(1)) + .Cells(i, zrr(2))
  69.         Next
  70.         m = m + 1
  71.         .Cells(m, 1) = "合计": .Cells(m, 1).Resize(, 2).Merge
  72.         For j = 3 To n
  73.             .Cells(m, j) = Application.Sum(.Cells(3, j).Resize(m - 3))
  74.         Next
  75.     End With
  76.     Set d = Nothing
  77.     Application.ScreenUpdating = True
  78.     MsgBox "OK!"
  79. End Sub

复制代码


评分

4

查看全部评分

TA的精华主题

TA的得分主题

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


就是一个体力活。。。。。。。。。

  1. let
  2.   源 = Excel.CurrentWorkbook(){[Name = "表1"]}[Content],
  3.   Unpivot = Table.UnpivotOtherColumns(源, {"姓名", "险种"}, "属性", "值"),
  4.   Com = Table.CombineColumns(
  5.     Unpivot,
  6.     {"属性", "险种"},
  7.     Combiner.CombineTextByDelimiter("-", QuoteStyle.None),
  8.     "已合并"
  9.   ),
  10.   Pivot = Table.Pivot(Com, List.Distinct(Com[已合并]), "已合并", "值", List.Sum),
  11.   Tab1 = Table.DemoteHeaders(Pivot),
  12.   Tab2 = List.Accumulate(
  13.     List.Skip(Table.ColumnNames(Tab1)),
  14.     Tab1,
  15.     (x, y) =>
  16.       Table.ReplaceValue(
  17.         x,
  18.         "",
  19.         "",
  20.         (o, p, q) => if Text.Contains(Text.From(o), "-") then Text.Split(o, "-") else o,
  21.         {y}
  22.       )
  23.   ),
  24.   Tab3 = Table.TransformColumns(
  25.     Table.Transpose(Tab2),
  26.     {"Column1", each if _ = "姓名" then {_, ""} else _}
  27.   ),
  28.   Tran = Table.TransformColumns(
  29.     Tab3,
  30.     {"Column1", each Text.Combine(List.Transform(_, Text.From), "-"), type text}
  31.   ),
  32.   Tab4 = Table.SplitColumn(
  33.     Tran,
  34.     "Column1",
  35.     Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv),
  36.     {"Column1.1", "Column1.2"}
  37.   ),
  38.   Group1 = Table.Group(Tab4, List.First(Table.ColumnNames(Tab4)), {"Data", each _})[Data],
  39.   Sum1 = {List.First(Group1)}
  40.     & List.Transform(
  41.       List.Skip(Group1),
  42.       each [
  43.         a = Table.Group(
  44.           _,
  45.           {},
  46.           List.Transform(
  47.             List.Skip(Table.ColumnNames(_)),
  48.             (x) => {
  49.               x,
  50.               (y) =>
  51.                 try
  52.                   List.Sum(List.Transform(Table.Column(_, x), (z) => Number.From(z)))
  53.                 otherwise
  54.                   "小计"
  55.             }
  56.           )
  57.         ),
  58.         b = _ & a
  59.       ][b]
  60.     ),
  61.   Tab5 = Table.Combine(List.Transform(List.Skip(Sum1), each Table.LastN(_, 1))),
  62.   Sum2 = Table.Group(
  63.     Tab5,
  64.     {},
  65.     List.Transform(
  66.       List.Skip(Table.ColumnNames(Tab5)),
  67.       each {_, (x) => try List.Sum(Table.Column(Tab5, _)) otherwise "合计"}
  68.     )
  69.   ),
  70.   Tab6 = Table.Combine(Sum1 & {Sum2}),
  71.   Tran2 = Table.Transpose(Tab6),
  72.   Res = Tran2
  73.     & Table.Group(
  74.       Tran2,
  75.       {},
  76.       List.Transform(
  77.         Table.ColumnNames(Tran2),
  78.         each {_, (x) => try List.Sum(List.Skip(Table.Column(Tran2, _), 2)) otherwise "总计"}
  79.       )
  80.     )
  81. in
  82.   Res
复制代码


1.png

TA的精华主题

TA的得分主题

发表于 2024-9-16 19:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
审核能审个啥出来?

用PQ解决,是这个效果吗??????????
1.png

9-16-3.rar

19.64 KB, 下载次数: 11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-16 20:25 | 显示全部楼层
  1. Sub qs()
  2. Dim arr, i, dic
  3. Set dic = CreateObject("scripting.dictionary")
  4. With Sheet4
  5.     arr = .Range("a1").CurrentRegion.Value
  6.     For c = 4 To 5
  7.         s = arr(1, c)
  8.         For i = 2 To UBound(arr)
  9.             s2 = arr(i, 2): s3 = arr(i, 3)
  10.             If Not dic.Exists(s) Then Set dic(s) = CreateObject("scripting.dictionary")
  11.             If Not dic(s).Exists(s2) Then Set dic(s)(s2) = CreateObject("scripting.dictionary")
  12.             dic(s)(s2)(s3) = arr(i, c)
  13.         Next i
  14.     Next c
  15.     brr = .Range("i1:n8").Value
  16.     For j = 2 To 6
  17.         For i = 3 To 8
  18.             brr(i, j) = dic(brr(1, 2))(brr(i, 1))(brr(2, j))
  19.         Next i
  20.     Next j
  21.     For i = 3 To 8
  22.         .Range("i" & i).Resize(1, 6) = Application.Index(brr, i, 0)
  23.     Next i
  24.     crr = .Range("p1:r8").Value
  25.     For j = 1 To 3
  26.         For i = 3 To 8
  27.             crr(i, j) = dic(crr(1, 1))(brr(i, 1))(crr(2, j))
  28.         Next
  29.     Next
  30.     For i = 3 To 8
  31.         .Range("p" & i).Resize(1, 3) = Application.Index(crr, i, 0)
  32.     Next i
  33. End With
  34. Set dic = Nothing
  35. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-16 20:26 | 显示全部楼层

TA的精华主题

TA的得分主题

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

二重透视表.rar

15.33 KB, 下载次数: 14

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-1-15 18:16 , Processed in 0.033084 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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